[转载]Oracle诊断案例-Sql_trace之二
<P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1483915 style="FONT-SIZE: 12px">信息来源:邪恶八进制信息安全团队</SPAN></FONT></P><P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script style="FONT-SIZE: 12px">问题说明:<BR><BR>很多时候<BR>在我们进行数据库操作时<BR>比如drop user,drop table等,经常会遇到这样的错误<BR><BR></P></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>ORA</FONT><FONT color=#007700>-</FONT><FONT color=#0000bb>00604</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>error occurred at recursive SQL level 1 </FONT><FONT color=#007700>.<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><BR><FONT size=2>这样的提示,很多时候是没有丝毫用处的.<BR>本案例就这一类问题提供一个思路及方法供大家参考.</FONT></SPAN></FONT> <P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1483917 style="FONT-SIZE: 12px"><STRONG>1. drop user出现问题</STRONG><BR><BR>报出以下错误后退出<BR><BR></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>ORA</FONT><FONT color=#007700>-</FONT><FONT color=#0000bb>00604</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>error occurred at recursive SQL level 1
<BR>ORA</FONT><FONT color=#007700>-</FONT><FONT color=#0000bb>00942</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>table </FONT><FONT color=#007700>or </FONT><FONT color=#0000bb>view does not exist </FONT><FONT color=#007700>.<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><BR><BR><FONT size=2>关于 recursive SQL 错误<BR>我们有必要做个简单说明.<BR><BR>我们知道,当我们发出一条简单的命令以后 <BR>Oracle数据库要在后台解析这条命令,并转换为Oracle数据库的一系列后台操作.<BR>这些后台操作统称为递归sql<BR><BR>比如create table这样一条简单的DDL命令<BR>Oracle数据库在后台,实际上要把这个命令转换为<BR>对于obj$,tab$,col$等底层表的插入操作.<BR><BR>Oracle所作的工作可能比我们有时候想的要复杂的多.</FONT></SPAN></FONT> <P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1483918 style="FONT-SIZE: 12px"><STRONG>2.跟踪问题</STRONG><BR><BR>我们知道Oracle提供sql_trace的功能<BR>可以用于跟踪Oracle数据库的后台递归操作.<BR><BR>通过跟踪文件,我们可以找到问题的所在<BR>以下是格式化(tkprof)后的输出:<BR><BR></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR></FONT><FONT color=#007700>********************************************************************************
<BR>
<BR></FONT><FONT color=#0000bb>The following statement encountered a error during parse</FONT><FONT color=#007700>:
<BR>
<BR></FONT><FONT color=#0000bb>DELETE FROM SDO_GEOM_METADATA_TABLEWHERE SDO_OWNER </FONT><FONT color=#007700>= </FONT><FONT color=#dd0000>'WAPCOMM'
<BR>
<BR></FONT><FONT color=#0000bb>Error encountered</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>ORA</FONT><FONT color=#007700>-</FONT><FONT color=#0000bb>00942
<BR></FONT><FONT color=#007700>********************************************************************************
<BR>.<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><FONT size=2>Oracle把错误信息首先呈现出来<BR>我们看到ORA-00942错误是由于SDO_GEOM_METADATA_TABLE表/视图不存在所致<BR><BR>问题由此可以定位<BR><BR>对于这一类的错误,定位问题以后解决的方法就要依据具体问题原因而定了。</FONT></SPAN></FONT> <P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1483920 style="FONT-SIZE: 12px"><STRONG>3.问题定位</STRONG><BR><BR>对于本案例,通过Metalink获得以下解释:<BR><BR>Problem Description <BR>------------------- <BR>The Oracle Spatial Option has been installed and you are encountering <BR>the following errors while trying to drop a user, who has no spatial tables, <BR>connected as SYSTEM: <BR><BR>ERROR at line 1: <BR>ORA-00604: error occurred at recursive SQL level 1 <BR>ORA-00942: table or view does not exist <BR>ORA-06512: at line 7 <BR><BR><BR>A 942 error trace shows the failing SQL statement as: <BR><BR><BR>DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = '<user>' <BR><BR><BR>Solution Description <BR><BR>-------------------- <BR><BR>(1) Create a synonym for SDO_GEOM_METADATA_TABLE under SYSTEM which points to <BR><BR>MDSYS.SDO_GEOM_METADATA_TABLE. <BR><BR><FONT color=blue>对于本例,为MDSYS.SDO_GEOM_METADATA_TABLE创建一个同义词即可解决.<BR>是相对简单的情况.<BR></FONT><BR>(2) Now the user can be dropped connected as SYSTEM. <BR><BR><BR>Related Documents <BR><BR>----------------- <BR><Note.159776.1> ORA-604 and ORA-942 Reported During DROP USER CASCA</SPAN></FONT></P> <P><FONT face="verdana, arial, helvetica" size=2><SPAN class=java script id=text1483921 style="FONT-SIZE: 12px"><STRONG>4.实际处理</STRONG><BR><BR>MDSYS.SDO_GEOM_METADATA_TABLE为Spatial对象<BR>如果未使用Spatial选项,可以删除<BR><BR></FONT>
<BLOCKQUOTE><PRE><FONT size=2><FONT face=verdana,arial,helvetica>代码:</FONT><HR></FONT><CODE><FONT color=#000000>
<FONT color=#0000bb><BR>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>connect </FONT><FONT color=#007700>/ as </FONT><FONT color=#0000bb>sysdba
<BR>Connected</FONT><FONT color=#007700>.
<BR>
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>select </FONT><FONT color=#007700>* </FONT><FONT color=#0000bb>from dba_sdo_geom_metadataorder by owner</FONT><FONT color=#007700>;
<BR></FONT><FONT color=#0000bb>select </FONT><FONT color=#007700>* </FONT><FONT color=#0000bb>from dba_sdo_geom_metadataorder by owner
<BR></FONT><FONT color=#007700>*
<BR></FONT><FONT color=#0000bb>ERROR at line 1</FONT><FONT color=#007700>:
<BR></FONT><FONT color=#0000bb>ORA</FONT><FONT color=#007700>-</FONT><FONT color=#0000bb>00942</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>table </FONT><FONT color=#007700>or </FONT><FONT color=#0000bb>view does not exist
<BR>ORA</FONT><FONT color=#007700>-</FONT><FONT color=#0000bb>04063</FONT><FONT color=#007700>: </FONT><FONT color=#0000bb>view </FONT><FONT color=#dd0000>"MDSYS.DBA_SDO_GEOM_METADATA" </FONT><FONT color=#0000bb>has errors
<BR>
<BR>
<BR>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>select object_name from dba_objects where object_name like </FONT><FONT color=#dd0000>'%SDO%'</FONT><FONT color=#007700>;
<BR>
<BR></FONT><FONT color=#0000bb>OBJECT_NAME
<BR></FONT><FONT color=#007700>--------------------------------------------------------------------------------
<BR></FONT><FONT color=#0000bb>ALL_SDO_GEOM_METADATA
<BR>ALL_SDO_INDEX_INFO
<BR>ALL_SDO_INDEX_METADATA
<BR>DBA_SDO_GEOM_METADATA
<BR>DBA_SDO_INDEX_INFO
<BR>DBA_SDO_INDEX_METADATA
<BR></FONT><FONT color=#007700>....
<BR></FONT><FONT color=#0000bb>DBA_SDO_GEOM_METADATA
<BR>DBA_SDO_INDEX_INFO
<BR></FONT><FONT color=#007700>...
<BR></FONT><FONT color=#0000bb>SDO_WITHIN_DISTANCE
<BR>USER_SDO_GEOM_METADATA
<BR>USER_SDO_INDEX_INFO
<BR>USER_SDO_INDEX_METADATA
<BR>
<BR>88 rows selected</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>drop user MDSYS cascade</FONT><FONT color=#007700>;
<BR>
<BR></FONT><FONT color=#0000bb>User dropped</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>select owner</FONT><FONT color=#007700>,</FONT><FONT color=#0000bb>type_name from dba_types where type_name like </FONT><FONT color=#dd0000>'SDO%'</FONT><FONT color=#007700>;
<BR>
<BR></FONT><FONT color=#0000bb>no rows selected
<BR>
<BR>SQL</FONT><FONT color=#007700>>
<BR>
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>alter session set sql_trace</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>true</FONT><FONT color=#007700>;
<BR>
<BR></FONT><FONT color=#0000bb>Session altered</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>drop user wapcomm</FONT><FONT color=#007700>;
<BR>
<BR></FONT><FONT color=#0000bb>User dropped</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> </FONT><FONT color=#0000bb>alter session set sql_trace</FONT><FONT color=#007700>=</FONT><FONT color=#0000bb>false</FONT><FONT color=#007700>;
<BR>
<BR></FONT><FONT color=#0000bb>Session altered</FONT><FONT color=#007700>.
<BR>
<BR></FONT><FONT color=#0000bb>SQL</FONT><FONT color=#007700>> exit
<BR></FONT><FONT color=#0000bb>Disconnected from Oracle8i Enterprise Edition Release 8.1.7.4.0 </FONT><FONT color=#007700>- </FONT><FONT color=#0000bb>64bit Production
<BR>With the Partitioning option
<BR>JServer Release 8.1.7.4.0 </FONT><FONT color=#007700>- </FONT><FONT color=#0000bb>64bit Production
<BR></FONT><FONT color=#007700>.<BR></FONT></FONT></CODE><HR></PRE></BLOCKQUOTE><FONT face="verdana, arial, helvetica"><BR><BR><FONT size=2>这时用户得以顺利drop</FONT></SPAN></FONT> <STRONG>一点总结</STRONG><BR><BR>使用sql_trace可以跟踪数据库的很多后台操作<BR>有利于我们发现问题的所在<BR><BR>很多时候,我们想要研究Oracle的内部活动或后台操作<BR>也可以通过sql_trace跟踪<BR><BR>sql_trace/10046 是Oracle提供的最为有效的诊断工具之一.
页:
[1]