前几天上线,凌晨3点多打车回来的路上,兄弟联系我,提了一个问题,某核心系统,上线的时候,报了很多ORA-00933的错误,明显是应用写的SQL出现了错误导致的,但是因为未将出错的SQL打印到日志中,所以不知道究竟是什么SQL出错了,由于逻辑中涉及到很多的SQL,逐个排查,非常耗时。

ORA-00933,意思是“SQL command not properly ended”,明显是SQL的语法出现错误,但是现在的问题,就是如何找到错误的SQL?

第一种考虑,能不能从数据字典视图中找到?

我们执行如下这两条SQL,第一条是错误的,提示ORA-00933,第二条是正确的,

SQL> select object_id from t whereobject_id=1;select object_id from t whereobject_id=1                                      *ERROR at line 1:ORA-00933: SQL command not properly ended

SQL> select object_id from t where object_id=1;no rows selected

此时通过dba_hist_sqltext检索不到任何SQL,

SQL> select sql_id, sql_text from dba_hist_sqltext where sql_text like '%select object%';no rows selected

dba_hist_sqltext是展示在AWR中采集到的属于共享SQL游标的SQL语句,

究其原因,如果SQL语句没有达到AWR的threshold值,是不会记录到 dba_hist_sqltext中的。但是,我们在执行完SQL后手动创建快照,就可以在dba_hist_sqltext中看到,如下所示,但是,只出现执行正确的这条SQL,提示ORA-00933的SQL,并未采集到,

SQL> exec dbms_workload_repository.create_snapshot();PL/SQL procedure successfully completed.

SQL> select sql_id, sql_text from dba_hist_sqltext where sql_text like '%select object%'  2  and sql_text not like '%dba_hist_sqltext%';SQL_ID          SQL_TEXT------------- --------------------------------------------------------------------------------366bf1pphk8vp select object_id from t where object_id=1

我们知道,一条SQL在Oralce中执行的过程,会经过下图中的几个阶段,在解析阶段,会进行SQL的语法检查、语义检查以及共享池中查找是否存在执行过的SQL,如上ORA-00933错误,应该发生在语法解析阶段,所以尚未到达执行阶段,AWR未采集这条SQL,就可以解释通了,

第二种考虑,使用Logminer能从日志中得到SQL?

我们知道Logminer是可以从在线/归档日志中解析出曾经执行过的SQL语句,其实从上面,我们已经知道,ORA-00933错误的SQL根本没到执行阶段,因此从原理上看,不可能写入日志,就无从通过Logminer得到需要的SQL。

P.S.

关于Logminer的使用,可以参考我的好朋友老杨的文章《Logminer:oracle人为误操作之恢复神器》。

当时没想到其他的方法,唯一的做法就是让应用改程序,打印出错的SQL到日志中,这种方法其实很直接,但是毕竟涉及到了改动,还是带来了不便。

后来看了惜分飞老师的文章,有了另外的考虑,SQL语句执行解析失败最大的可能性就是SQL语句语法/权限错误,对于这类问题可以通过设置event 10035进行跟踪,

http://www.xifenfei.com/2019/06/failed-parse-elapsed-time.html

打开10035事件,执行SQL,

SQL> alter system set events '10035 trace name context forever, level 1';System altered.

SQL> select object_id from t whereobject_id=1;select object_id from t whereobject_id=1                                      *ERROR at line 1:ORA-00933: SQL command not properly ended

SQL> alter system set events '10035 trace name context off';System altered.

就可以在alert日志中,看到如下信息,error=933,就是ORA-00933,第二行的SQL,就是要找的,

PARSE ERROR: ospid=18911, error=933 for statement:select object_id from t whereobject_id=1^@

但是这种方法,需要注意,因为一旦打开10035,任何解析错误的SQL都会输出到alert日志中,如果对并发量很高的系统,碰巧解析错误的会执行多次,可能瞬时导致磁盘空间压力,因此Oracle中任何的event,我们在使用前,一定要知道他的副作用,避免带来影响。

现在我们在做的一项工作,就是制定《软件运维能力成熟度模型》,旨在通过设定一些通用的运维需求,采用分级的形式,从定量和定性,两个维度,评估软件的可运维能力,并给出提升指导。其中一项,就是应用执行错误的SQL语句需要打印到应用日志中,包括SQL原文、报错信息、参数等,一方面为监控报警提供数据,另一方面便于问题的排查。

一般的开发人员只会关注系统的功能实现,对其他层面,例如性能、运维等,考虑的很有限,这就对系统运行和问题排查,会产生些影响,或者造成不便,此时,我们就可能需要其他的方法来解决,像上面介绍的10035,但归根结底,一款软件如果要运营的持久,除了系统架构要满足功能,还需要为系统的可扩展性、可维护性等买单,当然,有人说过,“好的系统,不是设计出来的,而是演进来的”,不是说所有的问题都能在设计之初考虑到,但是当出现问题的时候,及时吸取教训,在设计上完善,就算是一种改进,值得做。

