catalog損壞情況下的資料庫恢復例項
catalog損壞情況下的資料庫恢復例項
一.環境描述
1.執行環境:HP小型機,HPUX作業系統,Oracle 9.2.0.1,OpenView Data Protector備份管理軟體,ESL9000帶庫。
資料庫全備指令碼:
run {
allocate channel 'dev_0' type 'sbt_tape'
parms 'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=oratest,OB2BARLIST=test2oratest)';
backup incremental level
format 'test2oratest
database
include current controlfile;
sql 'alter system archive log current';
}
歸檔日誌備份指令碼:
run {
allocate channel 'dev_0' type 'sbt_tape'
parms 'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=oratest,
OB2BARLIST=test2oratestarchivelog)';
backup incremental level
format 'test2oratestarchivelog
archivelog all delete input;
}
2.故障描述:Oracle資料庫(測試庫)執行在歸檔模式下。正常情況下,備份管理軟體呼叫Oracle RMAN進行全庫和歸檔日誌備份。備份檔案儲存在ESL9000磁帶庫上。由於磁碟陣列故障,造成目標資料庫控制檔案和資料檔案全部損壞;同時,存放catalog的資料庫也被損壞。
由於catalog損壞,RMAN無法透過catalog找到備份集,restore無法成功。由於沒有控制檔案,資料庫僅能啟動到nomount狀態下。
二.背景知識
在Oracle 816 以後的版本中,Oracle提供了一個包:DBMS_BACKUP_RESTORE。 DBMS_BACKUP_RESTORE 包是由dbmsbkrs.sql 和 prvtbkrs.plb 這兩個指令碼建立的。 catproc.sql 指令碼執行後會呼叫這兩個包。所以每個資料庫都有的這個包作為Oracle伺服器和作業系統之間IO操作的介面,由RMAN直接呼叫。我們可以在資料庫nomount 情況下呼叫這些包 ,來達到資料庫恢復的目的。
三.恢復步驟
1.查詢備份集
備份集可以在Data Protector的internal database中或日誌記錄中找到。具體內容(根據需要做了剪裁)如下:
SBT-25032 (?) 10/08/04 10:42:54 [Normal] From: "oratest" Time: 10/08/04 10:42:54
Starting OB2BAR Backup: 05 test2:test2oratest<539001683:1>.dbf // Oracle8539001683:1>
SBT-25032 (?) 10/08/04 10:46:14 [Normal] From: "oratest" Time: 10/08/04 10:46:14
Completed OB2BAR Backup: 05 test2:test2oratest<539001683:1>.dbf // Oracle8539001683:1>
SBT-25032 (?) 10/08/04 10:46:22 [Normal] From: "oratest" Time: 10/08/04 10:46:22
Starting OB2BAR Backup: 05 test2:test2oratest<539001979:1>.dbf // Oracle8539001979:1>
SBT-25032 (?) 10/08/04 11:02:45 [Normal] From: "oratest" Time: 10/08/04 11:02:45
Completed OB2BAR Backup: 05 test2:test2oratest<539001979:1>.dbf // Oracle8539001979:1>
SBT-28813 (?) 10/08/04 11:34:57 [Normal] From: "oratest" Time: 10/08/04 11:34:57
Starting OB2BAR Backup: 05 test2:test2oratestarchivelog<539004793:1>.dbf // Oracle8539004793:1>
SBT-28813 (?) 10/08/04 11:35:17 [Normal] From: "oratest" Time: 10/08/04 11:35:17
Completed OB2BAR Backup: 05 test2:test2oratestarchivelog<539004793:1>.dbf // Oracle8539004793:1>
。。。
SBT-28813 (?) 10/08/04 11:41:57 [Normal] From: "oratest" Time: 10/08/04 11:41:57
Starting OB2BAR Backup: 05 test2:test2oratestarchivelog<539005316:1>.dbf // Oracle8539005316:1>
SBT-28813 (?) 10/08/04 11:42:08 [Normal] From: "oratest" Time: 10/08/04 11:42:08
Completed OB2BAR Backup: 05 test2:test2oratestarchivelog<539005316:1>.dbf // Oracle8539005316:1>
SBT-28813 (?) 10/08/04 11:42:13 [Normal] From: "oratest" Time: 10/08/04 11:42:13
Starting OB2BAR Backup: 05 test2:test2oratestarchivelog<539005332:1>.dbf // Oracle8539005332:1>
SBT-28813 (?) 10/08/04 11:42:16 [Normal] From: "oratest" Time: 10/08/04 11:42:16
Completed OB2BAR Backup: 05 test2:test2oratestarchivelog<539005332:1>.dbf // Oracle8539005332:1>
從上述內容可以看到儲存在帶庫上的全備的備份集檔案為:
test2:test2oratest<539001683:1>.dbf 539001683:1>
test2:test2oratest<539001979:1>.dbf539001979:1>
Archivelog的備份集檔案為:
test2:test2oratestarchivelog<539004793:1>.dbf539004793:1>
。。。
test2:test2oratestarchivelog<539005316:1>.dbf 539005316:1>
test2:test2oratestarchivelog<539005332:1>.dbf 539005332:1>
2.恢復控制檔案
test2:/backup/test$sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on Sat Oct 9 14:30:54 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL>startup nomount
SQL>DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'sbt_tape',
ident=>'T1',params=>'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=oratest,OB2BARLIST=test2oratest)');
6 sys.dbms_backup_restore.restoreSetDatafile;
7 sys.dbms_backup_restore.restoreControlfileTo(
cfname=>'/backup/test/Control01.ctl');
8 sys.dbms_backup_restore.restoreBackupPiece(done=>done,
handle=>'test2oratest<539001979:1>.dbf', params=>null);539001979:1>
9 sys.dbms_backup_restore.deviceDeallocate;
10 END;
11 /
[Normal] From: "oratest" Time: 10/09/04 14:23:28
Starting OB2BAR Restore: 05 test2:test2oratest<539001979:1>.dbf // Oracle8539001979:1>
[Normal] From: "oratest" Time: 10/09/04 14:23:32
Completed OB2BAR Restore: 05 test2:test2oratest<539001979:1>.dbf // Oracle8539001979:1>
SQL>
由於RMAN做全庫備份的時候,最後備份控制檔案,應此可以從最後一個全備的備份集檔案中恢復控制檔案。恢復控制檔案時,需將資料庫啟動到nomount狀態。恢復的控制檔案應與init檔案中定義的控制檔案的路徑、檔名和數量相一致,否則無法把資料庫啟動到mount狀態。
下面介紹程式包的內容:
第五行 分配一個device channel ,"sbt_tape"說明是從磁帶上恢復。Params引數與Data Protector中RMAN備份指令碼中的引數一致。
第六行 初始化恢復過程,準備進行控制檔案或資料檔案恢復。
第七行 指出待恢復檔案和恢復檔案的儲存位置。本處說明是恢復控制檔案及存放存放控制檔案的路徑、檔名。
第八行 說明從哪個備份片中恢復
第九行 釋放裝置通道
3.恢復資料檔案
首先需要知道每個備份集中包含哪些資料檔案:
SQL>alter database mount;
SQL>select file# from v$backup_datafile where set_stamp=539001683;
FILE#
----------
2
0
2 rows selected.
SQL>
其中,set_stamp是備份集檔名中的時間戳;
0表示控制檔案;
2是資料檔案號。
檔案號對應的檔名可以在v$datafile中查到。
知道備份集中包含的資料檔案號和檔名,就可以恢復資料檔案了:
SQL>DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'sbt_tape',
ident=>'T1',params=>'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=oratest,OB2BARLIST=test2oratest)');
6 sys.dbms_backup_restore.restoreSetDatafile;
7 sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>2,
toname=>'/backup/test/undotbsldb01.dbf');
8 sys.dbms_backup_restore.restoreBackupPiece(done=>done,
handle=>'test2:test2oratest<539001683:1>.dbf', params=>null);539001683:1>
9 sys.dbms_backup_restore.deviceDeallocate;
10 END;
11 /
[Normal] From: "oratest" Time: 10/09/04 14:20:10
Starting OB2BAR Restore: 05test2:test2oratest<539001683:1>.dbf // Oracle8539001683:1>
[Normal] From: "oratest" Time: 10/09/04 14:20:24
Completed OB2BAR Restore: 05 test2:test2oratest<539001683:1>.dbf // Oracle8539001683:1>
PL/SQL procedure successfully completed.
SQL>
重複上述操作,可以恢復所有資料檔案。恢復的資料檔案的儲存目錄可以不是原儲存目錄,因此,甚至可以在資料庫open狀態下從備份集中restore資料檔案。
4.恢復archive log檔案
SQL>DECLARE
2 devtype varchar2(256);
3 done boolean;
4 BEGIN
5 devtype:=sys.dbms_backup_restore.deviceAllocate(type=>'sbt_tape',ident=>'T1',
params=>'ENV=(OB2BARTYPE=Oracle8,OB2APPNAME=oratest,
OB2BARLIST=test2oratestarchivelog)');
6 sys.dbms_backup_restore.restoreSetArchivedLog;
7 sys.dbms_backup_restore.restoreArchivedLogRange;
8 sys.dbms_backup_restore.restoreBackupPiece(done=>done,
handle=>'test2:test2oratestarchivelog<539005316:1>.dbf', params=>null);539005316:1>
9 sys.dbms_backup_restore.deviceDeallocate;
10 END;
11 /
[Normal] From: "oratest" Time: 10/09/04 14:40:13
Starting OB2BAR Restore: 05 test2:test2oratestarchivelog<539005316:1>.dbf // Oracle8539005316:1>
[Normal] From: "oratest" Time: 10/09/04 14:40:13
Completed OB2BAR Restore: 05 test2:test2oratestarchivelog<539005316:1>.dbf // Oracle8539005316:1>
SQL>
根據第一步中獲得的archive log備份集的檔名,恢復所有archive log.
5. Recover資料庫
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 54285 generated at 10/08/2004 10:41:24 needed for thread 1
ORA-00289: suggestion : /backup/test/archive/1_24.dbf
ORA-00280: change 54285 for thread 1 is in sequence #24
Specify log: {
ORA-00279: change 55331 generated at 10/08/2004 11:02:48 needed for thread 1
ORA-00289: suggestion : /backup/test/archive/1_25.dbf
ORA-00280: change 55331 for thread 1 is in sequence #25
ORA-00278: log file '/backup/test/archive/1_24.dbf' no longer needed for this recovery
Specify log: {
ORA-00279: change 56789 generated at 10/08/2004 11:33:12 needed for thread 1
ORA-00289: suggestion : /backup/test/archive/1_26.dbf
ORA-00280: change 56789 for thread 1 is in sequence #26
ORA-00278: log file '/backup/test/archive/1_25.dbf' no longer needed for this recovery
Specify log: {
ORA-00308: cannot open archived log '/backup/test/archive/1_26.dbf'
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
SQL> alter database open resetlogs;
Database altered.
SQL>
現在資料庫恢復已經完成了。由於online redo log也損壞了,資料庫僅恢復到最後一個歸檔的日誌檔案。
一個小技巧:在上一步恢復archive log時,archive log檔案可能非常多。如果不知道最早應該恢復到哪一個archive log檔案,可以先執行一次本步操作,系統會提示最先需要的archive log檔案,然後從最後的一個archive log備份集往前恢復直到該archive log檔案被恢復。示例如下:
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 54285 generated at 10/08/2004 10:41:24 needed for thread 1
ORA-00289: suggestion : /backup/test/archive/1_24.dbf
ORA-00280: change 54285 for thread 1 is in sequence #24
Specify log: {
ORA-00308: cannot open archived log '/backup/test/archive/1_24.dbf'
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: '/backup/test/oradata/system01.dbf'
SQL>
顯然,第一個需要的archive log檔案是/backup/test/archive/1_24.dbf
五.小結
1. 只要儲存了完整的全庫備份和完整的歸檔日誌備份,即使控制檔案和恢復目錄全部損壞,資料庫還是可以恢復的。
2. 根據上面一條可以看出,無論備份時是否採用了恢復目錄,恢復目錄在資料庫恢復時,並不是必須的。
3. RMAN做的備份可以不用RMAN恢復。
4. HP Data Protector的備份指令碼在做全庫備份時,是一個一個備份資料檔案和日誌檔案並形成單獨的備份集。資料庫全備期間的日誌檔案必須儲存完整。
參考資料:
DBA工作備忘錄之三:rman備份,沒用catalog ,但控制檔案丟失,怎麼解決? Fenng
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7916042/viewspace-934961/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【資料庫資料恢復】MongoDB資料庫檔案損壞的資料恢復案例資料庫資料恢復MongoDB
- 資料庫資料恢復—NTFS分割槽損壞如何恢復SqlServer資料庫資料資料庫資料恢復SQLServer
- 資料庫資料恢復-SQL SERVER資料庫MDF (NDF)或LDF損壞如何恢復資料?資料庫資料恢復SQLServer
- u盤檔案損壞怎麼恢復資料 u盤恢復損壞資料的有效方法
- 資料底層損壞的恢復方法—拼碎片恢復資料
- Oracle資料庫不同損壞級別的恢復詳解Oracle資料庫
- 【資料庫資料恢復】ASM例項不能掛載的Oracle資料庫資料恢復案例資料庫資料恢復ASMOracle
- 3.1.5.3 在不掛載資料庫的情況下啟動例項資料庫
- 執行在容器中Postgres資料庫資料損壞後如何恢復?資料庫
- 【伺服器資料恢復】IBM儲存伺服器硬碟壞道離線、oracle資料庫損壞的資料恢復伺服器資料恢復IBM硬碟Oracle資料庫
- 【資料庫資料恢復】Oracle ASM例項無法掛載的資料恢復案例資料庫資料恢復OracleASM
- 資料恢復記錄:硬碟分割槽損壞修復SqlServer資料庫過程資料恢復硬碟SQLServer資料庫
- 【北亞資料恢復】誤操作分割槽損壞導致SqlServer資料庫資料丟失的資料恢復資料恢復SQLServer資料庫
- u盤檔案損壞怎麼恢復資料 u盤損壞無法讀取怎麼恢復資料
- 【資料庫資料恢復】mdb_catalog.wt檔案丟失的MongoDB資料恢復案例資料庫資料恢復MongoDB
- 隨身碟顆粒損壞資料恢復資料恢復
- MySQL異常恢復之無主鍵情況下innodb資料恢復的方法MySql資料恢復
- 成功恢復某公司伺服器故障導致的資料庫損壞伺服器資料庫
- raid5癱瘓導致資料庫損壞的恢復過程AI資料庫
- 資料恢復工具Recoverit使用教程:如何修復損壞的影片資料恢復
- 【伺服器資料恢復】某品牌ProLiant伺服器raid癱瘓資料庫檔案損壞的資料恢復伺服器資料恢復AI資料庫
- SQLite資料庫損壞及其修復探究SQLite資料庫
- 【資料庫資料恢復】SQL SERVER資料庫MDF (NDF)或LDF損壞問題如何解決?資料庫資料恢復SQLServer
- InterBase資料庫檔案損壞的修復方法資料庫
- 【儲存資料恢復】IBM儲存檔案NTFS系統損壞的資料恢復案例資料恢復IBM
- 【vSAN資料恢復案例】異常斷電導致vSAN底層資料損壞的資料恢復資料恢復
- 【資料庫資料恢復】windows server下SqlServer資料庫的資料恢復資料庫資料恢復WindowsServerSQL
- oracle資料庫跨平臺(AIX)從RAC恢復至(linux)下的單例項Oracle資料庫AILinux單例
- 伺服器Oracle資料庫損壞修復伺服器Oracle資料庫
- 【資料庫資料恢復】Oracle資料庫檔案出現壞塊報錯的資料恢復案例資料庫資料恢復Oracle
- 【北亞資料恢復】異常斷電導致linux伺服器無法啟動,資料庫損壞的資料恢復資料恢復Linux伺服器資料庫
- 電腦進水導致硬碟損壞資料恢復硬碟資料恢復
- 【伺服器資料恢復】伺服器reiserfs檔案系統損壞的資料恢復案例伺服器資料恢復
- oracle資料庫損壞的恢復過程-基於IBM伺服器儲存Oracle資料庫IBM伺服器
- 將RAC備份集恢復為單例項資料庫單例資料庫
- PostgreSQL 恢復大法 - 恢復部分資料庫、跳過壞塊、修復無法啟動的資料庫SQL資料庫
- 【LINUX】Oracle資料庫 linux磁碟頭資料損壞修復LinuxOracle資料庫
- 伺服器資料庫損壞能修復嘛伺服器資料庫
- redo損壞修復啟動資料庫辦法資料庫