DBMS_BACKUP_RESTORE可用于特殊情况下的恢复
在controlfile故障时,可以利用它进恢复数据文件,DBMS_BACKUP_RESTORE可在nomount状态下进行恢复操作。
Oracle提供了一个包:DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE 包是由dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚本创建的.catproc.sql 脚本运行后会调用这两个包.所以是每个数据库都有的这个包是Oracle服务器和操作系统之间IO操作的接口.由恢复管理器直接调用。而且据说这两个脚本的功能是内建到Oracle的一些库文件中的.
由此可见,我们可以在数据库 nomount 情况下调用这些package ,来达到我们的恢复目的。在dbmsbkrs.sql 和prvtbkrs.plb 这两个脚本中有详细的说明文档
DECLARE
devtype varchar2 ( 256 );
done boolean ;
BEGIN
--分配一个设备通道,如果使用的操作系统文件,type就为空,如果是从磁带上恢复要用 "sbt_tape"
devtype:=sys.dbms_backup_restore.deviceAllocate( type => '' ,ident=> 't1' );
--表示开始恢复 ;
sys.dbms_backup_restore.restoreSetDatafile;
--指定恢复文件的目标位置
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 01 ,toname=> 'D:\ORADATA\HUI99DB\SYSTEM01.DBF' );
--指定备份集的位置
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'F:\rmanbackup\HUI99DB_FULL_0_3367236198_20100808_S90_P1.RBAK' , params=> null );
--释放通道
sys.dbms_backup_restore.deviceDeallocate;
END ;
/
--Include the current SPFILE in the backup set.
exec dbms_backup_restore.backupspfile ;
-- 恢复参数文件,如果指定 sfname 还可以恢成 spfile ;
-- 需要在 nomount 状态下恢复,可以先启动到 DUMMY ;
-- 或者自建一个 pfile ,只要在文件里设置 db_name 即可启动实例到 nomount 状态 ( 默认情况可能出现 ORA-04031 错误,最好在 pfile里将 shared_pool_size 设置大一点的值 )
DECLARE
devtype varchar2 ( 256 );
done boolean ;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate ( type => '' ,ident=> 't1' );
sys.dbms_backup_restore.restoreSetDatafile;
sys.dbms_backup_restore.RESTORESPFILETO(pfname=>'C:\oracle\product\10.2.0\admin\hui99db\pfile\pfile.ora' );
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'F:\rmanbackup\HUI99DB_FULL_0_3367236198_20100808_S91_P1.RBAK' , params=> null );
sys.dbms_backup_restore.deviceDeallocate;
END ;
/
-- 恢复控制文件
DECLARE
devtype varchar2 ( 256 );
done boolean ;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate ( type => '' ,ident=> 't1' );
sys.dbms_backup_restore.restoreSetDatafile;
sys.dbms_backup_restore.restorecontrolfileto(sfname=> 'D:\ORADATA\HUI99DB\controlfile01.ora' );
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'F:\rmanbackup\HUI99DB_FULL_0_3367236198_20100808_S91_P1.RBAK' , params=> null );
sys.dbms_backup_restore.deviceDeallocate;
END ;
/
-- 恢复 0 级备份语句
DECLARE
devtype varchar2 ( 256 );
done boolean ;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate( type => '' ,ident=> 't1' );
sys.dbms_backup_restore.restoreSetDatafile;
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 01 ,toname=> 'D:\ORADATA\HUI99DB\SYSTEM01.DBF' );
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 02 ,toname=> 'D:\ORADATA\HUI99DB\UNDOTBS01.DBF' );
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 03 ,toname=> 'D:\ORADATA\HUI99DB\SYSAUX01.DBF' );
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 04 ,toname=> 'D:\ORADATA\HUI99DB\USERS01.DBF' );
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 05 ,toname=> 'D:\ORADATA\HUI99DB\MALLTEST.DBF' );
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 06 ,toname=> 'D:\ORADATA\HUI99DB\MALLTESTPART.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 07 ,toname=> 'D:\ORADATA\HUI99DB\MALLTESTIDX.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 08 ,toname=> 'D:\ORADATA\HUI99DB\MALLIDXSPACE.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 09 ,toname=>'D:\ORADATA\HUI99DB\MALLPARTSPACE.DBF' );
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=> 10 ,toname=> 'D:\ORADATA\HUI99DB\MALLSPACE.DBF' );
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'F:\rmanbackup\HUI99DB_FULL_0_3367236198_20100808_S90_P1.RBAK' , params=> null );
sys.dbms_backup_restore.deviceDeallocate;
END ;
/
-- 恢复增量备份
DECLARE
devtype varchar2 ( 256 );
done boolean ;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate ( type => '' ,ident=> 't1' );
sys.dbms_backup_restore.applySetDatafile;
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 01 ,toname=> 'D:\ORADATA\HUI99DB\SYSTEM01.DBF' );
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 02 ,toname=> 'D:\ORADATA\HUI99DB\UNDOTBS01.DBF' );
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 03 ,toname=> 'D:\ORADATA\HUI99DB\SYSAUX01.DBF' );
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 04 ,toname=> 'D:\ORADATA\HUI99DB\USERS01.DBF' );
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 05 ,toname=> 'D:\ORADATA\HUI99DB\MALLTEST.DBF' );
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 06 ,toname=> 'D:\ORADATA\HUI99DB\MALLTESTPART.DBF');
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 07 ,toname=> 'D:\ORADATA\HUI99DB\MALLTESTIDX.DBF' );
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 08 ,toname=> 'D:\ORADATA\HUI99DB\MALLIDXSPACE.DBF');
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 09 ,toname=> 'D:\ORADATA\HUI99DB\MALLPARTSPACE.DBF');
sys.dbms_backup_restore.applyDatafileTo(dfnumber=> 10 ,toname=> 'D:\ORADATA\HUI99DB\MALLSPACE.DBF' );
sys.dbms_backup_restore.applyBackupPiece(done=>done,handle=>'F:\rmanbackup\HUI99DB_DIF_2_3367236198_20100809_S94_P1.RBAK' , params=> null );
sys.dbms_backup_restore.deviceDeallocate;
END ;
/
-- 恢复归档日志备份
DECLARE
devtype varchar2 ( 256 );
done boolean ;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate ( type => '' ,ident=> 't1' );
sys.dbms_backup_restore.restoreSetArchivedLog;
sys.dbms_backup_restore.restoreArchivedLog( thread => 1 , sequence => 107 );
/* sys.dbms_backup_restore.RESTOREARCHIVEDLOGRANGE(low_change=>0,high_change=>);*/
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'F:\rmanbackup\HUI99DB_ARC_12_3367236198_20100810_S96_P1.RBAK' , params=> null );
sys.dbms_backup_restore.deviceDeallocate;
END ;
/
全库的恢复
Recover database using backup controlfile until cancel;
打开数据库
Alter database open resetlogs;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9932141/viewspace-677384/
,如需转载,请注明出处,否则将追究法律责任。