資料庫啟動的時候遇到壞塊,特别是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
CORE    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
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area  237998080 bytes
Fixed Size                  2227216 bytes
Variable Size             146801648 bytes
Database Buffers           83886080 bytes
Redo Buffers                5083136 bytes
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 Examined         : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing   (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing   (Index): 0
Total Blocks Empty            : 0
Total Blocks Marked Corrupt   : 0
Total Blocks Influx           : 0
Message 531 not found;  product=RDBMS; facility=BBED
這裡發現塊被标記為壞塊,其實這裡知道就是把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
&#160;<32 bytes per line>
BBED> set offset 8188
&#160;&#160;&#160;&#160;&#160;&#160;&#160; OFFSET&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 8188
BBED> dump
&#160;Block: 225&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Offsets: 8188 to 8191&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dba:0x00000000
&#160;ff06aabe
BBED> modify /x 00 offset 8188
&#160;0006aabe
BBED> p tailchk
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
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
&#160;&#160;
Block 225 failed with check code 6101
Total Blocks Failing&#160;&#160; (Data) : 1
這裡看到報了ITL相當的一些東西,原因是由于原來做實驗的時候,手動送出了資料。
報錯代碼的意思是,slot=20的行被鎖住,占用了itl2.
下面是dump資料庫看一下第21号的lb标記符
tl: 58 fb: --H-FL-- lb: 0x1&#160; cc: 17
col&#160; 0: [ 2]&#160; c1 15
col&#160; 1: [10]&#160; 5f 53 59 53 53 4d 55 32 30 24
col&#160; 2: [ 2]&#160; c1 02
col&#160; 3: [ 2]&#160; c1 06
col&#160; 4: [ 3]&#160; c2 03 49
col&#160; 5: [ 5]&#160; c4 02 62 0a 09
col&#160; 6: [ 1]&#160; 80
col&#160; 7: [ 3]&#160; c2 03 2a
col&#160; 8: [ 3]&#160; c2 02 3e
col&#160; 9: [ 1]&#160; 80
col 10: [ 2]&#160; c1 04
col 11: [ 2]&#160; c1 06
col 12: *NULL*
col 13: *NULL*
col 14: *NULL*
col 15: *NULL*
col 16: [ 2]&#160; c1 0
BBED> p *kdbr[20]
rowdata[634]
------------
ub1 rowdata[634]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @1823&#160;&#160;&#160;&#160; 0x2c
BBED> set offset 1823
&#160;&#160;&#160;&#160;&#160;&#160;&#160; OFFSET&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1823
&#160;Block: 225&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Offsets: 1823 to 1838&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Dba:0x00000000
&#160;2c011102 c1150a5f 53595353 4d553230
BBED> modify /x 2c00
&#160;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/1416970,如需轉載請自行聯系原作者