这里我们讨论下如何诊断一些未预料的 Oracle 错误(ORA-NNNN)。
在诊断问题前,做一些例行询问(按经验总结,尝试形成一种模式),例如:
1. 是否总是同一个用户/应用造成的?
2. 是否是在数据导入时发生?
3. 问题是在做了哪些操作或修改了哪些之后产生的?
之后,我们需要收集更多信息以了解错误是如何产生的,甚至到哪些语句触发了此问题(如果问题是由一个递归 SQL 语句造成的话)。为了达到此目的我们需要在会话级或实例级建立 Errorstack 事件. 如果你能很容易地重现问题, 那么用会话级,否则则需要在实例级建立事件。
因此,假设我们收到一个 ORA-904 "invalid column"报错,我们可以使用:
alter session set events '904 trace name errorstack level 3';
或
alter system set events '904 trace name errorstack level 3';
或
event = "904 trace name errorstack level 3" (in the init.ora)
一旦我们获取了trace文件, 我们就能从以下对象中找出实际产生错误的SQL语句:
1. "当前执行的 SQL"
2. "当前执行的游标"
然后你就能直接通过这些找到的 SQL 来重现问题。 而这已经足以用来确认出原因。