Oracle 数据库复制常用脚本

Oracle DB执行闪回数据库 • 配置闪回数据库 • 执行闪回数据库操作 • 监视闪回数据库     闪回数据库 闪回数据库操作: • 作用类似于数据库的倒带按钮 • 可以在用户造成了逻辑数据损坏的情况下使用   闪回数据库 使用闪回数据库,通过还原自先前某个时间点以来发生的所有更改,可快速将数据库恢复到那个时间的状态。因为不需要还原备份,所以此操作速度很快。可以使用此功能还原导致逻辑数据 阅读详情

Oracle 数据库复制常用脚本
(石骁騑 2001年07月30日 17:30)

Oracle的数据复制是一个Oracle数据库产品中比较成熟的一项技术,它是整个分布式计算解决方案的一个重要组成部分。对于具有复制环境的数据库系统,和Oracle DBA一样,同样要有一个人来专门负责维护Oracle的数据复制问题,称之为Oracle Replication Administrator(Oracle复制管理员)。本文就Oracle数据复制中复制管理员经常关心的一些关于复制系统的问题,编写了不同的存储过程。当然,通过Oracle提供的复制管理器也可以达到这些目的,但在实际应用中,Oracle复制管理器具有不灵活,速度慢,同时我们不能对其查询结果进行随意控制等等的缺点。

一、查看Oracle8x延迟事务队列调用及调用个数
推(push)一个大的延迟事务(Deferred Transactions)队列是非常慢的。一个常见的问题就是一个事务中含有非常多的调用(calls)。如果系统检测到一个错误,如ora-01403(数据未找到错误),也就是我们常说的检测到冲突,而且没有冲突消除方法,写到deferror错误表和回滚事务的时间就会更长,事务中如果调用calls很多,则消耗在任何一个调用的时间就会以指数形式增长。

对于数据复制中每个事务的调用数Oracel强烈建议不超过50个。下面的存储过程提供了一个快速查看延迟事务队列中的事务列表以及每个事务中调用数的脚本。输出是以传输顺序排列的,这个顺序就是事务将要传播到主节点的顺序。这对于确定传播中的延迟以及挂起等是非常有帮助的。

在搭建Oracle数据复制环境中,有一个经验是值得注意的,那就是一定要设置冲突解决方案,即可使用Oracle系统提供的几种方案,也可以自己编写脚本来完成冲突处理。为什么这样说,一定要设置冲突解决方案,也许我们可以说,我们的复制环境是一个单项复制,不可能出现冲突现象。在这里我讲一个自己的亲身经历的例子来说明这个问题,在实际工作中,我搭建了一个具有15个节点的高级复制环境,一个主定义节点,14个主节点,其中14个主节点向主定义节点单向传递数据。一般来讲这种情况下不会出现冲突。但是在实际应用中,问题就出现了,其中几个节点在传输了一些数据后,就挂(hang)了起来。所有可能查找的原因到查了,始终发现不了问题的根结。最后发现是由于数据传播到远程节点后,出现了错误,而在该节点又没有设置冲突解决方案,同时出现错误的该事务又具有超过1000条的调用。其中有一条调用出错了,事务需要回滚,而这个在本地和远程节点间的回滚时间就会以几何基数增长。就出现了前面谈到的系统挂起(hang)的表现。这也就是说即是在根本不可能出现冲突的系统中,由于偶然的不定的错误进程,批量数据的处理以及没有考虑复制情况下的数据导入都可造成在传播过程中严重的性能问题,最严重的情况就是系统挂起,不能完成正常的复制工作。最简单和有效的办法就是在多路复制环境下设置一个系统确省的冲突处理方法来避免这种情况的发生。

下面这个存储过程就是在Oracle 8 环境下列出延迟事务队列中的事务和事务中调用个数的脚本,该脚本对Oracle 7 不支持,这是因为Oracle 8 和Oracle 7 的复制机制发生了变化。

存储过程调用方法:

在SQL/PLUS下,首先运行下面的设置,使存储过程的输出到屏幕上,

SET SERVEROUTPUT ON SIZE 200000
EXEC P_LIST_TRANSACTIONS(ORA_SJJK);

其中,存储过程的参数as_destination为所要查看的事务传播到目的节点的延迟队列,为数据库联接(DBLINK)名。

