RMAN除了支持交互式和批处理式,还支持一种PIPE的接口,通过这种PIPE接口,可以在ORACLE中将各种命令发送给RMAN。
今天研究了一下,发现使用起来还是比较简单方便的:
首先,以PIPE方式启动RMAN,其中P1是管道的名称:
F:>RMAN PIPE P1 TARGET /@TEST NOCATALOG
恢复管理器: 版本9.2.0.4.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.
以PIPE方式启动RMAN,RMAN一直处于运行状态,并等待从管道中发送来的命令。而且,RMAN的输出也不会打印到屏幕上,而是在管道上发送。
然后就可以通过DBMS_PIPE包给RMAN发送命令,并接收返回消息了。和RMAN进行交互的管道名称为ORA$RMAN_pipename_IN和ORA$RMAN_pipename_OUT。其中pipename就是RMAN命令里包含的管道名称。
SQL> SET SERVEROUT ON SIZE 1000000
SQL> DECLARE
2 V_INPUT VARCHAR2(32767) := 'SHOW ALL;';
3 V_OUT NUMBER;
4 BEGIN
5 DBMS_PIPE.PACK_MESSAGE(V_INPUT);
6 V_OUT := DBMS_PIPE.SEND_MESSAGE('ORA$RMAN_P1_IN');
7 DBMS_OUTPUT.PUT_LINE(V_OUT);
8 COMMIT;
9 END;
10 /
0
PL/SQL 过程已成功完成。
SQL> DECLARE
2 V_OUTPUT VARCHAR2(32767);
3 V_OUT NUMBER := 0;
4 BEGIN
5 WHILE (V_OUT = 0) LOOP
6 V_OUT := DBMS_PIPE.RECEIVE_MESSAGE('ORA$RMAN_P1_OUT', 5);
7 IF V_OUT = 0 THEN
8 DBMS_PIPE.UNPACK_MESSAGE(V_OUTPUT);
9 DBMS_OUTPUT.PUT_LINE(V_OUTPUT);
10 END IF;
11 END LOOP;
12 COMMIT;
13 END;
14 /
RMAN 配置参数为:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'F:ORACLEORACLE920DATABASESNCFTEST.ORA'; # default
RMAN-00572: waiting for dbms_pipe input
PL/SQL 过程已成功完成。
通过DBMS_PIPE包就可以RMAN进行交互了,下面让RMAN执行数据库的全备:
SQL> DECLARE
2 V_INPUT VARCHAR2(32767) := 'BACKUP DATABASE;';
3 V_OUT NUMBER;
4 BEGIN
5 DBMS_PIPE.PACK_MESSAGE(V_INPUT);
6 V_OUT := DBMS_PIPE.SEND_MESSAGE('ORA$RMAN_P1_IN');
7 DBMS_OUTPUT.PUT_LINE(V_OUT);
8 COMMIT;
9 END;
10 /
0
PL/SQL 过程已成功完成。
SQL> DECLARE
www.ixdba.net
2 V_OUTPUT VARCHAR2(32767);
3 V_OUT NUMBER := 0;
4 BEGIN
5 WHILE (V_OUT = 0) LOOP
6 V_OUT := DBMS_PIPE.RECEIVE_MESSAGE('ORA$RMAN_P1_OUT', 5);
7 IF V_OUT = 0 THEN
8 DBMS_PIPE.UNPACK_MESSAGE(V_OUTPUT);
9 DBMS_OUTPUT.PUT_LINE(V_OUTPUT);
10 END IF;
11 END LOOP;
12 COMMIT;
13 END;
14 /
启动 backup 于 02-4月 -06
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=F:ORACLEORADATATESTSYSTEM01.DBF
输入数据文件 fno=00002 name=F:ORACLEORADATATESTUNDOTBS01.DBF
输入数据文件 fno=00006 name=F:ORACLEORADATATESTYANGTK01.DBF
输入数据文件 fno=00003 name=F:ORACLEORADATATESTINDX01.DBF