ora-600 [4000]异常导致Open Database失败 使用bbed解决一例

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638   QQ号:47079569    邮箱:service@parnassusdata.com

 

近日在客户这边,测试环境遇到ora-600 [4000]异常,无法打开数据库.

 

造成ORA-00600 [4000]错误的主要原因是因为系统掉电,或者数据库恢复不完全,导致system表空间的一些位的状态异常,导致bootstrap无法正常情况.

以下是通过bbed方法,修改相关标志位,强制打开数据库的一种方法.

但是由于数据库实际上已经处于非一致状态,强烈建议用户打开数据库后,通过将生产环境的数据导出后,重建数据库.

 

 

造成ORA-00600 [4000]错误的主要原因是因为系统掉电,或者数据库恢复不完全,导致system表空间的一些位的状态异常,导致bootstrap无法正常情况.
以下是通过bbed方法,修改相关标志位,强制打开数据库的一种方法.
但是由于数据库实际上已经处于非一致状态,强烈建议用户打开数据库后,通过将生产环境的数据导出后,重建数据库.

--alert log相关的trace如下:
Tue Jun  4 15:41:34 2013
Errors in file /u02/oracle/app/oracle/admin/zjrpt/udump/zjrpt1_ora_770332.trc:
ORA-00600: internal error code, arguments: [4000], [41], [], [], [], [], [], []

trace文件 /u02/oracle/app/oracle/admin/zjrpt/udump/zjrpt1_ora_770332.trc,可以找到类似的相关内容
*** 2013-06-04 15:41:35.055
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [4000], [41], [], [], [], [], [], []
Current SQL statement for this session:
select ctime, mtime, stime from obj$ where obj# = :1
----- Call Stack Trace -----
calling              call     entry                argument values in hex      
location             type     point                (? means dubious value)     
-------------------- -------- -------------------- ----------------------------
ksedst+001c          bl       ksedst1              0FFFFFFFF ? 000000020 ?
ksedmp+0290          bl       ksedst               1048EBB20 ?
ksfdmp+0018          bl       03F3BE0C             
kgeriv+0108          bl       _ptrgl               
kgeasi+0118          bl       kgeriv               1019AAD00 ? 000000000 ?
                                                   000000000 ?
                                                   26414080048E1630 ?
                                                   300000000 ?
...................................................                                                   
Block header dump:  0x0040007a
 Object id on Block? Y
 seg/obj: 0x12  csc: 0xc20.26114c0d  itc: 1  flg: -  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0029.026.0021d127  0x0091a949.3d91.01  --U-    1  fsc 0x0000.26114c0f
data_block_dump,data header at 0x700000b77a4e044
===============
tsiz: 0x1fb8
hsiz: 0xea
pbl: 0x700000b77a4e044
bdba: 0x0040007a
     76543210
flag=--------
ntab=1
nrow=108
frre=-1
fsbo=0xea
fseo=0x40c
avsp=0x368
tosp=0x368

根据trace文件的bdba: 0x0040007a可以找到对应的文件号和块ID
select dbms_utility.data_block_address_file(TO_NUMBER('40007a', 'XXXXXXXX')) file_id, 
dbms_utility.data_block_address_block(TO_NUMBER('40007a', 'XXXXXXXX')) block_id 
from dual;
   FILE_ID   BLOCK_ID
---------- ----------
         1        122
         
!!!!在后续操作中,因为要修改system表空间的数据文件内容;建议在修改前,在数据库关闭状态下,先将当前的system表空间看的数据文件进行备份


bbed可执行文件的生成:
linux和unix平台,10g中可能需要手工编译出bbed工具
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
mv bbed $ORACLE_HOME/bin
在windows平台,只有8i上有bbed,可以通过将8i的bbed复制到10g的环境,进行使用

使用bbed需要2个配置文件
A : file.txt文件
这个文件对应的3个列为,file_id,文件名的和路径,数据文件大小,可以使用SQL生成:
set linesize 300
set pagesize 9999
select file#||' '||name||' '||bytes from v$datafile where FILE#=1;
FILE#||''||NAME||''||BYTES
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 /oradata/sys/zjrpt/system01.dbf 503316480

