Email: service@parnassusdata.com 7 x 24 online support!
ora-600 [4000]异常导致Open Database失败 使用bbed解决一例
如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com
近日在客户这边,测试环境遇到ora-600 [4000]异常,无法打开数据库.
造成ORA-00600 [4000]错误的主要原因是因为系统掉电,或者数据库恢复不完
以下是通过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 <32 bytes per line> --提交修改和校验 sum apply 然后退出即可 后续出现ora-600 [2662],ora-600 [4993]等异常,通过设置隐含参数等比较容易过去