专栏首页杨建荣的学习笔记一个SQL语句引发的ORA-00600错误排查(一) (r9笔记第64天)

一个SQL语句引发的ORA-00600错误排查(一) (r9笔记第64天)

最近有一个同事问我一个问题,说他运行一个SQL语句抛出了ORA-00600的错误,想让我帮忙分析一下,这种问题听了确实有兴趣,了解了问题的大体情 况之后,发现这个问题还是值得分析分析的,因为只是客户端调用抛出异常,没有给服务器端带来什么致命的影响,这样的问题还是很耐人寻味的。 简单沟通后,我得到了同事提供的SQL语句和执行环境,语句类似下面的形式:

MERGE INTO (SELECT * FROM TEST_SERVER_LOG WHERE BUY_TIME>=TO_DATE(:1 ,'YYYY-MM-DD HH24:MI:SS') 
                               AND BUY_TIME<TO_DATE(:2 ,'YYYY-MM-DD HH24:MI:SS')
                               AND PUT_DATE=TO_DATE(:3 ,'YYYY-MM-DD')) T
                   USING(SELECT 
                           TO_CHAR(:4 ) AS SN,
                           TO_NUMBER(:5 ) AS GROUP_ID,
                           TO_NUMBER(:6 ) AS SERVER_IP,
                           TO_CHAR(:7 ) AS SERVER_NAME,
                           TO_NUMBER(:8 ) AS WORD,
                           TO_NUMBER(:9 ) AS SERVER,
                           TO_NUMBER(:10 ) AS SCENE,
                           TO_CHAR(:11 ) AS CN_GUID,
                           TO_DATE(:12 ,'YYYY-MM-DD HH24:MI:SS') AS BUY_TIME,
                           TO_NUMBER(:13 ) AS JEWEL_TOTAL,
                           TO_CHAR(:14 ) AS CN,
                           TO_CHAR(:15 ) AS CHARACTER_PUT,
                           TO_CHAR(:16 ) AS IP,
                           TO_NUMBER(:17 ) AS WEAPONID,
                           TO_DATE(:18 ,'YYYY-MM-DD') AS PUT_DATE,
                           TO_NUMBER(:19 ) AS WEAPONID_NEW,
                           TO_NUMBER(:20 ) AS COUNT,
                           TO_NUMBER(:21 ) AS USER_CLASS,
                           TO_CHAR(:22 ) AS CONSUME_WAY,
                           TO_NUMBER(:23 ) AS CLIENT_STYLE,
                           TO_CHAR(:24 ) AS GAME_TYPE
                         FROM DUAL) A
                   ON (T.SN=A.SN)
                   WHEN NOT MATCHED THEN                    INSERT(T.SN,T.GROUP_ID,T.SERVER_IP,T.SERVER_NAME,T.WORD,T.SERVER,T.SCENE,T.CN_GUID,T.BUY_TIME,T.JEWEL_TOTAL,T.CN,T.CHARACTER_PUT,T.IP,T.WEAPONID,T.PUT_DATE,T.WEAPONID_NEW,T.COUNT,T.USER_CLASS,T.CONSUME_WAY,T.CLIENT_STYLE,T.GAME_TYPE)                     VALUES(A.SN,A.GROUP_ID,A.SERVER_IP,A.SERVER_NAME,A.WORD,A.SERVER,A.SCENE,A.CN_GUID,A.BUY_TIME,A.JEWEL_TOTAL,A.CN,A.CHARACTER_PUT, A.IP,A.WEAPONID,A.PUT_DATE,A.WEAPONID_NEW,A.COUNT,A.USER_CLASS,A.CONSUME_WAY,A.CLIENT_STYLE,A.GAME_TYPE)

