000000001 600000039
ttcpip()+1226CALLopiodr()00000005E 000000017
7FFFA35CB048 000000000
005BEBDB0 600000039
opitsk()+1310CALLttcpip()006AF1FD0 0054A67A0
7FFFA35CB048 000000000
7FFFA35CAB48 7FFFA35CB1B0
opiino()+1024CALLopitsk()000000003 000000000
7FFFA35CB048 000000001
000000000 6AF000900000001
opiodr()+1184CALLopiino()00000003C 000000004
7FFFA35CC248 000000001
000000000 6AF000900000001
opidrv()+548CALLopiodr()00000003C 000000004
7FFFA35CC248 000000000
005BEB860 6AF000900000001
sou2o()+114CALLopidrv()00000003C 000000004
7FFFA35CC248 000000000
005BEB860 6AF000900000001
opimai_real()+163CALLsou2o()7FFFA35CC220 00000003C
005BEB860 6AF000900000001
main()+116CALLopimai_real()000000002 7FFFA35CC2B0
000000004 7FFFA35CC248
005BEB860 6AF000900000001
__libc_start_main()CALLmain()000000002 7FFFA35CC2B0 +253000000004 7FFFA35CC248
005BEB860 6AF000900000001
_start()+41CALL__libc_start_main()00072D134 000000002
7FFFA35CC408 000000000
005BEB860 6AF000900000001 --------------------- Binary Stack Dump ---------------------可以看到,报错发生在删除一个表上。而这个表在数据库中应该是不存在的,或者说即使这个表存在,也不可能建立在这个表空间。那么导致问题的原因应该只有一个,数据字典出现了不一致的状态。
SQL>SELECTts#,COUNT(*)FROMseg$GROUPBYts#;
TS#COUNT(*)---------- ----------1116202112645755014296ROWSselected.SQL>SELECTts#,COUNT(*)FROMtab$GROUPBYts#;
TS#COUNT(*)---------- ----------6429119722475544883072073691012210ROWSselected.可以看到,在SEG$中不存在表空间编号大于6的对象,但是在TAB$中确存在很多。
SQL>SELECTts#,nameFROMts$WHEREname='ALA_TEST';
TS# NAME---------- ------------------------------9ALA_TEST
SQL>SELECTts#,nameFROMts$;
TS# NAME---------- ------------------------------0SYSTEM1UNDOTBS2SYSAUX3TEMP4TBS_15GGX6USERS7PERFSTAT8STATSPACK9ALA_TEST10ROWSselected.可以看到,表空间目前编号只到9,而TAB$中记录的表空间的编号以及到了12。显然这就是导致ORA-600错误的原因。Oracle在删除表空间的时候发现有表存在,但是根据段信息又找不到对应的记录,导致删除无法完成,从而引发了这个错误。
至于数据字典不一致的产生应该是测试环境通过imp导入tab$引起的,对于测试环境而言,这个错误很容易清除掉,直接删除不一致的记录即可,但是对于产品环境而言,不推荐这种方式:
SQL>SELECTts#,COUNT(*)FROMind$GROUPBYts#;
TS#COUNT(*)---------- ----------623911611310323