跟踪文件能提供调试信息。服务器遇到问题时,它会生成一个包含大量诊断信息的跟踪文件。
Oracle数据库是一个允许充分测量的软件,可测量指的是在数据库内核中存在着大量的调试代码,数据库的这种测量反应在以下几个方面。
Ø V$视图:大多数V$视图都包含调试信息。V$WAITSTAT,V$SESSION_EVENT还有许多其他的V$视图的存在就是为了让我们知道内核内部到底发生了什么。
Ø 审计命令:利用这个命令能制定数据库要记录哪些事件以便日后分析。
Ø 资源管理器(DBMS_RESOURCE_MANAGER):这个特性允许对数据库中的资源(CPU,IO)实现微管理。正是因为oracle能访问描述资源使用情况的所有运行时统计信息,所以才可能有资源管理器。
Ø Oracle事件:基于oracle事件,能让oracle生成所需的跟踪或诊断信息。
Ø DBMS_TRACE:这是一个PL/SQL引擎中的工具,它会全面的记录存储过程的调用树,所产生的异常,以及遇到的错误。
Ø 数据库事件触发器:这些触发器(如ON SERVERERROR)允许你监控和记录你觉得意外或非正常的情况。
Ø SQL_TRACE/DBMS_MONITOR:这个工具用于查看具体的sql、等待事件以及通过运行应用生成的其他与性能有关的诊断信息。
启动sql跟踪的方式如下
在session级别开启sql跟踪
Alter session set sql_trace =true;可以对当前session打开sql跟踪
SQL> alter session set sql_trace=true; Session altered. SQL> select count(*) from user_objects; COUNT(*) ---------- 30850 SQL> alter session set sql_trace=false; Session altered. SQL> show parameter dump_dest; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ background_dump_dest string d:\oracle\diag\rdbms\orcl\orcl \trace core_dump_dest string d:\oracle\diag\rdbms\orcl\orcl \cdump user_dump_dest string d:\oracle\diag\rdbms\orcl\orcl \trace
如果使用专用服务器连接则是在user_dump_dest指定的目录中产生跟踪文件
如果使用共享服务器连接则是在background_dump_dest参数指定的目录中生成跟踪文件
命名约定
跟踪文件的第一部分是ORACLE_SID,第二部只有一个ora,第三部分是专用服务器的进程ID,可以从V$PROCESS中得到。
select c.value || '\' || d.instance_name || '_ora_' || a.spid || '.trc' trace from v$process a, v$session b, v$parameter c, v$instance d where a.addr = b.paddr and b.audsid = userenv('sessionid') and c.name = 'user_dump_dest'
TRACE -------------------------------------------------- d:\oracle\diag\rdbms\orcl\orcl\trace\orcl_ora_3512.trc
在oracle11g中也可以通过查看v$diag_info视图来查看跟踪文件位置以及当前会话的跟踪文件名
with home as ( select value home from v$diag_info where name = 'ADR Home' ) select name, case when value <> home.home then replace(value, home.home, '$home$') else value end value from v$diag_info, home NAME VALUE ------------------------- ------------------------- Diag Enabled TRUE ADR Base d:\oracle ADR Home d:\oracle\diag\rdbms\orcl\orcl Diag Trace $home$\trace Diag Alert $home$\alert Diag Incident $home$\incident Diag Cdump $home$\cdump Health Monitor $home$\hm Default Trace File $home$\trace\orcl_ora_3512.trc Active Problem Count 0Active Incident Count 0
11 rows selected.
其中DIAG_TRACE是跟踪文件的位置
Default trace file 是当前会话跟踪文件的名字
生成的跟踪文件时很难读懂的
需要用tkprof 来格式化这个trace文件
例如
D:\oracle\diag\rdbms\orcl\orcl\trace>Tkprof orcl_ora_3512.trc orcl_ora_3512.txt
有的时候我们需要跟踪其他session的行为,这个时候可以使用DBMS_SYSTEM.set_sql_trace_in_session 来实现
首先得到要监控session的sid和serial# SQL> select sid,serial# from v$session where username='SCOTT'; SID SERIAL# ---------- ---------- 68 56 SQL> exec dbms_system.set_sql_trace_in_session(sid=>68,serial#=>56,sql_trace=>true); PL/SQL procedure successfully completed. SQL> exec dbms_system.set_sql_trace_in_session(sid=>68,serial#=>56,sql_trace=>false); PL/SQL procedure successfully completed.
除了set sql_trace的方式之外,也可以通过跟踪事件10046来生成跟踪文件
在初始化参数文件init%oracle_sid%.ora中设置
Event="eventnumber trace name eventname [forever,] [level levelnumber]:......"
eventnumber指触发dump的事件号,事件号可以是Oracle错误号(出现相应错误时跟踪指定的事件)或oralce内部事件号,内部事件号在10000到10999之间
例如
EVENT = "10046 trace name context forever, level 8"
或者在全局或会话中设置
alter system|session set events ‘[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] : …….’
SQL> alter session set events '10046 trace name context forever,level 12';
10046 levelnumber事件说明
10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强.
10046事件可以设置以下四个级别:
1 - 启用标准的SQL_TRACE功能,等价于sql_trace
4 - Level 1 加上绑定值(bind values)
8 - Level 1 + 等待事件跟踪
12 - Level 1 + Level 4 + Level 8
levelnumber表示事件级别号,一般从1到10,1表示只dump结构头部信息,10表示dump结构的所有信息。
eventname 事件名,如下所述
1、buffers事件:dump SGA缓冲区中的db buffer结构
alter session set events ‘immediate trace name buffers level 1′; –表示dump缓冲区的头部。
2、blockdump事件:dump数据文件、索引文件、回滚段文件结构
alter session set events ‘immediate trace name blockdump level 66666′; –表示dump块地址为6666的数据块。
在Oracle 8以后该命令已改为:
alter system dump datafile 11 block 9; –表示dump数据文件号为11中的第9个数据块。
3、controlf事件:dump控制文件结构
alter session set events ‘immediate trace name controlf level 10′; –表示dump控制文件的所有内容。
4、locks事件:dump LCK进程的锁信息
alter session set events ‘immediate trace name locks level 5′;
5、redohdr事件:dump redo日志的头部信息
alter session set events ‘immediate trace name redohdr level 1′; –表示dump redo日志头部的控制文件项。
alter session set events ‘immediate trace name redohdr level 2′; –表示dump redo日志的通用文件头。
alter session set events ‘immediate trace name redohdr level 10′; –表示dump redo日志的完整文件头。
注意:redo日志的内容dump可以采用下面的语句:
alter system dump logfile ‘logfilename’;
6、loghist事件:dump控制文件中的日志历史项
alter session set events ‘immediate trace name loghist level 1′; –表示只dump最早和最迟的日志历史项。
levelnumber大于等于2时,表示2的levelnumber次方个日志历史项。
alter session set events ‘immediate trace name loghist level 4′; –表示dump 16个日志历史项。
7、file_hdrs事件:dump所有数据文件的头部信息
alter session set events ‘immediate trace name file_hdrs level 1′; –表示dump所有数据文件头部的控制文件项。
alter session set events ‘immediate trace name file_hdrs level 2′; –表示dump所有数据文件的通用文件头。
alter session set events ‘immediate trace name file_hdrs level 10′; –表示dump所有数据文件的完整文件头。
8、errorstack事件:dump错误栈信息,通常Oracle发生错误时前台进程将得到一条错误信息,但某些情况下得不到错误信息,可以采用这种方式得到Oracle错误。
alter session set events ‘604 trace name errorstack forever’; –表示当出现604错误时,dump错误栈和进程栈。
9、systemstate事件:dump所有系统状态和进程状态
alter session set events ‘immediate trace name systemstate level 10′; –表示dump所有系统状态和进程状态。
10、coalesec事件:dump指定表空间中的自由区间
levelnumber以十六进制表示时,两个高位字节表示自由区间数目,两个低位字节表示表空间号,如0×00050000表示dump系统表空间中的5个自由区间,转换成十进制就是327680,即:
alter session set events ‘immediate trace name coalesec level 327680′;
11、processsate事件:dump进程状态
alter session set events ‘immediate trace name processsate level 10′;
12、library_cache事件:dump library cache信息
alter session set events ‘immediate trace name library_cache level 10′;
13、heapdump事件:dump PGA、SGA、UGA中的信息
alter session set events ‘immediate trace name heapdump level 1′;
14、row_cache事件:dump数据字典缓冲区中的信息
alter session set events ‘immediate trace name row_cache level 1′;