Oracle诊断案例-Sql_trace之二


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 = '

  1<user>'   
  2  
  3  
  4Solution Description   
  5  
  6\--------------------   
  7  
  8(1) Create a synonym for SDO_GEOM_METADATA_TABLE under SYSTEM which points to   
  9  
 10MDSYS.SDO_GEOM_METADATA_TABLE.   
 11  
 12对于本例,为MDSYS.SDO_GEOM_METADATA_TABLE创建一个同义词即可解决.   
 13是相对简单的情况.   
 14  
 15(2) Now the user can be dropped connected as SYSTEM.   
 16  
 17  
 18Related Documents   
 19  
 20\-----------------   
 21<note.159776.1> ORA-604 and ORA-942 Reported During DROP USER CASCA   
 22  
 23  
 24  
 25  
 264.实际处理   
 27  
 28MDSYS.SDO_GEOM_METADATA_TABLE为Spatial对象   
 29如果未使用Spatial选项,可以删除   
 30  
 31  
 32  
 33  
 34  
 35  
 36  
 37  
 38SQL&gt; connect / as sysdba   
 39Connected.   
 40  
 41  
 42SQL&gt; select * from dba_sdo_geom_metadata order by owner;   
 43select * from dba_sdo_geom_metadata order by owner   
 44*   
 45ERROR at line 1:   
 46ORA-00942: table or view does not exist   
 47ORA-04063: view "MDSYS.DBA_SDO_GEOM_METADATA" has errors   
 48  
 49  
 50SQL&gt; select object_name from dba_objects where object_name like '%SDO%';   
 51  
 52OBJECT_NAME   
 53\--------------------------------------------------------------------------------   
 54ALL_SDO_GEOM_METADATA   
 55ALL_SDO_INDEX_INFO   
 56ALL_SDO_INDEX_METADATA   
 57DBA_SDO_GEOM_METADATA   
 58DBA_SDO_INDEX_INFO   
 59DBA_SDO_INDEX_METADATA   
 60....   
 61DBA_SDO_GEOM_METADATA   
 62DBA_SDO_INDEX_INFO   
 63...   
 64SDO_WITHIN_DISTANCE   
 65USER_SDO_GEOM_METADATA   
 66USER_SDO_INDEX_INFO   
 67USER_SDO_INDEX_METADATA   
 68  
 6988 rows selected.   
 70  
 71SQL&gt; drop user MDSYS cascade;   
 72  
 73User dropped.   
 74  
 75SQL&gt; select owner,type_name from dba_types where type_name like 'SDO%';   
 76  
 77no rows selected   
 78  
 79SQL&gt;   
 80  
 81  
 82SQL&gt; alter session set sql_trace=true;   
 83  
 84Session altered.   
 85  
 86SQL&gt; drop user wapcomm;   
 87  
 88User dropped.   
 89  
 90SQL&gt; alter session set sql_trace=false;   
 91  
 92Session altered.   
 93  
 94SQL&gt; exit   
 95Disconnected from Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit Production   
 96With the Partitioning option   
 97JServer Release 8.1.7.4.0 - 64bit Production   
 98  
 99  
100  
101  
102这时用户得以顺利drop   
103  
104  
105  
1065.一点总结   
107  
108使用sql_trace可以跟踪数据库的很多后台操作   
109有利于我们发现问题的所在   
110  
111很多时候,我们想要研究Oracle的内部活动或后台操作   
112也可以通过sql_trace跟踪   
113  
114sql_trace/10046 是Oracle提供的最为有效的诊断工具之一.</note.159776.1></user>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus