Jcat
宠辱不惊,闲看庭前花开花落~~
posts - 173,comments - 67,trackbacks - 0
很多时候,在我们进行数据库操作时,比如drop user,drop table等,经常会遇到这样的错误:
ORA-00604: error occurred at recursive SQL level 1 .

关于Recursive SQL错误:
我们知道,当我们发出一条简单的命令以后,Oracle数据库要在后台解析这条命令,并转换为Oracle数据库的一系列后台操作,这些后台操作统称为递归SQL。
比如create table这样一条简单的DDL命令,Oracle数据库在后台,实际上要把这个命令转换为对于obj$,tab$,col$等底层表的插入操作。Oracle所作的工作可能比我们有时候想的要复杂的多.。

所以对于这样的提示,很多时候是没有丝毫用处的。

这时,我们需要更详细的信息,sql_trace就是一个好办法。
sql_trace实际上就是Oracle内部事件10046的第一个级别,即level=1。通过event 10046, 我们可以得到详细的数据库会话的信息,每个会话究竟在干什么,在等什么。通过对这个事件的学习,我们可以深入的理解和调整Oracle。


结合eygle的文章整理的,SQL Trace更详细的用法请见原文


----------

Event 10046是oracle用于系统性能分析时的一个最重要的事件。当激活这个事件后,将通知oracle kernel追踪会话的相关即时信息,并写入到相应trace文件中。这些有用的信息主要包括sql是如何进行解析,绑定变量的使用情况,话中发生的等待事件等。
Trace文件将会存放在 user_dump_dest 所指向的目录,如,C:\ent\oracle\admin\o10g01\udump

Event 10046可分成不同的级别(level),分别追踪记录不同程度的有用信息。对于这些不同的级别,应当注意的是向下兼容的,即高一级的trace信息包含低于此级的所有信息。
    level 1:跟踪sql语句,包括解析、执行、提取、提交和回滚等。
    level 4:包括变量的详细信息
    level 8:包括等待事件
    level 12:包括绑定变量与等待事件
其中,level 1相当于打开了sql_trace。

在当前会话启用event,可以利用alter session + 事件名称 + level:
SQL> alter session set event ‘10046 trace name context forever, level 12’;

关闭当前会话的event:
SQL> alter session set event ‘10046 trace name context off’;

这里应当值得一提的是,TRACE将消耗相当的系统资源,因此我们在使用TRACE的时候应当慎重。对于正式的系统,应当只在必要的时候进行TRACE操作,并且应当及时关闭。
posted on 2008-12-19 15:19 Jcat 阅读(246) 评论(0)  编辑  收藏 所属分类: Database

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问