DBMS_BACKUP_RESTORE用於特殊情況下的恢復(轉)
DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE用於特殊情況下的恢復
一般如下:系統崩潰,rman使用控制檔案,沒有使用控制檔案自動備份,現在僅有最後一次全備(備份中包括控制檔案),以及其增量備份,規檔備份.
通常這種情況下不能使用常規RMAN來恢復,因為此全備份中備份的控制檔案中沒有包含本次的備份資訊,rman使用控制檔案備份的時候是先備份控制檔案
後備份其它資訊
PROCEDURE restoreControlfileTo(cfname IN varchar2);
一般如下:系統崩潰,rman使用控制檔案,沒有使用控制檔案自動備份,現在僅有最後一次全備(備份中包括控制檔案),以及其增量備份,規檔備份.
通常這種情況下不能使用常規RMAN來恢復,因為此全備份中備份的控制檔案中沒有包含本次的備份資訊,rman使用控制檔案備份的時候是先備份控制檔案
後備份其它資訊
背景知識
在Oracle 816 以後的版本中,Oracle提供了一個包:DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE 包是由dbmsbkrs.sql 和 prvtbkrs.plb 這兩個指令碼建立的.catproc.sql 指令碼執行後會呼叫這兩個包.所以是每個資料庫都有的這個包是Oracle伺服器和作業系統之間IO操作的介面.由恢復管理器直接呼叫。而且據說這兩個指令碼的功能是內建到Oracle的一些庫檔案中的.
在Oracle 816 以後的版本中,Oracle提供了一個包:DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE 包是由dbmsbkrs.sql 和 prvtbkrs.plb 這兩個指令碼建立的.catproc.sql 指令碼執行後會呼叫這兩個包.所以是每個資料庫都有的這個包是Oracle伺服器和作業系統之間IO操作的介面.由恢復管理器直接呼叫。而且據說這兩個指令碼的功能是內建到Oracle的一些庫檔案中的.
由此可見,我們可以在資料庫 nomount 情況下呼叫這些package ,來達到我們的恢復目的。在dbmsbkrs.sql 和prvtbkrs.plb 這兩個指令碼中有詳細的說明文件
關鍵的內容有:
FUNCTION deviceAllocate(
type IN varchar2 default NULL
,name IN varchar2 default NULL
,ident IN varchar2 default NULL
,noio IN boolean default FALSE
,params IN varchar2 default NULL )
RETURN varchar2;
type IN varchar2 default NULL
,name IN varchar2 default NULL
,ident IN varchar2 default NULL
,noio IN boolean default FALSE
,params IN varchar2 default NULL )
RETURN varchar2;
PROCEDURE restoreControlfileTo(cfname IN varchar2);
PROCEDURE restoreDataFileTo( dfnumber IN binary_integer
,toname IN varchar2 default NULL);
,toname IN varchar2 default NULL);
SQL>startup force nomount;
SQL>
DECLARE
devtype varchar2(256);
done boolean;
BEGIN
--分配一個device channel,如果使用的作業系統檔案,type就為空,如果是從磁帶上恢復要用 "sbt_tape";
devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'t1');
--指明開始restore
sys.dbms_backup_restore.restoreSetDatafile;
--指出待恢復檔案目標儲存位置;
sys.dbms_backup_restore.restoreControlfileTo(cfname=>'D:ORACLEORADATAFENETCONTROL01.CTL');
--sys.dbms_backup_restore.restoreControlfileTo(cfname=>'D:ORACLEORADATAFENETCONTROL02.CTL');
--sys.dbms_backup_restore.restoreControlfileTo(cfname=>'D:ORACLEORADATAFENETCONTROL03.CTL');
--指定備份集的位置
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:ORA9I6095222264.RMAN', params=>null);
--釋放通道
sys.dbms_backup_restore.deviceDeallocate;
END;
SQL>
DECLARE
devtype varchar2(256);
done boolean;
BEGIN
--分配一個device channel,如果使用的作業系統檔案,type就為空,如果是從磁帶上恢復要用 "sbt_tape";
devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'t1');
--指明開始restore
sys.dbms_backup_restore.restoreSetDatafile;
--指出待恢復檔案目標儲存位置;
sys.dbms_backup_restore.restoreControlfileTo(cfname=>'D:ORACLEORADATAFENETCONTROL01.CTL');
--sys.dbms_backup_restore.restoreControlfileTo(cfname=>'D:ORACLEORADATAFENETCONTROL02.CTL');
--sys.dbms_backup_restore.restoreControlfileTo(cfname=>'D:ORACLEORADATAFENETCONTROL03.CTL');
--指定備份集的位置
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:ORA9I6095222264.RMAN', params=>null);
--釋放通道
sys.dbms_backup_restore.deviceDeallocate;
END;
可以通過該語句得到file#和name的對應關係
select 'sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>' || file# ||
',toname=>' ||chr(39)|| name ||chr(39) || ');',
'sys.dbms_backup_restore.applySetDatafile(dfnumber=>' || file# ||
',toname=>' ||chr(39)|| name ||chr(39) || ');'
from v$datafile;
select 'sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>' || file# ||
',toname=>' ||chr(39)|| name ||chr(39) || ');',
'sys.dbms_backup_restore.applySetDatafile(dfnumber=>' || file# ||
',toname=>' ||chr(39)|| name ||chr(39) || ');'
from v$datafile;
在nomount狀態下執行以下語句
恢復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=>1,toname=>'D:ORACLEORADATAFENETSYSTEM01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>2,toname=>'D:ORACLEORADATAFENETUNDOTBS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>3,toname=>'D:ORACLEORADATAFENETCWMLITE01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>4,toname=>'D:ORACLEORADATAFENETDRSYS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>5,toname=>'D:ORACLEORADATAFENETEXAMPLE01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>6,toname=>'D:ORACLEORADATAFENETINDX01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>7,toname=>'D:ORACLEORADATAFENETODM01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>8,toname=>'D:ORACLEORADATAFENETTOOLS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>9,toname=>'D:ORACLEORADATAFENETUSERS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>10,toname=>'D:ORACLEORADATAFENETXDB01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>11,toname=>'D:ORACLEORADATAFENETBJIC.ORA');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>12,toname=>'D:ORACLEORADATAFENETPM_USERS.DBF');
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:ORA9I6095222264.RMAN', 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.applySetDatafile(dfnumber=>1,toname=>'D:ORACLEORADATAFENETSYSTEM01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>2,toname=>'D:ORACLEORADATAFENETUNDOTBS01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>3,toname=>'D:ORACLEORADATAFENETCWMLITE01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>4,toname=>'D:ORACLEORADATAFENETDRSYS01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>5,toname=>'D:ORACLEORADATAFENETEXAMPLE01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>6,toname=>'D:ORACLEORADATAFENETINDX01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>7,toname=>'D:ORACLEORADATAFENETODM01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>8,toname=>'D:ORACLEORADATAFENETTOOLS01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>9,toname=>'D:ORACLEORADATAFENETUSERS01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>10,toname=>'D:ORACLEORADATAFENETXDB01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>11,toname=>'D:ORACLEORADATAFENETBJIC.ORA');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>12,toname=>'D:ORACLEORADATAFENETPM_USERS.DBF');
sys.dbms_backup_restore.applyBackupPiece(done=>done,handle=>'D:ORA9I6095222264.L1', 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=>1,toname=>'D:ORACLEORADATAFENETSYSTEM01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>2,toname=>'D:ORACLEORADATAFENETUNDOTBS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>3,toname=>'D:ORACLEORADATAFENETCWMLITE01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>4,toname=>'D:ORACLEORADATAFENETDRSYS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>5,toname=>'D:ORACLEORADATAFENETEXAMPLE01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>6,toname=>'D:ORACLEORADATAFENETINDX01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>7,toname=>'D:ORACLEORADATAFENETODM01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>8,toname=>'D:ORACLEORADATAFENETTOOLS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>9,toname=>'D:ORACLEORADATAFENETUSERS01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>10,toname=>'D:ORACLEORADATAFENETXDB01.DBF');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>11,toname=>'D:ORACLEORADATAFENETBJIC.ORA');
sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>12,toname=>'D:ORACLEORADATAFENETPM_USERS.DBF');
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:ORA9I6095222264.RMAN', 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.applySetDatafile(dfnumber=>1,toname=>'D:ORACLEORADATAFENETSYSTEM01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>2,toname=>'D:ORACLEORADATAFENETUNDOTBS01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>3,toname=>'D:ORACLEORADATAFENETCWMLITE01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>4,toname=>'D:ORACLEORADATAFENETDRSYS01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>5,toname=>'D:ORACLEORADATAFENETEXAMPLE01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>6,toname=>'D:ORACLEORADATAFENETINDX01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>7,toname=>'D:ORACLEORADATAFENETODM01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>8,toname=>'D:ORACLEORADATAFENETTOOLS01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>9,toname=>'D:ORACLEORADATAFENETUSERS01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>10,toname=>'D:ORACLEORADATAFENETXDB01.DBF');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>11,toname=>'D:ORACLEORADATAFENETBJIC.ORA');
sys.dbms_backup_restore.applySetDatafile(dfnumber=>12,toname=>'D:ORACLEORADATAFENETPM_USERS.DBF');
sys.dbms_backup_restore.applyBackupPiece(done=>done,handle=>'D:ORA9I6095222264.L1', params=>null);
sys.dbms_backup_restore.deviceDeallocate
END;
恢復歸檔日誌archive log檔案
SQL>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.restoreArchivedLogRange;
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:ORA9I6095222264.arc',params=>null);
sys.dbms_backup_restore.deviceDeallocate;
END
devtype varchar2(256);
done boolean;
BEGIN
devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'T1');
sys.dbms_backup_restore.restoreSetArchivedLog;
sys.dbms_backup_restore.restoreArchivedLogRange;
sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:ORA9I6095222264.arc',params=>null);
sys.dbms_backup_restore.deviceDeallocate;
END
mount資料庫
SQL> alter database mount;
恢復資料庫到某一時間點
SQL> >recover database until time '2006-12-14 10:00:00';
啟動資料庫
SQL> alter database open resetlogs;
參考
1) DBA工作備忘錄之三:rman備份,未使用catalog,控制檔案丟失的解決辦法
作者:Fenng
日期:03-July-2004
出處:http://www.dbanotes.net
版本:1.0
SQL> alter database mount;
恢復資料庫到某一時間點
SQL> >recover database until time '2006-12-14 10:00:00';
啟動資料庫
SQL> alter database open resetlogs;
參考
1) DBA工作備忘錄之三:rman備份,未使用catalog,控制檔案丟失的解決辦法
作者:Fenng
日期:03-July-2004
出處:http://www.dbanotes.net
版本:1.0
2)Control File中備份資訊被覆蓋情況下的資料庫恢復案例
作者:Kamus' Oracle World
作者:Kamus' Oracle World
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756652/viewspace-242335/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE用於特殊情況下的恢復REST
- MySQL異常恢復之無主鍵情況下innodb資料恢復的方法MySql資料恢復
- DOM對映的特殊情況
- oracle dg 歸檔日誌恢復情況Oracle
- Oracle-無備份情況下,如何手動恢復控制檔案Oracle
- Java程式異常處理的特殊情況Java
- IOS 自動化,幾種特殊情況下 UI 元素獲取的方式iOSUI
- 【BBED】丟失歸檔檔案情況下的恢復
- setInterval 、 settimeout 、clearInterval 用法(特殊情況下代替schedule)
- ubuntu 下解決埠被佔用的情況Ubuntu
- eclipse 專案gradle無反應的幾種特殊情況EclipseGradle
- (轉)有return的情況下try catch finally的執行順
- 【伺服器資料恢復】伺服器還原了2年前的舊快照並且沒有最新備份情況下的資料恢復伺服器資料恢復
- Cirium:為什麼中國對Max機型的批准情況對於恢復波音公司的交付份額至關重要
- 測試在丟失歸檔日誌的情況下,跳過部分歸檔日誌進行資料恢復資料恢復
- Linux下用rm刪除的檔案的恢復方法Linux
- 預設情況下 80% 的 Android 應用正在使用加密流量Android加密
- 分析針對EFS加密檔案無法開啟的情況資料恢復的解決方式加密資料恢復
- 【轉】恢復archivelog介紹Hive
- 【轉載】TortoiseSVN怎麼恢復到以前版本-恢復到以前版本的方法
- 特殊情況之下,千鋒老師教你如何準備影片面試面試
- xcodebuild -workspace 情況下,部分坑的處理XCodeUI
- 情況最簡單下的爬蟲案例爬蟲
- Cirium:疫情之下航空業復甦情況分析
- ORACLE備份&恢復案例(轉)Oracle
- Oracle like、不等於、隱式轉換走索引與不走索引情況Oracle索引
- CIO:採用多雲策略的情況分析
- gorm使用事務併發情況下切有最大mysql連線數限制的情況下的BUG,踩坑了GoORMMySql
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- NAND快閃記憶體供過於求的情況今年會有所好轉嗎?NaN記憶體
- RAC控制檔案恢復(三種不同情況)
- Indeed:美國教育和衛生服務就業情況已恢復到經濟危機之前的水平就業
- 不用vuex的情況下,隔代元件間的通訊Vue元件
- 怎樣用恢復驅動器來恢復win10 使用恢復驅動器恢復win10系統的步驟Win10
- 買不起煉丹爐了:談一談特殊時期的顯示卡情況
- oracle基於SCN增量恢復Oracle
- ORACLE備份&恢復案例三(轉)Oracle
- ORACLE備份&恢復案例二(轉)Oracle