天天看点

drop table 报ora-00942 表或者视图不存在//SQL_TRACE的基本用法

案例四:Sql_trace进行Oracle诊断案例

  问题说明:很多时候,在我们进行数据库操作时,比如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 = ''

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

ORA-604 and ORA-942 Reported During DROP USER CASCA

4.实际处理

  MDSYS.SDO_GEOM_METADATA_TABLE为Spatial对象

  如果未使用Spatial选项,可以删除

SQL> connect / as sysdbaConnected.

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

----------------------------------------------------------------------------------------------------------

sql_trace是oracle提供的一个非常好的跟踪工具,主要用来检查数据库的异常情况,通过跟踪数据库的活动,找到有问题的语句。

一、概述:

    SQL_TRACE是Oracle的一个非常强大的工具。打开SQL_TRACE就可以逐步捕获任何一个会话的数据库活动,或者捕获整个数据库的活动,并将数据库活动记录成跟踪文件。每次使用完之后需要关闭跟踪,否则会降低系统的性能。

    SQL_TRACE可以帮助诊断许多问题,其中包括:

二、用法:

   1、文件跟踪的分类:

      跟踪DBA可以采用两种方式进行跟踪:

    . 跟踪整个数据库实例。只需要简单的修改参数文件(pfile/spfile)参数 SQL_TRACE = TRUE ,然后重新启动数据库即可。在全局启用SQL_TRACE会导致所有进程的活动被跟踪,包括后台进程及所有用户进程,这样也会数据库导致性能下降比较明显。

    . 会话级跟踪。SQL_TRACE的通常使用方式是仅跟踪一个会话。被跟踪的会话可以是您自己的,也可以是其它用户的会话。如果是自己的会话,只需要在SQL*PLUS中运行一下命令即可:

      SQL> alter session set sql_trace = true;

      类似的如果取消对会话的跟踪,运行一下命令:

      SQL> alter session set sql_trace = false;

      如果需要跟踪一个特定的会话,首先需要获取会话的SID和Serial#,这些信息可以在视图V$SESSION中获得,一旦知道了这两个参数,就可以运行一下命令:

      SQL> execute SYS.dbms_system.set_sql_trace_in_session(13,9,true);

      同样也可以使用这个过程关闭会话跟踪:

    SQL> execute SYS.dbms_system.set_sql_trace_in_session(13,9,false);

  2、跟踪文件的位置:

     一旦为会话激活了SQL_TRACE,ORACLE就会在udump管理区创建跟踪文件,文件的目标位置由参数user_dump_dest来确定。每个操作都不会覆盖原来的文件,新的跟踪记录将会被追加到文件末尾。通常情况下,可以根据文件的修改时间判断目录下哪个文件是最新的文件。

   SQL> show parameter user_dump_dest;

   NAME                                 TYPE        VALUE

   ------------------------------------ ----------- ------------------------------

   user_dump_dest                       string      d:oracleadminora9iudump

   也可以通过以下SQL来确定文件名:

     select d.value||''||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name 

   from 

   (

    select p.spid     

      from sys.v$mystat m,sys.v$session s,sys.v$process p

     where m.statistic# = 1

       and s.sid = m.sid

       and p.addr = s.paddr

   ) p,

   (

   select t.instance

     from sys.v$thread  t,sys.v$parameter  v 

    where v.name = 'thread'

      and ( v.value = 0 or t.thread# = to_number(v.value) )

   ) i, 

   (

   select value from sys.v$parameter where name = 'user_dump_dest'

   ) d ;

   TRACE_FILE_NAME

   --------------------------------------------------------------------------------

   d:oracleadminora9iudumpora9i_ora_2060.trc  

 3、计时信息:

    为了最大限度的利用跟踪文件,应该打开计时标志,通过参数TIMED_STATISTICTS=TRUE进行设置,这样可以对每个SQL语句的执行时间等进行记录,这个功能对系统性能的负担很小。

    打开会话的计时信息:

    SQL> alter session set timed_statistics = true ;

    打开数据库系统的计时信息

    SQL> alter system set timed_statistics = true ;

 4、TKPROF:

    通过前三步的设置已经知道如何生成SQL跟踪文件了,ORACLE生成的跟踪文件阅读起来很困难(也就是易读性很差),可以看跟踪文件的一部分,执行以下SQL语句:

   SQL> select count(*) from sys_dept;

    COUNT(*)

   ----------

          16   

   执行完后,查看跟踪文件中这个语句的内容如下:

    PARSING IN CURSOR #1 len=31 dep=0 uid=62 oct=3 lid=62 tim=14727407741 hv=2200985491 ad='128e3820'

   select count(*) from sys_dept

   END OF STMT

   PARSE #1:c=0,e=16348,p=1,cr=31,cu=0,mis=1,r=0,dep=0,og=4,tim=14727407735

   EXEC #1:c=0,e=24,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=14727407814

   FETCH #1:c=0,e=15641,p=5,cr=7,cu=0,mis=0,r=1,dep=0,og=4,tim=14727423807

   =====================

   PARSING IN CURSOR #2 len=61 dep=0 uid=62 oct=47 lid=62 tim=14727508742 hv=3517412409 ad='12bbcff4'

   begin :id := sys.dbms_transaction.local_transaction_id; end;

   END OF STMT

   PARSE #2:c=0,e=122,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=14727508735

   EXEC #2:c=0,e=144,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=14727508945

   =====================

   PARSING IN CURSOR #2 len=61 dep=0 uid=62 oct=47 lid=62 tim=14727587562 hv=3517412409 ad='12bbcff4'

   begin :id := sys.dbms_transaction.local_transaction_id; end;

   END OF STMT

   PARSE #2:c=0,e=121,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=14727587556

   EXEC #2:c=0,e=97,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=4,tim=14727587721

   这样不仅阅读麻烦,并且也有很多内容难以理解。ORACLE提供了一个格式化跟踪文件的工具 - TKPROF( Transient Kernel Profiler ),通过这个工具能将SQL文件转化为分析人员容易理解的格式。

    一般TKPROF工具的使用的简单方法,只用到了两个关键字:跟踪文件名和输出文件名 (TKPROF的具体请参阅其他资料):

    TKPROF <trace file> <output file>

    在命令行模式下运行(数据库在window2000下安装的)

    C:>tkprof D:oracleadminora9iudumpora9i_ora_2060.trc d:report.txt

    执行完后,在reprot.txt中查询刚才的语句内容如下:

    select count(*)

   from

   sys_dept

   call     count       cpu    elapsed       disk      query    current        rows

   ------- ------  -------- ---------- ---------- ---------- ----------  ----------

   Parse        1      0.00       0.01          1         31          0           0

   Execute      1      0.00       0.00          0          0          0           0

   Fetch        1      0.00       0.01          5          7          0           1

   ------- ------  -------- ---------- ---------- ---------- ----------  ----------

   total        3      0.00       0.03          6         38          0           1

   Misses in library cache during parse: 1

   Optimizer goal: CHOOSE

   Parsing user id: 62     

   通过设置tkprof的关键字[EXPLAIN = <username/password>],也可以在跟踪文件中增加SQL语句的执行计划:

  C:>tkprof D:oracleadminora9iudumpora9i_ora_2060.trc d:report.txt explain=test/test;  

  ********************************************************************************

  select count(*)

  from

   sys_dept

  call     count       cpu    elapsed       disk      query    current        rows

  ------- ------  -------- ---------- ---------- ---------- ----------  ----------

  Parse        2      0.00       0.01          1         31          0           0

  Execute      2      0.00       0.00          0          0          0           0

  Fetch        2      0.00       0.01          5         14          0           2

  ------- ------  -------- ---------- ---------- ---------- ----------  ----------

  total        6      0.00       0.03          6         45          0           2

  Misses in library cache during parse: 1

  Optimizer goal: CHOOSE

  Parsing user id: 62 

  Rows     Row Source Operation

  -------  ---------------------------------------------------

        1  SORT AGGREGATE

       16   TABLE ACCESS FULL SYS_DEPT