存在活躍事務時,UNDO被刪除,資料庫ABORT時的恢復

westzq1984發表於2011-03-26
今天朋友問我,如果存在活躍事務時,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






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8242091/viewspace-690582/,如需轉載,請註明出處,否則將追究法律責任。

相關文章