如果我们看到一个事务具有很多的调用(超过50个),这个事务很可能就是造成延迟事务队列推过程延迟甚至是挂起的原因。

附:存储过程脚本:下载该脚本

CREATE OR REPLACE PROCEDURE REPADMIN.P_LIST_TRANSACTION(as_destination in VARCHAR2) IS
local_node VARCHAR2(128);
remote_node VARCHAR2(128);
last_scn NUMBER;
last_tid VARCHAR2(22);
last_tdb VARCHAR2(128);
cnt NUMBER;

CURSOR c(last_delivered NUMBER, last_tid VARCHAR2, last_tdb VARCHAR2) IS
select cscn, enq_tid,
dscn, DECODE(c.recipient_key, 0, 'D', 'R')
from system.def$_aqcall c where
(c.cscn >= last_delivered)
and ((c.cscn > last_delivered) or (c.enq_tid > last_tid))
and (
( c.recipient_key = 0
and exists ( select /*+ index(cd def$_calldest_primary) */ null
from system.def$_calldest cd
where cd.enq_tid = c.enq_tid
and cd.dblink = remote_node ) )
or ( c.recipient_key > 0
and ( ( exists (
select null from system.repcat$_repprop P
where P.dblink = remote_node
and P.how = 1
and P.recipient_key = c.recipient_key
and ((P.delivery_order is NULL)
or (P.delivery_order < c.cscn))))
or ( exists
( select /*+ ordered use_nl(rp) */ null
from system.def$_aqcall cc, system.repcat$_repprop rp
where cc.enq_tid = c.enq_tid
and cc.cscn is null
and rp.recipient_key = cc.recipient_key
and rp.how = 1
and rp.dblink = remote_node
and ((rp.delivery_order is NULL)
or (rp.delivery_order < c.cscn)))))))
order by c.cscn, c.enq_tid;

BEGIN
SELECT NLS_UPPER(global_name) INTO local_node FROM global_name;
SELECT dblink INTO remote_node from deftrandest
WHERE dblink LIKE UPPER (as_destination||'%') AND ROWNUM < 2;
IF (remote_node IS NULL) THEN
DBMS_OUTPUT.PUT_LINE ('不能确定目标节点,输入参数有误!');
RETURN;
ELSE
DBMS_OUTPUT.PUT_LINE ('延迟事务目标节点为: '||remote_node);
DBMS_OUTPUT.PUT_LINE ('-------------------------------------------');
END IF;
SELECT last_delivered, last_enq_tid, dblink
INTO last_scn, last_tid, last_tdb
FROM system.def$_destination
WHERE dblink = remote_node;

FOR R IN C(last_scn,last_tid,last_tdb) LOOP
SELECT count(*) INTO cnt FROM system.def$_aqcall WHERE enq_tid = r.enq_tid;
DBMS_OUTPUT.PUT_LINE ('延迟事务 ID='||r.enq_tid||' 调用个数='||to_char(cnt));
END LOOP;
END;
/
 

二、Oracle 8高级复制环境设置问题诊断脚本

要保证搭建的一个高级复制环境工作,必须保证所有的复制对象处于正常状态,对于一个高级复制环境,要检查一个复制环境中是否所有对象均处于正常工作状态,需要检查不同的系统字典对象,包括复制组对象,复制对象,复制方案对象等等。如果搭建的这个高级复制环境包含很多节点,每个节点又包含几个复制方案(schema)以及每个方案又包含多个复制对象,则完成一遍检查需要作很多的重复工作,这里针对这个问题,编写了一个复制设置问题诊断包,只有运行该包中相应的过程,即可完成对上面提到的相关对象的诊断,给出相应诊断结果。

运行方法是,在SQL/PLUS环境下,

SQL> spool <文件名>
SQL> set serveroutput on
SQL> exec rep_diag.rep_diag;

这里强调一点,运行该包的用户,必须具有对系统字典表dba_repschema、dba_diagnose、dba_repcat以及dba_repcatlog的检索(select)权限,当然,复制管理员(RepAdmin)用户是均有这些权限的。

附:高级复制环境设置问题诊断包脚本。下载该脚本

