亚游wwwag8com
你好,游客 登录 注册
背景:
阅读新闻

一个SQL语句引发的ORA-00600错误排查

[日期:2016-07-21] 来源:Linux社区  作者:杨建荣 [字体: ]

亚游wwwag8com,  ZDNetChina5月11日报道:MCI于当地时间本周一披露,一季度亏损3.88亿美元,为了削减成本,重新盈利,公司将在今年下半年裁减员工7500名。裁员人数相当于公司员工总数的1/3。

  主持人:烽火有没有可能走终端,现在很多企业原来做3G的,现在都开始做终端了,有没有这种可能。郭士强当选人大代表率队4连胜 仍肩负夺冠重任  解放军总长陈炳德上将、副总长魏凤和中将,外交部副部长傅莹,中国国防部外事办公室主任钱利华少将、副主任慈国巍少将等及哈、吉、俄、塔、乌驻华使节会见时在座。

最近有一个同事问我一个问题,说他运行一个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.TEST_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解析器的部分调用出现了问题。

而我们分析问题的时候就可以重新审视这个语句,看看是否存在一些隐患。后续我们继续补充。

更多详情见请继续阅读下一页的精彩内容亚游wwwag8com/wwwd35clinuxidcd35ccom/Linux/2016-07/133393p2.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
提供未经审核境外游戏下载 Tap Tap将停业整顿三个… 动力煤价格继续回调空间有限 乌克兰完成加入北约关键一步:获北约“申请国”身份 原油 宽幅振荡概率大 中国“大飞机家族三兄弟”公布最新进展 这些印度人被猴子“盯上了” 有人已被袭击过7次 厄齐尔事件或使德国人才流失 移民后裔还愿卖命吗 奥飞娱乐三次转型蝶变:泛娱乐帝国呼之欲出 王毅披露:习近平将出席金砖国家领导人峰会 我中将:南海岛礁武器并非针对哪国 谁侵略就针对谁 农业农村部:今年大豆补贴标准要高于玉米 余额宝T+0赎回日额度5万降至1万
哈里王子即将大婚 五千名媒体人士将参加婚礼 失意小伙购彩7载擒体彩1244万 揽人生第一桶金 金砖之父:中国消费者崛起是世界经济最重要因素 牛汇:3月9日外汇交易提醒 台媒:名嘴撕裂台湾 岛内媒体助长反智的民粹 日本家庭对围棋将棋多了解? 知道围棋仅2.2% 美国科技股大溃败 FAANG市值 一月蒸发4000亿 葡萄牙世界杯初步名单:C罗领衔 中超大将入围 科沃斯上市拟融资7.5亿 家庭服务机器人大战升级 于德豪:我想成为伟大球员 感谢球迷们的质疑 眼屎太多可能得了这种病 一定不要大意 陈云波:脱欧过渡期谈判不利 英镑下跌
京津冀等地有霾和雾 华南江南等地将迎降水 专家谈组建农业农村部:捋顺农村管理利于乡村振兴 查尔斯顿赛卫冕冠军送隐形蛋 苦战三盘进16强 3X3比5V5难在哪?重庆冠军:进攻时间更紧张 男子不甘“被分手”连撞四车逼停女友 涉酒驾被查 汶川威州镇岷江大桥路口处山体垮塌 道路双向中断 基因能在不同物种之间跳转,真的很酷! 高速爆胎一招即可停车 关键时刻能救你命 美能源部长:将向国际市场出口更多原油和天然气 外交部:提醒在马尔代夫公民加强安全防范 纽约汇市:美元连续第二天上涨 投资者寻求避险 警方通报“城管执法车撞人”:非毒驾 司机被刑拘 重庆市委书记:坚决肃清孙政才影响和“薄王”遗毒 亚游wwwag8com