資料庫高階恢復

hexiaomail發表於2010-11-04
 
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部落格 ” ,連結:http://blog.itpub.net/9932141/viewspace-677384/,如需轉載,請註明出處,否則將追究法律責任。

相關文章