CREATE OR REPLACE PACKAGE REP_DIAG IS
PROCEDURE REP_DIAG;
PROCEDURE REP_SCHEMA;
PROCEDURE REP_OBJECT;
PROCEDURE REP_ERROR;
PROCEDURE REP_STAT;
END REP_DIAG;
/

CREATE OR REPLACE PACKAGE BODY REP_DIAG IS
PROCEDURE REP_DIAG IS
BEGIN
        REP_SCHEMA;
        REP_OBJECT;
        REP_ERROR;
        REP_STAT;       
END REP_DIAG;

PROCEDURE REP_SCHEMA AS
   CURSOR C_SCHEMA IS SELECT SNAME, DBLINK, MASTERDEF
                FROM SYS.DBA_REPSCHEMA;
BEGIN
        DBMS_OUTPUT.PUT_LINE('复制方案明细信息');
        DBMS_OUTPUT.PUT_LINE('-------------------------');
        FOR T_SCHEMA IN C_SCHEMA LOOP
                DBMS_OUTPUT.PUT_LINE('方案名称:    '||T_SCHEMA.SNAME);
                DBMS_OUTPUT.PUT_LINE('是否为主定义节点: '||T_SCHEMA.MASTERDEF);
                DBMS_OUTPUT.PUT_LINE('数据库联接名称:    '||T_SCHEMA.DBLINK);
                DBMS_OUTPUT.PUT_LINE('.');
        END LOOP;
END REP_SCHEMA;

PROCEDURE REP_OBJECT AS
   CURSOR C_REP_OBJECT IS SELECT SNAME, ONAME, TYPE, STATUS
                FROM SYS.DBA_REPOBJECT;                
BEGIN
        DBMS_OUTPUT.PUT_LINE('            复制对象              ');
        DBMS_OUTPUT.PUT_LINE('----------------------------------');
        FOR T_REP_OBJECT IN C_REP_OBJECT LOOP
                DBMS_OUTPUT.PUT_LINE('.');
                DBMS_OUTPUT.PUT_LINE('属主: '||T_REP_OBJECT.SNAME);
                DBMS_OUTPUT.PUT_LINE('对象名称:  '||T_REP_OBJECT.ONAME);
                DBMS_OUTPUT.PUT_LINE('对象类型:  '||T_REP_OBJECT.TYPE);
                DBMS_OUTPUT.PUT_LINE('状态:       '||T_REP_OBJECT.STATUS);
                DBMS_OUTPUT.PUT_LINE('.');
        END LOOP;
END REP_OBJECT;

PROCEDURE REP_ERROR IS
        CURSOR C_REP_ERROR IS SELECT REQUEST, STATUS, MESSAGE, ERRNUM
                     FROM SYS.DBA_REPCATLOG;
BEGIN
        DBMS_OUTPUT.PUT_LINE('复制目录错误信息');
        DBMS_OUTPUT.PUT_LINE('---------------');
        FOR T_REP_ERROR IN C_REP_ERROR LOOP
                DBMS_OUTPUT.PUT_LINE('.');
                DBMS_OUTPUT.PUT_LINE('请求: '||T_REP_ERROR.REQUEST);
                DBMS_OUTPUT.PUT_LINE('状态:  '||T_REP_ERROR.STATUS);
                DBMS_OUTPUT.PUT_LINE('信息: '||T_REP_ERROR.MESSAGE);
                DBMS_OUTPUT.PUT_LINE('错误:   '||T_REP_ERROR.ERRNUM);
                DBMS_OUTPUT.PUT_LINE('.');
        END LOOP;
END REP_ERROR;

PROCEDURE REP_STAT IS
        CURSOR C_REP_STAT IS SELECT SNAME, MASTER, STATUS
                     FROM SYS.DBA_REPCAT;
BEGIN
        DBMS_OUTPUT.PUT_LINE('复制状态');
        DBMS_OUTPUT.PUT_LINE('------------------');
        FOR T_REP_STAT IN C_REP_STAT LOOP
                DBMS_OUTPUT.PUT_LINE('.');
                DBMS_OUTPUT.PUT_LINE('方案: '||T_REP_STAT.SNAME);
                DBMS_OUTPUT.PUT_LINE('是否主节点?:'||T_REP_STAT.MASTER);
                DBMS_OUTPUT.PUT_LINE('状态: '||T_REP_STAT.STATUS);
                DBMS_OUTPUT.PUT_LINE('.');
        END LOOP;
