DBMS_BACKUP_RESTORE.DBMS_BACKUP_RESTORE用於特殊情況下的恢復
一般如下:系統崩潰,rman使用控制檔案,沒有使用控制檔案自動備份,現在僅有最後一次全備(備份中包括控制檔案),以及其增量備份,規檔備份.
通常這種情況下不能使用常規RMAN來恢復,因為此全備份中備份的控制檔案中沒有包含本次的備份資訊,rman使用控制檔案備份的時候是先備份控制檔案
後備份其它資訊
背景知識
在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;
PROCEDURE restoreControlfileTo(cfname IN varchar2);
PROCEDURE restoreDataFileTo( dfnumber IN binary_integer
,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;
可以透過該語句得到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;
在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;
恢復歸檔日誌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
mount資料庫
SQL> alter database mount;
恢復資料庫到某一時間點
SQL> >recover database until time '2006-12-14 10:00:00';
啟動資料庫
SQL> alter database open resetlogs;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2285529/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 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
- 【伺服器資料恢復】伺服器還原了2年前的舊快照並且沒有最新備份情況下的資料恢復伺服器資料恢復
- Cirium:為什麼中國對Max機型的批准情況對於恢復波音公司的交付份額至關重要
- 測試在丟失歸檔日誌的情況下,跳過部分歸檔日誌進行資料恢復資料恢復
- Linux下用rm刪除的檔案的恢復方法Linux
- 預設情況下 80% 的 Android 應用正在使用加密流量Android加密
- 分析針對EFS加密檔案無法開啟的情況資料恢復的解決方式加密資料恢復
- 特殊情況之下,千鋒老師教你如何準備影片面試面試
- xcodebuild -workspace 情況下,部分坑的處理XCodeUI
- 情況最簡單下的爬蟲案例爬蟲
- Cirium:疫情之下航空業復甦情況分析
- CIO:採用多雲策略的情況分析
- gorm使用事務併發情況下切有最大mysql連線數限制的情況下的BUG,踩坑了GoORMMySql
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- RAC控制檔案恢復(三種不同情況)
- Indeed:美國教育和衛生服務就業情況已恢復到經濟危機之前的水平就業
- 不用vuex的情況下,隔代元件間的通訊Vue元件
- 怎樣用恢復驅動器來恢復win10 使用恢復驅動器恢復win10系統的步驟Win10
- 買不起煉丹爐了:談一談特殊時期的顯示卡情況
- oracle基於SCN增量恢復Oracle
- 什麼情況下你能接受 996996
- 哪些情況下企業需要部署CRM?
- mongodb 基於oplog的時間點恢復MongoDB
- 關於變數與‘=’賦值的情況出錯變數賦值
- 不聯網的情況下,使用 electron-builder 快速打包全平臺應用UI
- 4.3.4.1 在不使用Oracle OMF的情況下建立CDBOracle
- 在不影響程式使用的情況下新增shellcode
- Android下檢視SO庫被依賴的情況Android