vi file.txt
1 /oradata/sys/zjrpt/system01.dbf 503316480

B :bbed.txt:
这个文件是bbed的配置文件,配置了blocksize,listfile,mode ,password参数
blocksize:数据文件所在表空间的blocksize
listfile:指向前面生成的文件file.txt
mode:edit说明是以编辑模式打开bbed
password:blockedit这个是定值,调用bbed的时候会
SQL> show parameter db_block_size
NAME                                 TYPE        VALUE
----------------------------- ----------- -------------
db_block_size                        integer     8192
SQL>

vi bbed.txt
blocksize=8192
listfile=/home/oracle/oracle_work/file.txt
mode=edit
password=blockedit

--正式调用bbed
bbed parfile=/home/oracle/oracle_work/bbed.txt

--指定需要编辑的文件号和块号
BBED> set file 1 block 122
        FILE#           1
        BLOCK#          122

--打印块的结构
BBED> p ktbbh
struct ktbbh, 48 bytes                      @20
   ub1 ktbbhtyp                             @20       0x01 (KDDBTDATA)
   union ktbbhsid, 4 bytes                  @24
      ub4 ktbbhsg1                          @24       0x00000012
      ub4 ktbbhod1                          @24       0x00000012
   struct ktbbhcsc, 8 bytes                 @28
      ub4 kscnbas                           @28       0x26114c0d
      ub2 kscnwrp                           @32       0x0c20
   b2 ktbbhict                              @36       1
   ub1 ktbbhflg                             @38       0x02 (NONE)
   ub1 ktbbhfsl                             @39       0x00
   ub4 ktbbhfnx                             @40       0x00000000
   struct ktbbhitl[0], 24 bytes             @44
      struct ktbitxid, 8 bytes              @44
         ub2 kxidusn                        @44       0x0029
         ub2 kxidslt                        @46       0x0026
         ub4 kxidsqn                        @48       0x0021d127
      struct ktbituba, 8 bytes              @52
         ub4 kubadba                        @52       0x0091a949
         ub2 kubaseq                        @56       0x3d91
         ub1 kubarec                        @58       0x01
      ub2 ktbitflg                          @60       0x2001 (KTBFUPB)
      union _ktbitun, 2 bytes               @62
         b2 _ktbitfsc                       @62       0
         ub2 _ktbitwrp                      @62       0x0000
      ub4 ktbitbas                          @64       0x26114c0f

上面的ktbitxid 即为XID
ktbituba即为UBA
这里主要是要修改 ktbitflg,该结构占据了2个offset,@60表示这个结构的偏移量从60开始,0x2001说明当前值为2001。
修改的时候需要注意一下的是要看big endian还是little endian,对于little endian,其字节序是反的。

查看相关文件的信息
BBED> info
 File#  Name                                                        Size(blks)
 -----  ----                                                        ----------
     1  /oradata/sys/zjrpt/system01.dbf                                  61440


--查看当前的详细信息,最开始的时候offset=20
BBED> show
        FILE#           1
        BLOCK#          122
        OFFSET          20
        DBA             0x0040007a (4194426 1,122)
        FILENAME        /oradata/sys/zjrpt/system01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/oracle_work/file.txt
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No


--指定offset=60
BBED> set offset 60
        OFFSET          60

--查看当前的详细信息,offset已经从前面的60修改为20了
BBED> show
        FILE#           1
        BLOCK#          122
        OFFSET          60
        DBA             0x0040007a (4194426 1,122)
        FILENAME        /oradata/sys/zjrpt/system01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/oracle_work/file.txt
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No