END REP_STAT;
END REP_DIAG;
/

三、列出一个延迟事务的所有调用

作为一个复制管理员,我们经常需要查看某个延迟事务中到底包含那些调用,而这些调用的参数又是什么。Oracle复制包中没有提供相应的脚本来实现该功能,通常我们的做法只能是借助于Oracle的复制管理器来查看,但是如果延迟事务很多,且没有延迟事务的调用个数也很多的话,Oracle复制管理器非常的慢,而且最重要的是我们根本无法直接操作这些数据。下面这个脚本可以列出延迟队列中的某个事务的所有调用内容,如果再对这个脚本加以改造的话,甚至可以恢复出延迟事务中的Oracle DDL语句。这对于Oracle复制管理员是非常有用的功能。

在对复制环境的管理中,还经常作这样一个工作,如果复制发生错误,将会将错误信息写入错误队列中(deferror视图),系统会显示出在一个延迟事务中错误的调用号,也可以将下面的程序加以改造,让其直接输出某个事务的某个调用。由于在很多情况下,一个事务通常含有很多的调用,将所有的都显示出来没有必要,其实我们更关心其中的某个调用。该存储过程这里就不详述,其实根据下面的这个过程改造是非常容易的。有感兴趣的也可以和我联系。

存储过程 p_list_calls可以列出一个延迟事务中的所有调用的参数类型和值,支持所有的复制类型,包括NCHAR, NVARCHAR和所有的LOB.

运行方法和前面谈到的存储过程一样,首先需要将输出定位到屏幕,

set serveroutput on size 200000

其中参数存储过程的输入参数T为延迟事务的ID号,可以通过视图deferror或者defcall得到,下面是一个典型的调用过程例子:

SQL> select * from deftran;
DEFERRED_TRAN_ID DELIVERY_ORDER D START_TIME
------------------------------ -------------- - ----------
7.0.3741 65040962 R 25-7月 -01
8.41.3747 65040963 R 25-7月 -01
6.18.3739 65040974 R 25-7月 -01
8.39.3746 65040843 R 25-7月 -01
SQL> set serveroutput on size 1000000
SQL> execute p_list_calls('7.0.3741');
调用顺序: 0
操作: DB_ZGXT.PA_REP_JB.P_REP_DJ_NSRXX_U
参数个数: 12
参数 数据类型 值
-------------------- -------------- ----------------------
01 N_NSRNM VARCHAR2 034530001
02 N_PZWH VARCHAR2 (NULL)
03 N_TBRQ DATE (NULL)
04 N_BGRQ DATE 2000-12-28 00:00:00
05 N_JBR VARCHAR2 (NULL)
06 N_FZR VARCHAR2 (NULL)
07 N_SWJGYJ VARCHAR2 (NULL)
08 N_BZ VARCHAR2 (NULL)
09 N_RYDM VARCHAR2 030811
10 N_BGLRRQ DATE 2000-12-28 14:57:01
11 N_ZHWZBM VARCHAR2 13302030000270999999
12 N_KZBZ CHAR 1
PL/SQL 过程已成功完成。

附:存储过程代码。下载该脚本

CREATE OR REPLACE PROCEDURE P_LIST_CALLS (T IN VARCHAR2) IS
ARGNO NUMBER;
ARGTYP NUMBER;
ARGFORM NUMBER;
CALLNO NUMBER;
TRANID VARCHAR2(30);
TYPDSC CHAR(15);
ROWID_VAL ROWID;
CHAR_VAL VARCHAR2(255);
NCHAR_VAL NVARCHAR2(255);
DATE_VAL DATE;
NUMBER_VAL NUMBER;
VARCHAR2_VAL VARCHAR2(2000);
NVARCHAR2_VAL NVARCHAR2(2000);
RAW_VAL RAW(255);
ARG_NAME VARCHAR2(20);
ARG_NAME_C CHAR(20);
TABLE_NAME VARCHAR2(100);
COL_NAME VARCHAR2(100);
PK_CHAR CHAR(1);

