深入解析Oracle:数据库的初始化
上QQ阅读APP看书,第一时间看更新

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; }

这一变化是向标准方式的转变,是建库过程中的一个标准化提升。