存在活躍事務時,UNDO被刪除,資料庫ABORT時的恢復
今天朋友問我,如果存在活躍事務時,UNDO表空間相關的資料檔案被刪除,然後ABORT庫,資料庫啟動報錯,隱含引數也無法拉起庫
如果是正常關閉的庫,由於DBWR程式會一直持有資料檔案的控制程式碼,其一般能保證資料庫正常的關閉。這是UNDO丟失恢復也很簡單。
如果ORACLE能在ABORT前,發現損壞,那麼ORACLE啟動時,通過隱含引數也可以OFFLINE掉UNDO段
但是在ORACLE報錯前,直接ABORT的庫,可能某些後設資料不一致或存在問題,需要讀取UNDO,這是找不到UNDO就會報錯
注意,SYSTEM表空間中的UNDO段,只儲存後設資料的UNDO資料,但是並不是後設資料的UNDO資料只放在SYSTEM表空間中的UNDO段。
這是,無論使用任何隱含引數,都無法開啟庫,報錯:
Sat Mar 26 16:47:19 2011
Errors in file /u01/app/oracle/admin/O10204/udump/o10204_ora_12544.trc:
ORA-00704: bootstrap process failure
ORA-00604: error occurred at recursive SQL level 2
ORA-00376: file 2 cannot be read at this time
ORA-01110: data file 2: '/oradata/oracle10/O10204/undotbs01.dbf'
bootstrap階段報錯。出錯的語句是個SELECT,應該是為維護一致性讀的報錯。
用了隱含引數也無法將UNDO段個OFFLINE掉,所以啟動也報錯
這是,可以用bbed將undo$中的記錄強制標記為OFFLINE
undo$中資料位置一般在塊106
BBED> set dba 1,106
DBA 0x0040006a (4194410 1,106)
可以看到,這個庫有11個UNDO SEGMENTS
BBED> p kdbr
sb2 kdbr[0] @86 8079
sb2 kdbr[1] @88 7059
sb2 kdbr[2] @90 7112
sb2 kdbr[3] @92 7165
sb2 kdbr[4] @94 7218
sb2 kdbr[5] @96 7271
sb2 kdbr[6] @98 7324
sb2 kdbr[7] @100 7377
sb2 kdbr[8] @102 7431
sb2 kdbr[9] @104 7485
sb2 kdbr[10] @106 7539
BBED> p *kdbr[1]
rowdata[0]
----------
ub1 rowdata[0] @7127 0x2c
看看每條資料
BBED> x /1rncnnnnnnnnnnn
rowdata[0] @7127
----------
flag@7127: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7128: 0x00
cols@7129: 17
col 0[2] @7130: 1
col 1[9] @7133: _SYSSMU1$
col 2[2] @7143: 1
col 3[2] @7146: 2
col 4[2] @7149: 9
col 5[4] @7152: 56749
col 6[1] @7157: 0
col 7[2] @7159: 51
col 8[2] @7162: 23
col 9[1] @7165: 0
col 10[2] @7167: 3 -- 這裡的3,代表ONLINE
col 11[2] @7170: 1
col 12[0] @7173: *NULL*
col 13[0] @7174: *NULL*
col 14[0] @7175: *NULL*
col 15[0] @7176: *NULL*
col 16[2] @7177: 1
可以用bbed,強制將其修改為2,代表OFFLINE,然後就能不用隱含引數OPEN庫
set offset 7167 -- COL10的位置
set offset +2 -- 跳過COL頭
modify /x 03 -- 修改為2(OFFLINE),oracle減一儲存
可以看到,這樣和隱含引數一樣,後設資料可能已經不一致,資料庫一定要新EXP/IMP
如果是正常關閉的庫,由於DBWR程式會一直持有資料檔案的控制程式碼,其一般能保證資料庫正常的關閉。這是UNDO丟失恢復也很簡單。
如果ORACLE能在ABORT前,發現損壞,那麼ORACLE啟動時,通過隱含引數也可以OFFLINE掉UNDO段
但是在ORACLE報錯前,直接ABORT的庫,可能某些後設資料不一致或存在問題,需要讀取UNDO,這是找不到UNDO就會報錯
注意,SYSTEM表空間中的UNDO段,只儲存後設資料的UNDO資料,但是並不是後設資料的UNDO資料只放在SYSTEM表空間中的UNDO段。
這是,無論使用任何隱含引數,都無法開啟庫,報錯:
Sat Mar 26 16:47:19 2011
Errors in file /u01/app/oracle/admin/O10204/udump/o10204_ora_12544.trc:
ORA-00704: bootstrap process failure
ORA-00604: error occurred at recursive SQL level 2
ORA-00376: file 2 cannot be read at this time
ORA-01110: data file 2: '/oradata/oracle10/O10204/undotbs01.dbf'
bootstrap階段報錯。出錯的語句是個SELECT,應該是為維護一致性讀的報錯。
用了隱含引數也無法將UNDO段個OFFLINE掉,所以啟動也報錯
這是,可以用bbed將undo$中的記錄強制標記為OFFLINE
undo$中資料位置一般在塊106
BBED> set dba 1,106
DBA 0x0040006a (4194410 1,106)
可以看到,這個庫有11個UNDO SEGMENTS
BBED> p kdbr
sb2 kdbr[0] @86 8079
sb2 kdbr[1] @88 7059
sb2 kdbr[2] @90 7112
sb2 kdbr[3] @92 7165
sb2 kdbr[4] @94 7218
sb2 kdbr[5] @96 7271
sb2 kdbr[6] @98 7324
sb2 kdbr[7] @100 7377
sb2 kdbr[8] @102 7431
sb2 kdbr[9] @104 7485
sb2 kdbr[10] @106 7539
BBED> p *kdbr[1]
rowdata[0]
----------
ub1 rowdata[0] @7127 0x2c
看看每條資料
BBED> x /1rncnnnnnnnnnnn
rowdata[0] @7127
----------
flag@7127: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7128: 0x00
cols@7129: 17
col 0[2] @7130: 1
col 1[9] @7133: _SYSSMU1$
col 2[2] @7143: 1
col 3[2] @7146: 2
col 4[2] @7149: 9
col 5[4] @7152: 56749
col 6[1] @7157: 0
col 7[2] @7159: 51
col 8[2] @7162: 23
col 9[1] @7165: 0
col 10[2] @7167: 3 -- 這裡的3,代表ONLINE
col 11[2] @7170: 1
col 12[0] @7173: *NULL*
col 13[0] @7174: *NULL*
col 14[0] @7175: *NULL*
col 15[0] @7176: *NULL*
col 16[2] @7177: 1
可以用bbed,強制將其修改為2,代表OFFLINE,然後就能不用隱含引數OPEN庫
set offset 7167 -- COL10的位置
set offset +2 -- 跳過COL頭
modify /x 03 -- 修改為2(OFFLINE),oracle減一儲存
可以看到,這樣和隱含引數一樣,後設資料可能已經不一致,資料庫一定要新EXP/IMP
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8242091/viewspace-690582/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【資料庫資料恢復】HP-UX系統ORACLE資料庫被誤刪除的資料恢復資料庫資料恢復UXOracle
- [Oracle]Oracle資料庫資料被修改或者刪除恢復資料Oracle資料庫
- 恢復被rm意外刪除資料檔案
- 寶塔資料庫恢復 mysql資料庫丟失恢復 mysql資料庫刪除庫恢復 寶塔mysql資料庫恢復資料庫MySql
- 恢復 Git 被刪除的分支Git
- Git恢復被刪除的分支Git
- MySQL使用mysqldump+binlog完整恢復被刪除的資料庫(轉)MySql資料庫
- 【北亞資料恢復】輸入錯誤命令導致MySQL資料庫資料被刪除的資料恢復案例資料恢復MySql資料庫
- Sybase ASE資料庫恢復,Sybase資料恢復,資料誤刪除恢復工具READSYBDEVICE資料庫資料恢復dev
- 恢復之資料庫關閉時的完全恢復資料庫
- 大事務導致資料庫恢復時間長資料庫
- 【資料庫資料恢復】LINUX環境下ORACLE資料庫誤刪除的資料恢復資料庫資料恢復LinuxOracle
- 恢復Oracle資料庫誤刪除資料的語句Oracle資料庫
- 【oracle資料庫資料恢復】誤操作導致的資料庫誤刪除的資料恢復案例Oracle資料庫資料恢復
- 利用rman全備恢復刪除的資料庫資料庫
- 誤刪除儲存SqlServer資料庫資料恢復SQLServer資料庫資料恢復
- MySQL資料庫表誤刪除恢復(一)MySql資料庫
- 伺服器資料恢復—EMC儲存資料卷被誤刪除如何恢復資料?伺服器資料恢復
- 恢復被刪除的Word選單
- 直接刪除undo及temp表空間檔案後的資料庫恢復一例資料庫
- SQL Server資料庫恢復,SQL Server資料恢復,SQL Server資料誤刪除恢復工具SQLRescueSQLServer資料庫資料恢復
- logminer來恢復在表DDL之前被刪除的資料
- 通過事務日誌恢復SqlServer資料庫到一個特定的時間點SQLServer資料庫
- 【伺服器資料恢復】VMFS分割槽被刪除並格式化的資料恢復案例伺服器資料恢復
- 【伺服器資料恢復】XenServer虛擬機器被誤操作刪除的資料恢復案例伺服器資料恢復Server虛擬機
- oracle恢復誤刪除資料Oracle
- Mysql資料庫delete刪除後資料恢復報告MySql資料庫delete資料恢復
- Sybase SQL Anywhere(ASA)資料庫恢復,ASA資料恢復,資料誤刪除恢復工具ReadASADBSQL資料庫資料恢復
- linux下 恢復被rm意外刪除資料檔案Linux
- 【北亞資料恢復】分散式儲存hbase和hive資料庫底層檔案被誤刪除的資料恢復案例資料恢復分散式Hive資料庫
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- Oracle資料庫UNDO損壞後的恢復Oracle資料庫
- mysql資料庫誤刪除後的資料恢復操作說明MySql資料庫資料恢復
- MySQL 資料庫誤刪除後的資料恢復操作說明MySql資料庫資料恢復
- Oracle資料庫意外刪除資料檔案的恢復(轉載)Oracle資料庫
- 恢復被刪除的Word選單(轉)
- 【備份恢復】不使用rman工具就能恢復被rm刪除的資料檔案案例
- PostgreSQL中刪除的資料能否恢復SQL