-- 延迟队列光标
CURSOR C_DEFCALL (T VARCHAR2) IS
SELECT CALLNO, DEFERRED_TRAN_ID, SCHEMANAME, PACKAGENAME, PROCNAME,ARGCOUNT
FROM DEFCALL
WHERE DEFERRED_TRAN_ID = T;

-- 获得参数名称
CURSOR C_ARG_NAME (P_SCHEMA VARCHAR2, P_PROCNAME VARCHAR2,
P_PKGNAME VARCHAR2, P_CALL_COUNT VARCHAR2) IS
SELECT ARGUMENT_NAME
FROM ALL_ARGUMENTS
WHERE OWNER = P_SCHEMA
AND PACKAGE_NAME = P_PKGNAME
AND OBJECT_NAME = P_PROCNAME
AND (OVERLOAD = (SELECT OVRLD.OVERLOAD FROM
(SELECT OVERLOAD, OBJECT_NAME, PACKAGE_NAME, MAX(POSITION) POS
FROM ALL_ARGUMENTS
WHERE OBJECT_NAME = P_PROCNAME
AND PACKAGE_NAME = P_PKGNAME
GROUP BY OVERLOAD, OBJECT_NAME, PACKAGE_NAME
) OVRLD
WHERE P_CALL_COUNT = OVRLD.POS
AND OBJECT_NAME = P_PROCNAME
AND PACKAGE_NAME = P_PKGNAME
)
OR OVERLOAD IS NULL
)
ORDER BY POSITION;
-- 该光标用来获得某个列是否为该表的主键
CURSOR PK_CURSOR (SCHEMA VARCHAR2, T_NAME VARCHAR2, COL_NAME VARCHAR2) IS
SELECT DECODE (COUNT(*),1,'*',' ')
FROM DBA_CONSTRAINTS T1, DBA_CONS_COLUMNS T2
WHERE T1.CONSTRAINT_NAME = T2.CONSTRAINT_NAME
AND T1.OWNER = T2.OWNER
AND T1.OWNER = SCHEMA
AND T1.CONSTRAINT_TYPE = 'P'
AND T1.TABLE_NAME = T_NAME
AND T2.COLUMN_NAME LIKE COL_NAME;

BEGIN