这样一个语句看起来结构挺复杂,细看逻辑其实倒不复杂。最近处理了几个性能问题,其实有不少都是和Merge的使用有关,这个语句有什么问题呢,目前来看没有直接的问题,唯一的感觉是绑定变量不少啊,另外需要补充一下,数据库版本是11.2.0.3 拿到语句要分析的时候,能够复现问题是非常难得的机遇,有很多的ORA-00600错误要复现需要上下文环境触发一定的条件才可以复现,这个问题让我省了 不少事,我在alert日志中也发现了对应的trace文件。当然这类的trace文件说实话还是蛮枯燥的,看起来基本都是朦朦胧胧。 我没有花太多时间在这个trace上,转而尝试去复现这个问题, 首先我通过v$sql去数据库中查看这个SQL语句,结果查找的很仔细,竟然没有任何的信息,仿佛这个语句没有执行过一般。 然后我切换到属主用户下,尝试生成执行计划。庆幸的是这个时候问题可以复现出来了。 SQL> @600.sql explain plan for MERGE INTO (SELECT * FROM TEST_SERVER_LOG WHERE BUY_TIME>=TO_DATE(:1 ,'YYYY-MM-DD HH24:MI:SS') * ERROR at line 1: ORA-00600: internal error code, arguments: [qcsfbdnp:1], [4], [], [25], [], [], [], [], [], [], [], [] 由此可见,这个语句在SQL解析的时候就会抛出问题。对于这个报错,在MetaLink上进行一番查找,发现相关的bug还真不少,锁定了一个较为符合的bug. Bug 13496884 ORA-600 [qcsfbdnp:1] from Merge Statement with Bind Variables 是和执行Merge相关的,但是查看里面的解释,就是打补丁,没有其它的解决方法。 其实对于ORA-00600的错误,就类似开发中的NULLPointerException,这类问题的边界比较模糊,排查需要花费一些精力。 我的初步感觉就是问题可能出现在两个方面。 1.一个是TEST_SERVER_LOG这个表数据量非常大,是否在Merge中有一定的影响导致 2.语句中含有大量的绑定变量,是否绑定变量数过多导致了Merge的支持出现了问题 于是我朝着这个方向进行了分析和排查。我逐个替换了绑定变量,把它暂时替换为常量,发现错误依旧出现,只是错误的参数部分会有下标的变化。 直到我把整个using部分的绑定变量全部替换掉,最后竟然抛出了一个看起来不大相关的错误。 T.IP,T.WEAPONID,T.PUT_DATE,T.WEAPONID_NEW,T.COUNT,T.USER_CLASS,T.CONSUME_WAY,T.CLIENT_STYLE,T.GAME_TYPE) * ERROR at line 30: ORA-00904: "T"."GAME_TYPE": invalid identifier 看这个问题,是字段不存在,仔细查看源表中的字段信息,发现这个字段还真是不存在,我是如获至宝,好像找到了问题的原因。 select game_type from TEST_SERVER_LOG where rownum<2 * ERROR at line 1: ORA-00904: "GAME_TYPE": invalid identifier 临时修复了这个问题,把这个字段先去掉,语句就可以正常解析了,但是问题的原因是什么呢,这个时候还是稀里糊涂。我尝试在using子句中再次添加一个绑定变量,问题再次出现。 ERROR at line 1: ORA-00600: internal error code, arguments: [qcsfbdnp:1], [7], [], [2], [], [], [], [], [], [], [], [] 所以这个时候我的一个初步结论是,这个错误和绑定变量的个数没有关系,这个问题的直接原因还是因为语句中的一个字段不匹配导致。 那么这个问题是否和数据量有关呢,在咨询了开发的同事之后,发现字段不匹配的问题还是存在一些误解,因为开发提供的用户是另外一个,属主和我测试的也完全不一样。测试的用户中的这个TEST_SERVER_LOG的数据量情况如下: SQL> select count(*)from dystat_bg.TLBB_SERVER_LOG ; COUNT(*) ---------- 1 所以可以证明,这个bug和TEST_SERVER_LOG的数据量无关,和绑定变量的个数无关。 明白了这两点我们再来看看trace文件中的内容: 看到了这么一段,对我们分析这个ORA-00600的错误还是有一些帮助的。 ----- Incident Context Dump ----- Address: 0x7fff07bebbc0 Incident ID: 324423 Problem Key: ORA 600 [qcsfbdnp:1] Error: ORA-600 [qcsfbdnp:1] [4] [] [7] [] [] [] [] [] [] [] [] [00]: dbgexProcessError [diag_dde] [01]: dbgeExecuteForError [diag_dde] [02]: dbgePostErrorKGE [diag_dde] [03]: dbkePostKGE_kgsf [rdbms_dde] [04]: kgeadse [] [05]: kgerinv_internal [] [06]: kgerinv [] [07]: kgeasnmierr [] [08]: qcsfbdnp [SQL_Parser]<-- Signaling [09]: qcpibva [] [10]: qcpiapr [] [11]: qcpiafa [] [12]: qcpiaex [] [13]: qcpifn1 [] [14]: qcpifun [] [15]: qcpiapr [] [16]: qcpiafa [] [17]: qcpiaex [] [18]: qcpiexl [] 报错编码是[qcsfbdnp:1], [7], [], [2], [], [], 这个代表的含义在这个日志中可以看到是熟悉SQL解析器的部分调用出现了问题。 而我们分析问题的时候就可以重新审视这个语句,看看是否存在一些隐患。后续我们继续补充。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:杨建荣

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-07-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个清理脚本的改进思路(r5笔记第51天)

    前几天同事问我一个问题,说在unix环境下有个目录下的文件/文件夹太多了,已经报了开始报系统错误了,客户希望能够定时进行这些目录的清理。 我连到那个环境去查看,...

    jeanron100
  • 关于查看dba_data_files的一个小问题(r7笔记第72天)

    今天帮一个朋友看一个pl/sql的问题,他已经钻到一个死胡同里列,可能明眼人一看就知道哪里有问题,但是当局者迷,所以我抽空看了一下这个pl/sql块。 pl/s...

    jeanron100
  • 关于desc的一个奇怪问题及分析(r2第18天)

    在平时的工作中,desc这个命令可谓短小精悍,可以很方便的查看表结构和not null的情况。 今天在生产环境中碰到一个有些奇怪的desc问题。 首先是数据迁移...

    jeanron100
  • Android 使用代码实现一个选词(拖拽)填空题

    在上一篇文章《Android 使用代码实现一个填空题》中,我们学习了如何实现一个填空题,今天继续接着上一篇文章的节奏,学习一下如何实现一个选词填空题,由于本文中...

    用户2802329
  • 使用人工智能增强人类智能(上)

    来源:Distill 编译:weakish 编者按:本周一,Google Brain的Shan Carter和YC Research的Michael Niels...

    企鹅号小编
  • 面试官:请说出WEB 容器、WEB服务和应用服务器的区别与联系

    何为容器: 容器是一种服务调用规范框架,J2EE 大量运用了容器和组件技术来构建分层的企业级应用。在 J2EE 规范中,相应的有 WEB Container 和...

    Java编程指南
  • unittest的参数化(一)

    之前写了很多关于unittest单元测试框架的文章,本小节主要介绍它在参数化方面的应用,首先需要安装第三方的库parameterized,安装的命令...

    无涯WuYa
  • unittest的参数化

    之前写了很多关于unittest单元测试框架的文章,本小节主要介绍它在参数化方面的应用,首先需要安装第三方的库parameterized,安装的命令...

    Criss@陈磊
  • WGCNA-最短教程掌握高级分析

    先给大家讲讲WGCNA的精髓,其实就一句话:关联表型和基因。WGCNA通过将基因进行分组(module),把基因模块和表型进行关联,实现了快速锁定核心基因的目的...

    用户6317549
  • ADB 学习(2):adb install 命令

    作为一个测试人员,对于手机的应用软件肯定少不了安装到指定的手机设备中,所以 adb install 这个命令是必不可少的。

    Mokwing

扫码关注云+社区

领取腾讯云代金券