--查看相关的内容,可以看到修改前Offsets=60的情况下,最开始的2个字节为2001,也就是第一个字节为20,第二个字节为01;
--在这里需要再确认一下开头的值是否是2001(big endian)或者0120(little endian)
--如果发现最开始4个字符不是上述值,而是第5到8个字符是上述值
--那么差异可能是因为数据文件存放在裸设备还是文件系统上,块头占了1个字节的差异造成
--那么说明标志位的修改需要从offset=61开始,
BBED> dump
 File: /oradata/sys/zjrpt/system01.dbf (1)
 Block: 122              Offsets:   60 to  571           Dba:0x0040007a
------------------------------------------------------------------------
 20010000 26114c0f 0001006c ffff00ea 040c0368 03680000 006c1f7c 1f3c1efb
 1ebc1e7c 1e3c1e00 1dbe1d82 1d461d06 1cc51c84 1c431c02 1bc21b74 1b351af4
 1ab51a67 1a2b19eb 19aa196a 192a18ed 18ac186f 040c17ed 17a51764 172116e0
 1698165c 162015df 15a21567 152714e6 14a6145e 141d13e0 139f1362 132212e2
 12a11265 122411e7 11a01160 112110de 109b105f 10230fe6 0fa30f62 0f1d0ed8
 0e9c0e5a 0e140dd3 0d940d54 0d130cd3 0c930c57 0c170bd9 0b980b58 0b150ad0
 0a8b0a46 0a0109c1 09810941 090108c0 087d083e 080107bc 077e0742 06fc06bb
 06740632 05f005aa 0564051e 04d80495 04530000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

--以下命令中offset 60还是61,取决与前一步的查询结果
--对于big endian平台来说,将前2个字节由2001修改为8001;如果是little endian平台来说,将前2个字节由0120修改为0180
BBED> modify /x 8001 offset 60
 File: /oradata/sys/zjrpt/system01.dbf (1)
 Block: 122              Offsets:   60 to  571           Dba:0x0040007a
------------------------------------------------------------------------
 80010000 26114c0f 0001006c ffff00ea 040c0368 03680000 006c1f7c 1f3c1efb
 1ebc1e7c 1e3c1e00 1dbe1d82 1d461d06 1cc51c84 1c431c02 1bc21b74 1b351af4
 1ab51a67 1a2b19eb 19aa196a 192a18ed 18ac186f 040c17ed 17a51764 172116e0
 1698165c 162015df 15a21567 152714e6 14a6145e 141d13e0 139f1362 132212e2
 12a11265 122411e7 11a01160 112110de 109b105f 10230fe6 0fa30f62 0f1d0ed8
 0e9c0e5a 0e140dd3 0d940d54 0d130cd3 0c930c57 0c170bd9 0b980b58 0b150ad0
 0a8b0a46 0a0109c1 09810941 090108c0 087d083e 080107bc 077e0742 06fc06bb
 06740632 05f005aa 0564051e 04d80495 04530000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000


--确认修改后的相关的内容
BBED> dump
 File: /oradata/sys/zjrpt/system01.dbf (1)
 Block: 122              Offsets:   60 to  571           Dba:0x0040007a
------------------------------------------------------------------------
 80010000 26114c0f 0001006c ffff00ea 040c0368 03680000 006c1f7c 1f3c1efb
 1ebc1e7c 1e3c1e00 1dbe1d82 1d461d06 1cc51c84 1c431c02 1bc21b74 1b351af4
 1ab51a67 1a2b19eb 19aa196a 192a18ed 18ac186f 040c17ed 17a51764 172116e0
 1698165c 162015df 15a21567 152714e6 14a6145e 141d13e0 139f1362 132212e2
 12a11265 122411e7 11a01160 112110de 109b105f 10230fe6 0fa30f62 0f1d0ed8
 0e9c0e5a 0e140dd3 0d940d54 0d130cd3 0c930c57 0c170bd9 0b980b58 0b150ad0
 0a8b0a46 0a0109c1 09810941 090108c0 087d083e 080107bc 077e0742 06fc06bb
 06740632 05f005aa 0564051e 04d80495 04530000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 

--提交修改和校验
sum apply

然后退出即可

后续出现ora-600 [2662],ora-600 [4993]等异常,通过设置隐含参数等比较容易过去

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号