天天看點

資料庫啟動時遇到ORA-01578錯誤

資料庫啟動的時候遇到壞塊,特别是SYSTEM表空間中的一些底層表,如UNDO$,OBJ$等一些表,會導緻資料庫不能正常open,當然我們可以通過增加一些隐藏參數來達到跳過壞塊來啟動資料庫,也可以通過bbed工具來手動修複塊來。下面是自己的一個測試環境遇到這樣的錯誤,通過bbed工具來修複

1,資料庫版本

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

PL/SQL Release 11.2.0.3.0 - Production

TNS for Linux: Version 11.2.0.3.0 - Production

NLSRTL Version 11.2.0.3.0 - Production

[[email protected] ~]$sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Sun May 25 04:36:03 2014

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Database mounted.

ORA-01092: ORACLE instance terminated. Disconnection forced

ORA-00604: error occurred at recursive SQL level 1

ORA-00607: Internal error occurred while making a change to a data block

ORA-00600: internal error code, arguments: [kdBlkCheckError], [1], [225],

[6108], [], [], [], [], [], [], [], []

Process ID: 12178

Session ID: 1 Serial number: 5

2,啟動報錯

SQL*Plus: Release 11.2.0.3.0 Production on Sun May 25 04:20:44 2014

ORA-01578: ORACLE data block corrupted (file # 1, block # 225)

ORA-01110: data file 1: '/oracle/app/oracle/oradata/orcl1123/system01.dbf'

Process ID: 1617

此塊就是存儲undo$基表的塊,在資料庫啟動的時候,做恢複的時候,是需要去讀undo塊的,是以導緻報錯

3,bbed修複壞塊

BBED> verify

DBVERIFY - Verification starting

FILE = /oracle/app/oracle/oradata/orcl1123/system01.dbf

BLOCK = 225

Block Checking: DBA = 4194529, Block Type = KTB-managed data block

Found block already marked corrupted

DBVERIFY - Verification complete

Total Blocks Processed (Data) : 1

Total Blocks Processed (Index): 0

這裡發現塊被标記為壞塊,其實這裡知道就是把seq更改為FF了,下面我們修改回來就可以了

BBED> p kcbh

struct kcbh, 20 bytes                       @0      

   ub1 type_kcbh                            @0        0x06

   ub1 frmt_kcbh                            @1        0xa2

   ub1 spare1_kcbh                          @2        0x00

   ub1 spare2_kcbh                          @3        0x00

   ub4 rdba_kcbh                            @4        0x004000e1

   ub4 bas_kcbh                             @8        0x0021beaa

   ub2 wrp_kcbh                             @12       0x0000

   ub1 flg_kcbh                             @15       0x04 (KCBHFCKV)

   ub2 chkval_kcbh                          @16       0x4cba

   ub2 spare3_kcbh                          @18       0x0000

BBED> set mode edit

        MODE            Edit

BBED> set count 16

        COUNT           16

BBED> modify /x 00 offset 14

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

 File: /oracle/app/oracle/oradata/orcl1123/system01.dbf (0)

 Block: 225              Offsets:   14 to   29           Dba:0x00000000

------------------------------------------------------------------------

 0004ba4c 00000100 00000f00 0000aabe

 <32 bytes per line>

BBED> set offset 8188

        OFFSET          8188

BBED> dump

 Block: 225              Offsets: 8188 to 8191           Dba:0x00000000

 ff06aabe

BBED> modify /x 00 offset 8188

 0006aabe

BBED> p tailchk

BBED> sum apply

Check value for File 0, Block 225:

current = 0x4cba, required = 0x4cba

data header at 0x2a98b8725c

kdbchk: row locked by non-existent transaction

Block 225 failed with check code 6101

這裡看到報了ITL相當的一些東西,原因是由于原來做實驗的時候,手動送出了資料。

報錯代碼的意思是,slot=20的行被鎖住,占用了itl2.

下面是dump資料庫看一下第21号的lb标記符

col 12: *NULL*

col 13: *NULL*

col 14: *NULL*

col 15: *NULL*

BBED> p *kdbr[20]

rowdata[634]

------------

BBED> set offset 1823

        OFFSET          1823

 Block: 225              Offsets: 1823 to 1838           Dba:0x00000000

 2c011102 c1150a5f 53595353 4d553230

BBED> modify /x 2c00

 2c001102 c1150a5f 53595353 4d553230

current = 0x6ec1, required = 0x6ec1

塊不在報錯。驗證通過

4,資料庫正常打開

SQL> alter database open;

Database altered.

undo塊能正常通路

SQL> select name from undo$;

NAME

------------------------------

SYSTEM

_SYSSMU1$

_SYSSMU10$

_SYSSMU11$

_SYSSMU12$

_SYSSMU13$

_SYSSMU14$

_SYSSMU15$

_SYSSMU16$

_SYSSMU17$

_SYSSMU18$

_SYSSMU19$

_SYSSMU2$

_SYSSMU20$

_SYSSMU3$

_SYSSMU4$

_SYSSMU5$

_SYSSMU6$

_SYSSMU7$

_SYSSMU8$

_SYSSMU9$

21 rows selected.

     本文轉自7343696 51CTO部落格,原文連結:http://blog.51cto.com/luoping/1416972,如需轉載請自行聯系原作者