FOR C1REC IN C_DEFCALL (T) LOOP
DBMS_OUTPUT.PUT_LINE('调用顺序: ' ||C1REC.CALLNO);
DBMS_OUTPUT.PUT_LINE('操作: '||C1REC.SCHEMANAME||'.'||C1REC.PACKAGENAME||'.'||C1REC.PROCNAME);
DBMS_OUTPUT.PUT_LINE('参数个数: '||C1REC.ARGCOUNT);
DBMS_OUTPUT.PUT_LINE(' 参数 ' || ' 数据类型 ' || '值');
DBMS_OUTPUT.PUT_LINE(' ---------------- ' || '---------------- ' ||'----------------------');
ARGNO := 1;
CALLNO := C1REC.CALLNO;
TRANID := C1REC.DEFERRED_TRAN_ID;
OPEN C_ARG_NAME (C1REC.SCHEMANAME, C1REC.PROCNAME, C1REC.PACKAGENAME,C1REC.ARGCOUNT);
WHILE TRUE LOOP
IF (ARGNO > C1REC.ARGCOUNT) THEN
CLOSE C_ARG_NAME;
EXIT;
END IF;
ARGTYP := DBMS_DEFER_QUERY.GET_ARG_TYPE(CALLNO, ARGNO, TRANID);
ARGFORM := DBMS_DEFER_QUERY.GET_ARG_FORM(CALLNO, ARGNO, TRANID);
FETCH C_ARG_NAME INTO ARG_NAME;
ARG_NAME_C := ARG_NAME;
TABLE_NAME := SUBSTR(C1REC.PACKAGENAME, 1, INSTR(C1REC.PACKAGENAME, '$') - 1);
COL_NAME := SUBSTR(ARG_NAME, 1, LENGTH(ARG_NAME) - 5) || '%';
OPEN PK_CURSOR (C1REC.SCHEMANAME, TABLE_NAME, COL_NAME);
FETCH PK_CURSOR INTO PK_CHAR;
CLOSE PK_CURSOR;
IF (ARGTYP = 1 AND ARGFORM = 1) THEN
TYPDSC := 'VARCHAR2';
VARCHAR2_VAL := DBMS_DEFER_QUERY.GET_VARCHAR2_ARG(CALLNO, ARGNO,TRANID);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(VARCHAR2_VAL,'(NULL)'));
ELSIF ARGTYP = 1 AND ARGFORM = 2 THEN
TYPDSC := 'NVARCHAR2';
NVARCHAR2_VAL := DBMS_DEFER_QUERY.GET_NVARCHAR2_ARG(CALLNO, ARGNO,TRANID);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(TRANSLATE(NVARCHAR2_VAL USING CHAR_CS),'(NULL)'));
ELSIF ARGTYP = 2 THEN
TYPDSC := 'NUMBER';
NUMBER_VAL := DBMS_DEFER_QUERY.GET_NUMBER_ARG(CALLNO, ARGNO, TRANID);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(TO_CHAR(NUMBER_VAL),'(NULL)'));
ELSIF ARGTYP = 11 THEN
TYPDSC := 'ROWID';
ROWID_VAL := DBMS_DEFER_QUERY.GET_ROWID_ARG(CALLNO, ARGNO, TRANID);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(ROWID_VAL,'(NULL)'));
ELSIF ARGTYP = 12 THEN
TYPDSC := 'DATE';
DATE_VAL := DBMS_DEFER_QUERY.GET_DATE_ARG(CALLNO, ARGNO, TRANID);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(TO_CHAR(DATE_VAL,'YYYY-MM-DD HH24:MI:SS'),'(NULL)'));
ELSIF ARGTYP = 23 THEN
TYPDSC := 'RAW';
RAW_VAL := DBMS_DEFER_QUERY.GET_RAW_ARG(CALLNO, ARGNO, TRANID);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(RAW_VAL,'(NULL)'));
ELSIF ARGTYP = 96 AND ARGFORM = 1 THEN
TYPDSC := 'CHAR';
CHAR_VAL := DBMS_DEFER_QUERY.GET_CHAR_ARG(CALLNO, ARGNO, TRANID);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(CHAR_VAL,'(NULL)')||'|');
ELSIF ARGTYP = 96 AND ARGFORM = 2 THEN
TYPDSC := 'NCHAR';
NCHAR_VAL := DBMS_DEFER_QUERY.GET_NCHAR_ARG(CALLNO, ARGNO, TRANID);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(TRANSLATE(NCHAR_VAL USING CHAR_CS),'(NULL)')||'|');
ELSIF ARGTYP = 113 THEN
TYPDSC := 'BLOB';
VARCHAR2_VAL := DBMS_LOB.SUBSTR(DBMS_DEFER_QUERY.GET_BLOB_ARG(CALLNO,ARGNO, TRANID));
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(VARCHAR2_VAL,'(NULL)'));
ELSIF ARGTYP = 112 AND ARGFORM = 1 THEN
TYPDSC := 'CLOB';
VARCHAR2_VAL := DBMS_LOB.SUBSTR(DBMS_DEFER_QUERY.GET_CLOB_ARG(CALLNO,ARGNO, TRANID));
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(VARCHAR2_VAL,'(NULL)'));
ELSIF ARGTYP = 112 AND ARGFORM = 2 THEN
TYPDSC := 'NCLOB';
NVARCHAR2_VAL := DBMS_LOB.SUBSTR(DBMS_DEFER_QUERY.GET_NCLOB_ARG(CALLNO, ARGNO, TRANID));
DBMS_OUTPUT.PUT_LINE(TO_CHAR(ARGNO,'09')||PK_CHAR||ARG_NAME_C||TYPDSC||' '||NVL(TRANSLATE(NVARCHAR2_VAL USING CHAR_CS),'(NULL)'));
END IF;
ARGNO := ARGNO + 1;
END LOOP;
END LOOP;
END;
/

oracle备份脚本 阅读详情

相关推荐

oracle流复制脚本

oracle capture oracle cdc 流复制 数据迁移

oracle常用脚本

