使用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
本文来自CSDN博客,转载来至:http://blog.csdn.net/super_marioli/archive/2010/05/24/5619996.aspx
分享到:
相关推荐
### Oracle数据库基本操作知识点 #### 一、表空间操作 **1. 文件系统:** - **创建表空间:** - **数据表空间:** ```sql CREATE TABLESPACE tablespace_name LOGGING DATAFILE '/XXX/xxx/datafile_name1.ora'...
下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 1、用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_...
Oracle数据库是全球广泛使用的大型关系型数据库系统,其SQL语法丰富多样,对于DBA(数据库管理员)来说,熟练掌握Oracle ..."ora常用sql"文件很可能是对这些概念和用法的实例展示,对于深入理解Oracle SQL非常有价值。
- 使用`v$SQL`视图来查找消耗CPU或I/O最多的SQL语句。 - 通过`DBMS_SQL_MONITOR`包或`v$sql_monitor`视图监控特定SQL语句的性能。 5. **如何跟踪某个session的SQL** - 可以使用`DBMS_SQL_TRACE`包来开启特定...
- SQL监控:`SQLTRACE`和`10046`事件可以追踪SQL执行细节。 - AWR报告:Automatic Workload Repository提供周期性性能快照,通过`DBMS_WORKLOAD_REPOSITORY`包生成报告。 6. 数据库备份与恢复: - 使用RMAN...
可以使用`DBMS_MONITOR.SQL_TRACE_ENABLE`和`DBMS_MONITOR.PROCEDURE_TRACE_ENABLE`函数来跟踪函数或存储过程的执行情况。 - **4.10 多种业务使用同一数据库如何分配回滚段** 分配回滚段时需要考虑各种业务的并发...
- 使用 `EXPLAIN PLAN` 命令结合 `SET STATEMENT_ID` 设置语句标识符,然后使用 `UTL_XPLAN` 包提供的函数 `UTL_XPLAN.DISPLAY` 或者 `DBMS_XPLAN.DISPLAY` 来显示 SQL 语句的执行计划。 #### 17. 缓冲区缓存管理 ...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,对于初学者来说,掌握其基本概念、操作和常见问题的解决方法至关重要。"Oracle常用傻瓜问题1000问"这个资源显然是为了解答初学者在学习过程中可能遇到的各种...
- **重建母表**:使用 `DROP TABLE` 和 `CREATE TABLE` 语句。 - **激活外键约束**:重建完成后,重新启用子表的外键约束。 #### 13. 解释归档和非归档模式之间的不同和它们各自的优缺点 - **归档模式**:支持完整...
- 使用 `ALTER DATABASE BACKUP CONTROLFILE TO TRACE` 命令创建一个控制文件的跟踪文件。 - 跟踪文件通常位于 `USER_DUMP_DEST` 目录下,可以通过 `SHOW PARAMETER USER_DUMP_DEST` 查看具体位置。 #### 五、表...
例如,CREATE TABLE用于创建新表,ALTER TABLE用于修改表结构,而DROP TABLE则用于删除不再需要的对象。 5. **权限与角色**: 在Oracle中,安全性是关键。通过GRANT和REVOKE命令,可以控制用户对数据库对象的访问...
在IT领域,Oracle数据库是广泛使用的大型企业级数据库管理系统,尤其在Unix和Linux操作系统上有着深厚的根基。Unix和Linux以其稳定性和安全性深受企业青睐,因此掌握在这些平台上的Oracle数据库管理至关重要。以下将...
在本文中,我们将深入探讨Oracle的基本使用、管理以及优化等方面的知识点。 一、Oracle数据库概述 Oracle数据库系统支持多种数据类型,如CHAR、VARCHAR2、NUMBER、DATE等,并提供了强大的SQL方言,使得数据查询、...
- **表和索引的管理**:CREATE TABLE用于创建表,ALTER TABLE用于修改表结构,CREATE INDEX用于创建索引以提升查询性能。 - **备份与恢复**:Oracle提供RMAN(恢复管理器)进行数据库备份,以及闪回技术实现快速...
此外,还有用于创建、修改和删除数据库对象的DDL(Data Definition Language)命令,如CREATE TABLE、ALTER TABLE、DROP TABLE等。 2. **PL/SQL语言**:Oracle特有的过程化SQL语言,用于编写存储过程、函数、触发器...
例如,使用“FLASHBACK TABLE sales TO BEFORE DROP;”可以在数据表被意外删除后将其恢复至删除前的状态,大大减少了数据丢失的风险。 #### 解决Oracle启动错误ORA-12514 在启动Oracle数据库时,ORA-12514错误通常...
例如,`desc`命令用于描述表结构,`alter table`用于修改表结构,`drop`命令用于删除对象,而`select`则是用于查询数据的关键命令。 4. **SQL语言**:SQL是与Oracle交互的核心语言。理解如何编写复杂的查询,如联接...