很多時候,在我們進行數據庫操作時,比如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 閱讀(255)
評論(0) 編輯 收藏 所屬分類:
Database