2.2 DBMS_BACKUP_RESTORE包的使用
rmanRestoreDatafiles.sql脚本是通过系统包dbms_backup_restore来恢复备份集中的文件,从而实现数据恢复,其主要内容如下:
set verify off;
set echo off;
set serveroutput on;
select TO_CHAR(systimestamp,'YYYYMMDD HH:MI:SS') from dual;
variable devicename varchar2(255);
declare
omfname varchar2(512) := NULL;
done boolean;
begin
dbms_output.put_line(' ');
dbms_output.put_line(' Allocating device.... ');
dbms_output.put_line(' Specifying datafiles... ');
:devicename := dbms_backup_restore.deviceAllocate;
dbms_output.put_line(' Specifing datafiles... ');
dbms_backup_restore.restoreSetDataFile;
dbms_backup_restore.restoreDataFileTo(1, 'D:\Oracle\oradata\eygle\SYSTEM01.DBF', 0, 'SYSTEM');
dbms_backup_restore.restoreDataFileTo(2, 'D:\Oracle\oradata\eygle\SYSAUX01.DBF', 0, 'SYSAUX');
dbms_backup_restore.restoreDataFileTo(3, 'D:\Oracle\oradata\eygle\UNDOTBS01.DBF', 0, 'UNDOTBS1');
dbms_backup_restore.restoreDataFileTo(4, 'D:\Oracle\oradata\eygle\USERS01.DBF', 0, 'USERS');
dbms_output.put_line(' Restoring ... ');
dbms_backup_restore.restoreBackupPiece('D:\Oracle\11.2.0\assistants\dbca\templates\ Seed_Database.dfb', done); --这就是种子数据库
if done then
dbms_output.put_line(' Restore done.');
else
dbms_output.put_line(' ORA-XXXX: Restore failed ');
end if;
dbms_backup_restore.deviceDeallocate;
end;
/
select TO_CHAR(systimestamp,'YYYYMMDD HH:MI:SS') from dual;
在这里的恢复过程,用到了dbms_backup_restore包,通过这个包对种子数据库的备份集文件Seed_Database.dfb进行恢复。
当通过RMAN进行数据库备份时,RMAN会将多个数据文件写出到一个或多个备份文件(称为备份集)中,RMAN的相关的备份信息或者存储在控制文件中,或者存储在RMAN的专用目录数据库(Catalog)中,如果 RMAN 的备份信息丢失,那么通常备份集中的文件是没有办法读取出来的,其他工具无法识别RMAN的备份集文件;而dbms_backup_restore就是针对这种情况提供的一种解决方案,dbms_backup_restore可以在数据库实例NOMOUNT状态下调用,直接从备份集中读取数据文件,功能十分强大。
dbms_backup_restore包由dbmsbkrs.sql和prvtbkrs.plb这两个脚本创建,创建数据库时执行的 catproc.sql 脚本会调用这两个脚本以创建包,这些脚本文件可以在$ORACLE_HOME/rdbms/admin目录下找到,脚本文件中对包的内容有详细的介绍。
在Oracle 12c中,rmanRestoreDatafiles.sql脚本放弃了dbms_backup_restore,改用RMAN,通过Catalog命令将备份集注册到控制文件中,然后执行恢复:
connect target sys/&1;
CATALOG START WITH
'/u01/app/oracle/product/12c/dbhome_1/assistants/dbca/templates// Seed_Database.dfb' NOPROMPT ;
RUN {
set newname for datafile 3 to '/u01/app/oracle/oradata/EYGLE/undotbs01.dbf' ;
set newname for datafile 2 to '/u01/app/oracle/oradata/EYGLE/sysaux01.dbf' ;
set newname for datafile 1 to '/u01/app/oracle/oradata/EYGLE/system01.dbf' ;
set newname for datafile 4 to '/u01/app/oracle/oradata/EYGLE/users01.dbf' ;
restore datafile 3;
restore datafile 2;
restore datafile 1;
restore datafile 4; }
这一变化是向标准方式的转变,是建库过程中的一个标准化提升。