[Q]如果设置自动跟蹤
[A]用system登录
执行$ORACLE_HOME/rdbms/admin/utlxplansql创建计划表
执行$ORACLE_HOME/sqlplus/admin/plustrcesql创建plustrace角色
如果想计划表让每个用户都能使用则
SQL>create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
如果想让自动跟蹤的角色让每个用户都能使用则
SQL> grant plustrace to public;
通过如下语句开启/停止跟蹤
SET AUTOTRACE ON |OFF
| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN
[Q]如果跟蹤自己的会话或者是别人的会话
[A]跟蹤自己的会话很简单
Alter session set sql_trace true|false
Or
Exec dbms_sessionset_sql_trace(TRUE);
如果跟蹤别人的会话需要调用一个包
exec dbms_systemset_sql_trace_in_session(sidserial#true|false)
跟蹤的信息在user_dump_dest 目录下可以找到或通过如下脚本获得文件名称(适用于Win环境如果是unix需要做一定修改)
SELECT pvalue||||pvalue||_ora_||pspid||ora filename
FROM
v$process p
v$session s
v$parameter p
v$parameter p
WHERE pname = user_dump_dest
AND pname = db_name
AND paddr = spaddr
AND saudsid = USERENV (SESSIONID)
最后可以通过Tkprof来解析跟蹤文件如
Tkprof 原文件 目标文件 sys=n
[Q]怎么设置整个数据库系统跟蹤
[A]其实文档上的alter system set sql_trace=true是不成功的
但是可以通过设置事件来完成这个工作作用相等
alter system set events
trace name context foreverlevel ;
如果关闭跟蹤可以用如下语句
alter system set events
trace name context off;
其中的level 与上面的都是跟蹤级别
level 跟蹤SQL语句等于sql_trace=true
level 包括变量的详细信息
level 包括等待事件
level 包括绑定变量与等待事件
一Oracle跟蹤文件
Oracle跟蹤文件分为三种类型一种是后台报警日志文件记录数据库在启动关闭和运行期间后台进程的活动情况如表空间创建回滚段创建某些alter命令日志切换错误消息等在数据库出现故障时应首先查看该文件但文件中的信息与任何错误状态没有必然的联系后台报警日志文件保存BACKGROUND_DUMP_DEST参数指定的目录中文件格式为SIDALRTLOG另一种类型是DBWRLGWRSMON等后台进程创建的后台跟蹤文件后台跟蹤文件根据后台进程运行情况产生后台跟蹤文件也保存在BACKGROUND_DUMP_DEST参数指定的目录中文件格式为siddbwrtrcsidsmontrc等还有一种类型是由连接到Oracle的用户进程(Server Processes)生成的用户跟蹤文件这些文件仅在用户会话期间遇到错误时产生此外用户可以通过执行oracle跟蹤事件(见后面)来生成该类文件用户跟蹤文件保存在USER_DUMP_DEST参数指定的目录中文件格式为oraxxxxxtrcxxxxx为创建文件的进程号(或线程号)
二Oracle跟蹤事件
Oracle提供了一类命令可以将Oracle各类内部结构中所包含的信息转储(dump)到跟蹤文件中以便用户能根据文件内容来解决各种故障设置跟蹤事件有两种方法一种是在initora文件中设置事件这样open数据库后将影响到所有的会话设置格式如下
EVENT=eventnumber trace name eventname [forever] [level levelnumber] :
通过:符号可以连续设置多个事件也可以通过连续使用event来设置多个事件
另一种方法是在会话过程中使用alter session set events命令只对当前会话有影响设置格式如下
alter session set events \[eventnumber|immediate] trace name eventname [forever] [ level levelnumber] : \
通过:符号可以连续设置多个事件也可以通过连续使用alter session set events 来设置多个事件
格式说明eventnumber指触发dump的事件号事件号可以是Oracle错误号(出现相应错误时跟蹤指定的事件)或oralce内部事件号内部事件号在到之间不能与immediate关键字同用
immediate关键字表示命令发出后立即将指定的结构dump到跟蹤文件中这个关键字只用在alter session语句中并且不能与 eventnumberforever关键字同用
trace name 是关键字
eventname指事件名称(见后面)即要进行dump的实际结构名若eventname为context则指根据内部事件号进行跟蹤
forever关键字表示事件在实例或会话的周期内保持有效状态不能与immediate同用
level为事件级别关键字但在dump错误栈(errorstack)时不存在级别
levelnumber表示事件级别号一般从到表示只dump结构头部信息表示dump结构的所有信息
buffers事件dump SGA缓沖区中的db buffer结构
alter session set events \immediate trace name buffers level \; 表示dump缓沖区的头部
blockdump事件dump数据文件索引文件回滚段文件结构
alter session set events \immediate trace name blockdump level \; 表示dump块地址为的数据块
在Oracle 以后该命令已改为
alter system dump datafile block ; 表示dump数据文件号为中的第个数据块
controlf事件dump控制文件结构
alter session set events \immediate trace name controlf level \; 表示dump控制文件的所有内容
locks事件dump LCK进程的锁信息
alter session set events \immediate trace name locks level \;
redohdr事件dump redo日志的头部信息
alter session set events \immediate trace name redohdr level \; 表示dump redo日志头部的控制文件项
alter session set events \immediate trace name redohdr level \; 表示dump redo日志的通用文件头
alter session set events \immediate trace name redohdr level \; 表示dump redo日志的完整文件头
注意redo日志的内容dump可以采用下面的语句:
alter system dump logfile \logfilename\;
loghist事件dump控制文件中的日志历史项
alter session set events \immediate trace name loghist level \; 表示只dump最早和最迟的日志历史项
levelnumber大于等于时表示的levelnumber次方个日志历史项
alter session set events \immediate trace name loghist level \; 表示dump 个日志历史项
file_hdrs事件dump 所有数据文件的头部信息
alter session set events \immediate trace name file_hdrs level \; 表示dump 所有数据文件头部的控制文件项
alter session set events \immediate trace name file_hdrs level \; 表示dump 所有数据文件的通用文件头
alter session set events \immediate trace name file_hdrs level \; 表示dump 所有数据文件的完整文件头
errorstack事件dump 错误栈信息通常Oracle发生错误时前台进程将得到一条错误信息但某些情况下得不到错误信息可以
采用这种方式得到Oracle错误
alter session set events \ trace name errorstack forever\; 表示当出现错误时dump 错误栈和进程栈
systemstate事件dump所有系统状态和进程状态
alter session set events \immediate trace name systemstate level \; 表示dump 所有系统状态和进程状态
coalesec事件dump指定表空间中的自由区间
levelnumber以十六进制表示时两个高位字节表示自由区间数目两个低位字节表示表空间号如x表示dump系统表空间中的
个自由区间转换成十进制就是即
alter session set events \immediate trace name coalesec level \;
processsate事件dump进程状态
alter session set events \immediate trace name processsate level \;
library_cache事件dump library cache信息
alter session set events \immediate trace name library_cache level \;
heapdump事件dump PGASGAUGA中的信息
alter session set events \immediate trace name heapdump level \;
row_cache事件dump数据字典缓沖区中的信息
alter session set events \immediate trace name row_cache level \;
三内部事件号
用于监视事务恢复
转储UNDO SEGMENT头部
event = trace name context forever
用于给出会话期间的登陆信息
用于给出会话期间的注销信息
转储排序的统计信息
转储排序增长的统计信息
跟蹤Freelist管理操作
跟蹤SQL语句
alter session set events \ trace name context forever level \; 跟蹤SQL语句并显示绑定变量
alter session set events \ trace name context forever level \; 跟蹤SQL语句并显示等待事件
转储优化策略
模拟redo日志中的创建和清除错误
阻止SMON进程在启动时清除临时段
转储 SQL*NET统计信息
转储高水标记变化
转储Hash连接统计信息
转储分区休整信息
转储一致性读信息
转储一致性读中Undo应用
允许在控制文件中模拟错误
触发数据块检查事件
event = trace name context forever level
触发索引检查事件
模拟在写控制文件后崩溃
模拟在控制文件中的写错误
levelnumber从表示产生错误的块号大于等于则每个控制文件将出错
模拟在控制文件中的读错误
转储Undo头部变化
转储Undo变化
转储索引的分隔与删除
转储基于字典管理的区间的变化
模拟在数据文件上的I/O错误
设置在全表扫描时忽略损坏的数据块
alter session set events \ trace name context off\; 关闭会话期间的数据块检查
event = trace name context forever level 对任何进程读入SGA的数据块进行检查
将设置为软损坏(DBMS_REPAIR包设置或DB_BLOCK_CHECKING为TRUE时设置)的数据块dump到跟蹤文件
用于内存堆检查
alter session set events \ trace name context forever level \;
转储远程SQL执行
跟蹤PMON进程
跟蹤dispatch进程
跟蹤MTS进程
模拟写数据文件头部错误
模拟写redo日志文件错误
允许连接时存在内存洩漏
alter session set events \ trace name context forever level \; 允许存在个字节的内存洩漏
转储共享游标
模拟控制文件头部损坏
模拟控制文件打开错误
模拟归档出错
调试直接路径机制
跟蹤SMON进程
跟蹤位图索引的创建
跟蹤enqueues
跟蹤全局enqueues
跟蹤RAC的buffer cache
跟蹤对位图索引的访问
跟蹤位图索引合并操作
跟蹤位图索引OR操作
跟蹤位图索引AND操作
跟蹤位图索引MINUS操作
跟蹤位图索引向ROWID的转化
跟蹤位图索引的压缩与解压
跟蹤位图索引的修改
跟蹤游标声明
跟蹤PL/SQL执行
转储PL/SQL执行统计信息
最后要说明的是由于版本不同以上语法可能有些变化但大多数还是可用的