前線上日誌檔案損壞與ora-600 [4000]處理

post0發表於2007-02-10
前線上日誌檔案損壞與ora-600 [4000]處理[@more@]這次又是一臺機器上面有兩個例項A和B。又是由於非當前的線上日誌檔案的狀態是處於closed狀態的(裸裝置),於是dba將A節點的非當前線上日誌檔案填加到了B節點上面去了,於是在A節點日誌發生切換時,導致了當前線上日誌檔案損壞。

一般情況下當前線上日誌檔案損壞也是還好處理的,但是這次卻是較為複雜。。。。

系統環境:aix p550,oracle 9206




首先檢查v$datafile_header,發現checkpoint_change#都是一致的。

於是按著一般的當前線上日誌檔案損壞步驟處理:

增加下列引數至Oracle啟動檔案:

_allow_resetlogs_corruption=TRUE

_corrupted_rollback_segments=(list of all your rollback segments)
註釋掉啟動檔案中的rollback_segments引數或undo_tablespaces引數
startup mount
recover database until cancel
alter database open resetlogs;

一般情況下,open resetlogs後最容易出現的600號錯誤為ora-600 [2662]和ora-600 [2256]。這兩個錯誤也相對來說好處理一些,只需要採用10015事件adjust scn號即可。

但是這次我卻是碰到了ora-600 [4000]號錯誤。

Errors in file /home/oracle/app/oracle/admin/test/udump/test_ora_2838638.trc:
ORA-00704: bootstrap process failure
ORA-00704: bootstrap process failure
ORA-00600: internal error code, arguments: [4000], [46], [], [], [], [], [], []
Mon Aug 14 15:05:31 2006
Error 704 happened during db open, shutting down database
USER: terminating instance due to error 704
Instance terminated by USER, pid = 2838638

metalink上對該錯誤的解釋是:

DESCRIPTION:

This has the potential to be a very serious error.

It means that Oracle has tried to find an undo segment number in the
dictionary cache and failed.

ARGUMENTS:
Arg [a] Undo segment number

FUNCTIONALITY:
KERNEL TRANSACTION UNDO

IMPACT:
INSTANCE FAILURE - Instance will not restart
STATEMENT FAILURE

由於一開始_corrupted_rollback_segments裡面只是列到_syssmu20$,於是將它列到_syssmu60$。重試後還是報這個錯。

增加10513事件,禁止smon程式回滾,結果還是一樣。

在600號的Trace檔案中有:

ORA-00600: internal error code, arguments: [4000], [46], [], [], [], [], [], []
Current SQL statement for this session:
select ctime, mtime, stime from obj$ where obj# = :1

於是我懷疑會不會是undo$基表中沒有46號回滾段的資訊?

採用bbed檢查undo$表格,發現裡面是有這個回滾段的資訊。

於是我想這個錯誤是出現在訪問obj$基表上面,也就是說該表格的scn號與系統當前的scn號是不一致的。於是我想償試修改該塊的scn號。依然採用bbed,償試修改該塊的scn號。修改後,結果還是一樣的。

於是我想應該是obj$基表上還有一個未提交的事務。於是繼續檢視trace檔案,發現如下資訊:

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x002e.025.00005b2c 0x00800f78.080c.01 --U- 1 fsc 0x0000.c5b527cf

data_block_dump,data header at 0x700000001f6e044
===============
tsiz: 0x1fb8
hsiz: 0xea
pbl: 0x700000001f6e044
bdba: 0x0040007a
76543210
flag=--------

很明顯,是有一個未提交的事務,於是我就償試用bbed修改該事務的狀態,將該事務改成提交狀態。

首先找到itl資訊:find /x 00005b2c,找到flag狀態,現在其狀態是20,也就是未提交,將之修改為80(提交狀態),並修改checkval。

之後去掉所有隱含引數,正常啟動資料庫,發現後臺報出了ora-600[2662]錯誤。哈哈,事情至此就好辦了,採用10015 adjust scn號,正常啟動資料庫:

Mon Aug 14 15:47:23 2006
Completed: ALTER DATABASE OPEN
Mon Aug 14 15:47:23 2006
Fatal internal error happened while SMON was doing active transaction recovery.
Mon Aug 14 15:47:23 2006
Errors in file /home/oracle/app/oracle/admin/test/bdump/test_smon_2293872.trc:
ORA-00600: internal error code, arguments: [ktpridestroy2], [], [], [], [], [], [], []
SMON: terminating instance due to error 600
Instance terminated by SMON, pid = 2293872

從這塊日誌可以看出資料庫正常啟動後,馬上因為smon回滾又導致了例項宕下來。

增加10513事件,啟動資料庫,一切正常。

想drop tablespce undotbs1,但是報出59號回滾段還有active事務無法刪除。

於是增加_corrupted_rollback_segments引數,將資料庫啟來,新建一個回滾表空間,將原來的回滾表空間重建後,一切正常。

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

相關文章