调用全文检索CONTAINS函数遇到 ora-600 [kdsgrp1]错误

        欢迎关注“数据库运维之道”公众号,一起学习数据库技术!

        本期将为大家分享“调用全文检索CONTAINS函数遇到 ora-600 [kdsgrp1]错误”的解决方案。

        关键词:ORA-600 [kdsgrp1]、ORA 600 [kdsgrp1]、CONTAINS函数、ctxsys.context索引

        客户的业务系统调用某SQL语句抛出“ORA-600 [kdsgrp1]”错误,这个SQL语句的限制条件使用全文检索CONTAINS函数。大家都知道使用like写法进行模糊查询无法使用索引,导致SQL查询效率下降。但是创建ctxsys.context类型索引,可以大大地提升查询效率。

        1、业务表的记录数超过1亿条,调用的SQL语句文本如下,即从某个本文字段中匹配出对应身份证号的记录。

SELECT T.COL1,T.COL2 FROM TAB01 T WHERE CONTAINS(T.COL3,'身份证号码') > 0;

        2、手动调用对应的SQL语句可以重现错误,报错截图如下:

        3、数据库alert日志文件里产生相应的trace跟踪文件。

ORA-00600: internal error code, arguments: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []

Tue Feb 20 11:16:59 2024
Errors in file /u01/app/oracle/diag/rdbms/ywzd/ywzd2/trace/ywzd2_ora_455424.trc  (incident=465338):
ORA-00600: internal error code, arguments: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /u01/app/oracle/diag/rdbms/ywzd/ywzd2/incident/incdir_465338/ywzd2_ora_455424_i465338.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.

        1、DBA经常会遇到ORA-600内部错误,这个错误表示进程遇到意外情况。第一个参数是内部消息编码,此参数和数据库版本号对于确定根本原因起到很关键的作用。此类错误一般是与数据库bug有关。

oerr ora 600
00600, 00000, "internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]"
// *Cause: This is the generic internal error number for Oracle program
//         exceptions. It indicates that a process has encountered a low-level,
//         unexpected condition. The first argument is the internal message 
//         number. This argument and the database version number are critical in
//         identifying the root cause and the potential impact to your system.
// 
// *Action: Visit My Oracle Support to access the ORA-00600 Lookup tool
//          (reference Note 600.1) for more information regarding the specific
//          ORA-00600 error encountered.

        2、执行SQL语句会经历parse(解析) -> exec(执行) -> fetch(从游标中获取数据) 几个过程。在获取数据阶段,数据库无法找到期望的记录时,会抛出ora-600 [kdsgrp1]错误。其中kdsgrp函数是kernel data seek/scan fetch by rowid get row piece的简称。错误发生在内存中,因此可能是仅内存错误,也可能是磁盘损坏导致的错误。一般情况由下面6种情况导致。

(1)Lost writes;(2)Parallel DML issues;(3)Index corruption;(4)Data block corruption;(5)Consistent read [CR] issues;(6)Buffer cache corruption

        3、采用数据库日志管理工具tfactl采集数据库错误前3小时内的日志信息,并结合mos知识库对跟踪文件进行一步排查分析。根据“ Current SQL Statement for this session”标识,查找跟踪文件是否有相关的SQL语句。根据“Plan Table”标识,查找执行计划中调用的索引。通过刷新数据缓存无法解决,然后通过索引分析验证没有损坏情况。

alter system flush buffer_cache;
analyze index <OWNER>.<INDEX NAME> validate structure online;

        4、根据”not found“标识,查找跟踪文件并能匹配到相关记录,说明确实存在索引与表数据不一致。

----- Beginning of Customized Incident Dump(s) -----
kdsDumpState: cdb: 0 dspdb: 0 type: 1
* kdsgrp1-1: ***********************************************
            row 0x50f0422e.5 continuation at: 0x50f0422e.5 file# 323 block# 3162670 slot 5 not found (dscnt: 0)
KDSTABN_GET: 0 ..... ntab: 1
curSlot: 5 ..... nrows: 15

        5、根据file#和block#进一步定位数据库对象,查询出来的结果就是SQL语句中的业务表。然后通过表分析验证表没有损坏情况。

col segment_name for a30
col owner for a20
col partition_name for a20
col tablespace_name for a20
set linesize 1000
select segment_name,partition_name,segment_type,owner,tablespace_name
    from sys.dba_extents
    where file_id=&AFN
    and &bad_block_id between block_id and block_id + blocks-1;
    
Analyze table <OWNER>.<TABLE NAME> validate structure cascade online;

        6、根据Note 285586.1 - ORA-600 [kdsgrp1] 匹配是否有相似问题,结论是没有匹配到解决方案。

        7、根据Oracle Text Health Check (Doc ID 823649.1)提供的脚本,对特定实例的Oracle Text组件的总体运行状况进行检查。结论是检查到SYS用户下有部分对象编译失效。

        8、检查哪些CTXSYS对象是否重复创建,检查确实存在重复对象并且删除。

There are many CTXSYS objects that are incorrectly created in the SYS schema.
set pause off
set heading off
set pagesize 0
set feedback off
set verify off
spool dropsys.sql
select 'DROP ' || object_type || ' SYS.' || object_name || ';'
from dba_objects
where object_name not in ('AQ$_SCHEDULES_PRIMARY','DBMS_REPCAT_AUTH','AQ$_SCHEDULES','PRODUCT_USER_PROFILE','SQLPLUS_PRODUCT_PROFILE','PRODUCT_PRIVS','HELP','HELP_TOPIC_SEQ') and object_name||object_type in
(select object_name||object_type
from dba_objects
where owner = 'SYS')
and owner = 'CTXSYS';
spool off
exit

        结合上述的排查与处置,可以初步推断是数据一致性问题导致(Consistent read [CR] issues),即表数据与索引数据不一致,需重建索引。

        1、非业务高峰期间,开发单位删除该索引,并重新创建索引。

create index ywzd.IDX_PUBLICMATTER57441_2F on ywzd.PUBLICMATTER57441_2 (ZJH)
  indextype is CTXSYS.CONTEXT PARAMETERS ('SYNC (ON COMMIT)');

        2、创建索引后,查看对应的执行计划,cost代价减少至10以内,响应时间秒级以内。

        全文索引是一种提高搜索性能的技术,可以显著加快查找包含特定词语的记录的速度。CONTAINS函数是Oracle数据库中一个非常有用的全文搜索函数,它可以用于查找包含指定词语或表达式的记录,并返回相关性评分。假设我们有一个名为articles的表格,其中有一个名为content的CLOB列,存储了文章的内容。我们想要查找包含特定词语的记录,可以使用如下语句:

这个查询将返回articles表中所有包含Oracle词语的记录。
SELECT *
FROM articles
WHERE CONTAINS(content, 'Oracle');

1、Causes and Solutions for ora-600 [kdsgrp1] (Doc ID 1332252.1)

2、ORA-600 [kdsgrp1] (Doc ID 285586.1)

3、Oracle Text Health Check (Doc ID 823649.1)

4、Oracle C函数查询 - 墨天轮数据库在线运维平台

        以上就是本期关于“调用全文检索CONTAINS函数遇到 ora-600 [kdsgrp1]错误”案例分享。希望能给大家带来帮助!

        欢迎关注“数据库运维之道”公众号,一起学习数据库技术!

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值