抛出错误_如何找到抛出ORA00933错误的SQL相关推荐

  1. office word出现“错误!未找到引用源”的错误

    有时候在word里面插入了一些参考文献,使用交叉引用的方式进行引用,为了点击引用标号时能够自动跳转到末尾的参考文献处. 可以将word文件复制到另一个电脑后,打开文件却发现"错误!未找到引用 ...

  2. python判断正确错误_第16天:Python 错误和异常

    by 闲欢 作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,这些报错信息就是我们接下来要讲的错误和异常. 我们在执行程序语句的时候,经常会看到命令行输出报错信息,例 ...

  3. 主进程中发生javascript错误_你知道 JavaScript 中的错误对象有哪些类型吗?

    每当 JavaScript 中发生任何运行时错误时,都会引发Error对象.在许多情况下,我们还可以扩展这些标准Error对象,以创建我们自己的自定义Error对象. 属性 Error 对象具有2个属 ...

  4. mysql 不显示消息错误_如何编写不吸的错误消息

    mysql 不显示消息错误 by Justin Fuller 贾斯汀·富勒(Justin Fuller) 如何编写不吸的错误消息 (How To Write Error Messages That D ...

  5. mysql导入表的语法错误_导入mysql时出现语法错误

    这是我想在我的数据库中使用的sql,但我有一个问题: -- phpMyAdmin SQL Dump -- version 3.5.1 -- http://www.phpmyadmin.net -- - ...

  6. mysql创建表格显示1064错误_尝试创建表时出现错误1064(Error 1064 when trying to create a table)...

    尝试创建表时出现错误1064(Error 1064 when trying to create a table) 这是代码: create table `team`.`User`( `UserID` ...

  7. ubuntu两个显示器只出一个_双显示器应用程序在错误的显示器

    问题描述 我是ubuntu的新手,现在已经使用了大约一个月.我为神话电视创建了这个桌面,所以我使用双显示器配置(一个监视器用于观看节目,一个用于其他一切).但因为我没有调谐器(还)我只是使用hulu桌 ...

  8. html点击按钮弹出窗口_电脑桌面总是弹出广告怎么办?教你2种方法,轻松解决...

    平常我们在使用电脑时,总会出现很多的弹窗广告,点关闭按钮直接就进入了广告,每次都要浪费时间来关闭广告页面,非常的烦人. 不过最近小编发现了关闭电脑广告弹窗的方法,我们一起来看一看吧! 一.启用弹出窗口 ...

  9. php页面不断弹出值_电脑自动弹出网页怎么办

    电脑自动弹出网页的解决方法:我们可以利用360安全卫士中的弹窗过滤工具来解决此问题.首先我们打开360安全卫士:然后找到弹窗过滤工具:最后选择[强力模式],保存设置即可. 电脑自动弹出网页可以使用36 ...

最新文章

  1. Spring内部bean实例
  2. mysql where 1 作用_MYSQL where 1=1 的作用
  3. 7-4 找到共同的选修课-hebust (10 分)
  4. 如何处理Angular依赖注入的错误消息: NullInjectorError No provider for EffectsRootModule!
  5. php+正则匹配qq,正则表达式对qq号进行验证的实例
  6. 系统调用getopt解析
  7. plc vb c语言编程,[转载]VB6.0在PLC和上位机通讯中的应用【工控老鬼分享】
  8. 微信编辑器有哪些呢?
  9. python生成随机姓名
  10. 牛顿莱布尼茨计算机公式,牛顿莱布尼茨公式
  11. 一分钟掌握卡诺图化简法
  12. 使用scrapy爬取dota2贴吧数据并进行分析 1
  13. 处理debian7下Juk导入音乐乱码
  14. Storm并发度详解(转载)
  15. 基于WPF的科学计算器程序
  16. css鼠标滑过图标显示_CSS和jQuery教程:苹果风格的花式图标滑出导航
  17. 灰度值为50对应的图像RGB计算
  18. yara 模式匹配 android,YARA――恶意软件模式匹配利器
  19. React Native 音频录制例子来解惑入门
  20. WordPress自定义分页代码

热门文章

  1. linux建立普通用户命令,Linux普通用户执行特定的命令配置
  2. android roboto字体下载,Android字体设置及Roboto字体使用方法
  3. java中常量有初始化值吗,java的变量和常量
  4. java socket 推送机制_Java中websocket消息推送的实现代码
  5. python 计时_python怎么实现计时
  6. DevExpress WPF v18.2新版亮点(四)
  7. Photoshop脚本指南——Hello World
  8. 如何通过使用注册项 (.reg) 文件添加、修改或删除注册表子项和值
  9. PHP-代码审计-变量覆盖
  10. 利用shell脚本统计代码行数