表空间 创建表空间 create tablespace ts_dev datafile ‘f:\oracle\product\10.2.0\oradata\baseorcl\dev_data.dbf’ size 100m autoextend on next 10m; 创建临时表空间: create temporary tablespace 表空间名称(如:mytempspace) tempfile 数据文件(如:'E:\oracle\product\10.2.0\oradata\orcl\temp_ta.

csdnklsdm的博客 849

Oracle数据迁移之克隆数据库

Oracle数据迁移之克隆数据库 DBA 有时需要克隆数据库以便测试备份和恢复策略。如果数据库校小,简单的 expdp/impdp 就能搞定了, 但是多数生产环境中的数据库是没法这么干的,这时就需要用到克隆数据库,本文详细克隆数据库的操作过程。

Oracle常用脚本

原文链接:https://www.cnblogs.com/sankuoshu/p/14750897.html。–Meathod2:新增数据文件,并且允许数据文件自动增长。–Meathod3:允许已存在的数据文件自动增长。–Meathod4:手工改变已存在数据文件的大小。–oracle查看被锁的表或者数据以及解锁方法。/完整倒库*****************/–Meathod1:给表空间增加数据文件。–查看表空间是否具有自动扩展的能力。–增加表空间大小的四种方法。–查看表空间使用情况。

u010741112的博客 1151

oracle数据库创建脚本

oracle数据库创建脚本 #!/bin/sh OLD_UMASK=`umask` umask 0027 mkdir -p /oradata mkdir -p /u01/app/oracle/admin/tdrb/adump mkdir -p /u01/app/oracle/admin/tdrb/dpdump mkdir -p /u01/app/oracle/admin/tdrb/pfile mkdir -p /u01/app/oracle/cfgtoollogs/dbca/tdrb mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1/dbs umask ${OLD_UMASK} ORACLE_SID=tdrb; export ORACLE_SID PATH=$ORACLE_HOME/bin:$PATH; export PATH echo You should Add this entry in the /etc/oratab: tdrb:/u01/app/oracle/product/11.2.0/dbhome_1:Y /u01/app/oracle/product/11.2.0/dbhome_1/bin/sqlplus /nolog @/u01/app/oracle/admin/tdrb/scripts/tdrb.sql

oracle批量跟新数据脚本

oracle批量跟新数据脚本,oracle批量跟新数据脚本,oracle批量跟新数据脚本。

Oracle常用语句脚本

Oracle常用的语法,建表,存储,DBLink等

m0_37873601的博客 551

基于ADS\HFSS\Matlab的平面带通发夹滤波器设计

写在最前面,前段时间完成了一个小项目,实现13.5~14GHz的带通滤波器,算是第一个微波项目,在老师、学长、各种大神的指点下,最终完成了指标,想来这段时间收获良多,想到老师教导的,有能力的话要尽可能帮助别人,以及网络上很少面向于小白的教程,于是决定把自己做这个小项目的经过,一些关键步骤,还有软件操作和公式讲解都发出来,供大家指正借鉴。由于我目前大三,刚学习电磁场、微波工程等等,技术实在有限,同时这样是我第一次发帖子,只能尽可能的将自己确认过正确的内容,步骤以及一些经验写出来,供大家借鉴。

likaifeng12138的博客 5216

ORACLE 管理员常用脚本

ORACLE 管理员常用脚本

youp121的博客 729

基于STM32F103的二维码识别项目——OV7670篇

此系列用于记录做过的项目,这篇文章介绍基于STM32F103的二维码识别项目之OV7670FIFO模块。

beyourself_he的博客 4288

maya后台批量比对maya文件层级

在cg制作过程中,为了统一制作规范,提高效率我们Pipeline都会制作一个比对层级的工具下面介绍的是maya利用batch文件进行模型与绑定和材质文件进行比对层级。 直接上代码: #!usr/bin/env python # -*- encoding: utf-8 -*- """ @author:MCC @file: compareUI @time: 2018/11/21 16:29 """ i...

CGpipelineTD 1642

【Oracle】常用、实用的SQL脚本(持续更新)

【Oracle】常用、实用的SQL脚本(持续更新) 受到一篇知乎文章启发,决定将之前用到和看过的一些SQL脚本收集下,这些脚本在工作中都比较实用,并且也常用到。脚本都是针对Oracle的。 先创建几个用来举例的表,并插入些数据 CREATE table sqltest (id int,name varchar(20),quarter int,cum int) insert into sqltest...

会飞的大象 2688

5G NR协议栈及功能1 - 总体架构与物理层

  备注:本文所有图片均来自3GPP标准,包括3GPP TS 38.300 V15.0.0 (2017-12)和3GPP TS 38.202 V15.0.0 (2017-12)等。本文主要介绍截止目前(2018年1月25日),3GPP 5G NR相关的协议内容,后期可能会有更新。   本系列共分为两部分:   1. 5G NR协议栈及功能1 - 总体架构与物理层 http://blog...

Wei Xingguang 11万+

Oracle常用脚本 Script

阅读提示:本文简单介绍Oracle常用脚本 Script 1、查看当前所有对象 SQL> select * from tab; 2、建一个和a表结构一样的空表 SQL> create table b as select * from a where 1=2; SQL> create table b(b1,b2,b3) as select a1,a2,a3 from a where

sunboy8764的专栏 630

微信服务号配置总是提示“参数错误”?我就是这样一步步查出问题的

前两天,我遇到了一个很诡异的问题:在微信服务号后台配置服务器地址时,总是提示“参数错误,请重新填写”。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1277

智联招聘Python岗位数据采集:基于API请求的校园招聘信息爬取实战

本项目开发了一个智联招聘Python岗位校园招聘数据采集系统,采用requests库直接调用API接口获取结构化数据。系统通过分析API接口结构,配置完整的请求头、Cookie和身份验证参数,实现了10页数据的批量采集。采集内容包括工作名称、薪资范围、企业信息等10个关键字段,并存储为Excel格式。项目严格遵守网络爬虫规范,合理控制请求频率,数据仅用于技术学习和就业分析。技术实现涉及API逆向工程、JSON数据处理、防御性编程等核心技能,为学生职业规划和教育机构教学改革提供数据支持。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 626

Oracle DB 复制数据库

Oracle DB 复制数据库

sdfsdkk的博客 1808

《网络安全自学教程》- 802.1x协议

802.1x协议架构,工作原理/认证流程,认证方式,MAB认证,触发认证的三种方式,EAP报文格式,EAPOL报文格式

wangyuxiang946的博客 2万+

Oracle使用DB Link连接达梦数据库

目的原有Oracle数据库使用DB Link同步到Oracle库的存储过程,因国产化信创导致目标库改为达梦数据库,调整同步方案,保证数据正常传输。方案使用Oracle提供的HS和ODBC去建立与达梦数据库的DB Link连接。(非透明网关)HS是Oracle数据库的一个基础框架,用于支持对异构数据源(非Oracle数据库)...

qq_35485206的博客 1949

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

机器学习深度学习业余选手 479

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Oracle 11gR2 使用 RMAN duplicate from active database 复制数据库

1、概要 在Oracle 10g下可以使用RMAN duplicate 命令创建一个具有不同DBID 的复制数据库。而Oracle 11G_R2 RMAN 的duplicate 有2种方法实现:       1),Activedatabase duplication       2),Backup-basedduplication    Activedatabase duplicatio

Fengg--Focus Oracle 1197

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

duplicate database 复制数据库

duplicate database 关于复制数据库的几点总结: 1、Starting with Oracle Database 12c, the version of the RMAN client, target database, and auxiliary database must be the same. 也就是说不能在不同的版本上使用复制数据库的方式 2、测试过程中,在...

lyfhehe的博客 1266

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ORACLE_OCP之Duplicating a Database-复制数据库

ORACLE_OCP之Duplicating a Database-复制数据库 文章目标: 列出复制数据库的目的 选择一种复制数据库的技术 用RMAN复制数据库 使用RMAN备份来复制数据库 根据正在运行的实例复制数据库 一、复制数据库 使用复制数据库主要用来: 测试备份和恢复过程 通过创建导出并将对象导入生产数据库来进行恢复。 复制数据库的操作过程: 使用RMAN DUPLICATE命令 在相同或单独的主机上 具有相同的内容或子集 由辅助通道执行,用于基于备份的复制 二、选择数据

XiaoHG_优快云的博客 517
上一篇: PowerBuilder 7.0实用技巧八则
下一篇: 用VC实现远程修改NT帐号
wildcatbb
博客等级 码龄25年 0粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值