Oracle診斷案例-Sql_trace之二
2024-08-29 13:48:40
供稿:網友
link:
http://www.eygle.com/case/sql_trace_2.htm
問題說明:
很多時候
在我們進行數據庫操作時
比如drop user,drop table等,經常會碰到這樣的錯誤
ORA-00604: error occurred at recursive SQL level 1 .
這樣的提示,很多時候是沒有絲毫用處的.
本案例就這一類問題提供一個思路及方法供大家參考.
1. drop user出現問題
報出以下錯誤后退出
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist .
關于 recursive SQL 錯誤
我們有必要做個簡單說明.
我們知道,當我們發出一條簡單的命令以后
Oracle數據庫要在后臺解析這條命令,并轉換為Oracle數據庫的一系列后臺操作.
這些后臺操作統稱為遞歸sql
比如create table這樣一條簡單的DDL命令
Oracle數據庫在后臺,實際上要把這個命令轉換為
對于obj$,tab$,col$等底層表的插入操作.
Oracle所作的工作可能比我們有時候想的要復雜的多.
2.跟蹤問題
我們知道Oracle提供sql_trace的功能
可以用于跟蹤Oracle數據庫的后臺遞歸操作.
通過跟蹤文件,我們可以找到問題的所在
以下是格式化(tkPRof)后的輸出:
********************************************************************************
The following statement encountered a error during parse:
DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = 'WAPCOMM'
Error encountered: ORA-00942
********************************************************************************
Oracle把錯誤信息首先呈現出來
我們看到ORA-00942錯誤是由于SDO_GEOM_METADATA_TABLE表/視圖不存在所致
問題由此可以定位
對于這一類的錯誤,定位問題以后解決的方法就要依據具體問題原因而定了。
3.問題定位
對于本案例,通過Metalink獲得以下解釋:
Problem Description
-------------------
The Oracle Spatial Option has been installed and you are encountering
the following errors while trying to drop a user, who has no spatial tables,
connected as SYSTEM:
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
ORA-06512: at line 7
A 942 error trace shows the failing SQL statement as:
DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = '<user>'
Solution Description
--------------------
(1) Create a synonym for SDO_GEOM_METADATA_TABLE under SYSTEM which points to
MDSYS.SDO_GEOM_METADATA_TABLE.
對于本例,為MDSYS.SDO_GEOM_METADATA_TABLE創建一個同義詞即可解決.
是相對簡單的情況.
(2) Now the user can be dropped connected as SYSTEM.
Related Documents
-----------------
<Note.159776.1> ORA-604 and ORA-942 Reported During DROP USER CASCA
4.實際處理
MDSYS.SDO_GEOM_METADATA_TABLE為Spatial對象
假如未使用Spatial選項,可以刪除
SQL> connect / as sysdba
Connected.
SQL> select * from dba_sdo_geom_metadata order by owner;
select * from dba_sdo_geom_metadata order by owner
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-04063: view "MDSYS.DBA_SDO_GEOM_METADATA" has errors
SQL> select object_name from dba_objects where object_name like '%SDO%';
OBJECT_NAME
--------------------------------------------------------------------------------
ALL_SDO_GEOM_METADATA
ALL_SDO_INDEX_INFO
ALL_SDO_INDEX_METADATA
DBA_SDO_GEOM_METADATA
DBA_SDO_INDEX_INFO
DBA_SDO_INDEX_METADATA
....
DBA_SDO_GEOM_METADATA
DBA_SDO_INDEX_INFO
...
SDO_WITHIN_DISTANCE
USER_SDO_GEOM_METADATA
USER_SDO_INDEX_INFO
USER_SDO_INDEX_METADATA
88 rows selected.
SQL> drop user MDSYS cascade;
User dropped.
SQL> select owner,type_name from dba_types where type_name like 'SDO%';
no rows selected
SQL>
SQL> alter session set sql_trace=true;
Session altered.
SQL> drop user wapcomm;
User dropped.
SQL> alter session set sql_trace=false;
Session altered.
SQL> exit
Disconnected from Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit ProdUCtion
With the Partitioning option
JServer Release 8.1.7.4.0 - 64bit Production
這時用戶得以順利drop
5.一點總結
使用sql_trace可以跟蹤數據庫的很多后臺操作
有利于我們發現問題的所在
很多時候,我們想要研究Oracle的內部活動或后臺操作
也可以通過sql_trace跟蹤
sql_trace/10046 是Oracle提供的最為有效的診斷工具之一.