0

ORA-0600[kdsgrp1]

问题归档 2019-03-20
170
摘要:ORA-0600报错:FriFeb1518:44:112019RestartingdeadbackgroundprocessCJQ0Fri...

问题描述

ORA -0600报错:

Fri Feb 15 18:44:11 2019
Restarting dead background process CJQ0
Fri Feb 15 18:44:11 2019
CJQ0 started with pid=33, OS id=3992 
Errors in file f:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_cjq0_3992.trc  (incident=210531):
ORA-00600: internal error code, arguments: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
Errors in file f:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_cjq0_3992.trc  (incident=210532):
ORA-00600: internal error code, arguments: [600], [ORA-00600: internal error code, arguments: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
], [], [], [], [], [], [], [], [], [], []

专家解答

ORA-600 [kdsgrp1]错误通常在一些强制open数据库操作之后出现,以我过往的经验一般都是索引和表不一致导致的,可以很容易的模拟出ORA-600 [kdsgrp1]错误,如下所示:

测试过程如下:

SQL> create table t as select rownum a,rownum b from dual connect by rownum<=100;
Table created.
SQL> create index i_t1 on t(a);
Index created.
SQL> select a,DBMS_ROWID.ROWID_RELATIVE_FNO(a.ROWID) FILE_ID,DBMS_ROWID.ROWID_BLOCK_NUMBER(a.ROWID) BLOCK_ID from t a where a=1; 
         A    FILE_ID   BLOCK_ID
---------- ---------- ----------
         1          1      34753

此时bbed手动删除a=1的行,bbed操作过程忽略不计。构造出索引与表不一致的情况。

SQL> select /*+full(t)*/ count(*) from t 
  2  union all
  3  select /*+index(t)*/ count(*) from t where a is not null;
  COUNT(*)
----------
        99
       100

此时通过a=1对索引进行访问,回表时发现行并不存在时就会报ORA-600 [kdsgrp1]

SQL> select /*+index(t)*/ * from t where a=1;
select /*+index(t)*/ * from t where a=1
                            *
ERROR at line 1:
ORA-00600: internal error code, arguments: [kdsgrp1], [], [], [], [], [], [],
[], [], [], [], []

trace会显示:

* kdsgrp1-1: *************************************************
            row 0x004087c1.0 continuation at
            0x004087c1.0 file# 1 block# 34753 slot 0 not found
KDSTABN_GET: 0 ..... ntab: 1
curSlot: 0 ..... nrows: 100
kdsgrp - dump CR block dba=0x004087c1
Block header dump:  0x004087c1
 Object id on Block? Y
 seg/obj: 0x39a5  csc: 0x00.10827c  itc: 3  flg: -  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

重建索引(一定要online哦)后报错消失:

SQL> alter index i_t1 rebuild online;
Index altered.
SQL> select /*+index(t)*/ * from t where a=1;
no rows selected

所以你可以通过trace找出报错的对象,重建该对象所有的索引即可。

「喜欢文章,快来给作者赞赏墨值吧」

评论

0
0
最新发布
暂无内容,敬请期待...
数据库资讯
最新 热门 更多
本月热门
近期活动
全部
暂无活动,敬请期待...
相关课程
全部
暂无课程,敬请期待...