2019独角兽企业重金招聘Python工程师标准>>>
一、诊断事件
诊断事件无官方技术文档支持,使用存在风险,慎用。使用诊断事件可以获取问题更多的信息,调整系统运行
特性,启用某些内部功能。用于系统故障的诊断。跟踪应用,改变系统运行模式。
1.DUMP分析
immediate dump:
alter session set events 'immediate trace name <dump> level <n>' # n标示trace详细程度
alter session set events 'immediate trace name controlf level 10';
on-error dump:通常在参数文件中设置
event = "<error> trace name errorstack level <n>" # error ORA-XXX,n详细程度
event = "60 trace name errorstack level 1" # 发生ORA-60错误时,产生1级信息
变更运行特性:通常参数文件中设置
event = "<event> trace name context forever, level <level>" #<event>指明要变更的特性
event = "<event> trace name context forever, level <level>":参数,会话,系统级
alter {session|system} set events '<event> trace name context forever, level <n>';
tree dump:分析索引的结构和变化
ALTER session set events 'immediate trace name treedump level <OBJECT_ID>'; #<OBJECT_ID>索引的ID
SELECT object_id,object_name FROM user_objects WHERE object_name LIKE 'IDX_%';
参考资料:
http://blog.itpub.net/28507395/viewspace-1328056
http://blog.itpub.net/758322/viewspace-683573
2.常见故障
实例或进程crash
进程hang住
分系统级和应用级,进程等待某资源无法获得,通过等待性能视图,hanganalyze
非正常循环loop
系统性能低
looping:等待某个事件
应用性能分析工具:event 10046 tkprof
二、常见事件分析
1、sql_trace: 将SQL执行的整个过程输出到一个trace文件中,我们可以读这个trace 文件来了解在这个SQL执行过程中
Oracle 都做了哪些操作。
使用过程:
a.设置trace文件标识,或使用语句查(如10053)
b.可以通过语句和参数文件设置
alter session set sql_trace=true; #会话级
alter database set sql_trace=true; #实例级
参数文件中配置sql_trace
c.执行相关SQL语句
d.关闭trace
alter session[database] set sql_trace=false;
sqlplus退出后自动关闭sql_trace;
e、利用oracle工具TKPROF格式化查看trace文件
tkprof 工具只能用在处理SQL_TRACE和10046事件产生的trace,其他事件如10053不能处理。
参数介绍:
sys #默认值为yes,输出文件中是否包含以SYS用户运行的sql语句。
record #指定分析输出记录所有非递归sql文件如:record=c:\test.log,用tkprof格式化后
大体了解跟踪非递归SQL。有助于我们重演SQL语句(绑定变量的不可以)。
aggregate #指定tkprof是否将同样文本内容的sql聚合处理,参数为默认为no。
sort #用来指定tkprof输出文件里sql语句的排序,默认是按照执行的先后顺序排序,参数最
经常用的方式sort=prsela,exeela,fchela,这三个值加起来就是响应时间,即按照响应
时间排序。
print #搭配sort一起使用,用来指定tkprof输出sql语句的数量。如输出一个跟踪文件里响
应时间排前十的SQL,sort=prsela,exeela,fchela print=10。
explain #参数是为每一个SQL提供一个执行计划。使用的方法是explain=用户名/密码
wait #指定输出文件是否包含等待事件,默认是包含的。一般都取默认值。
查找Trace文件:
默认开启的环境下找会话的Trace文件,找到会话号,通过会话号,找到对应的trace文件
select sid from v$mystat where rownum=1;
select username,sid,serial#,paddr from v$session where username='SYSTEM';
select spid from v$process where addr = (select paddr from v$session where sid=139);
然后去udump目录找到对应的Trace文件;
跟踪其他用户,查到用户的spid,利用dbms_system.set_sql_trace_in_session(129,55,true)包
exec dbms_system.set_sql_trace_in_session(129,55,true); #129 sid,55 serial#
会话执行相关SQL
exec dbms_system.set_sql_trace_in_session(129,55,false);
TKPROF工具使用过程:
tkprof /u01/app/oracle/admin/ipemsdb/udump/ipemsdb_ora_17914.trc
/u01/app/17914.trc.txt aggregate=yes sys=no waits=yes sort=prsela,
exeela,fchela record=/u01/app/17914.sql
Trace文件结构解析:
服务器执行的SQL语句;
语句跟踪统计信息;
行源操作过程;
汇总统计信息
统计信息各列说明:
CALL #每次SQL语句的处理都分成三个部分。
Parse #这步将SQL语句转换成执行计划,检查是否有正确的授权和所需要的对象是否存在。
Execute #这步是真正的由Oracle来执行语句。包括修改数据,和确定选择的记录。
Fetch #返回查询语句中所获得的记录,这步只有select语句会被执行。
COUNT #这个语句被parse、execute、fetch的次数。
CPU #这个语句对于所有的parse、execute、fetch所消耗的cpu的时间,以秒为单位。
ELAPSED #这个语句所有消耗在parse、execute、fetch的总的时间。
DISK #物理读取块的数量。
QUERY #在一致性读模式下,所有parse、execute、fetch所获得的buffer的数量。
CURRENT #在current模式下所获得的buffer的数量。
ROWS #所有SQL语句返回的记录数目,但是不包括子查询中返回的记录数目。对于select语句,返
回记录是在fetch这步,对于insert、update、delete操作,返回记录则是在execute这步。
参考资料:http://ylw6006.blog.51cto.com/470441/895017/
2、10046事件: 跟踪会话执行的SQL语句,等待事件,通过TDPROF格式化trace
使用过程:
a.事件的4个级别:
1 - 启用标准的SQL_TRACE功能,等价于sql_trace
4 - Level 1 加上绑定值(bind values)
8 - Level 1 + 等待事件跟踪
12 - Level 1 + Level 4 + Level 8
b.启动10046事件
alter session[system] set events ‘10046 trace name context forever, level 12’; --当前会话
exec dbms_monitor.session_trace_enable(267,996,waits=>true,binds=>true); --其他会话 SID,SERIAL#
c.执行相关SQL
d.关闭10046事件
alter session set events ‘10046 trace name context off’; --当前会话
exec dbms_monitor.session_trace_disable(267,996); --其他会话
对于通过DBLINK执行的SQL语句无法进行跟踪和获取执行计划。
SID,SERIAL可以从v$session中查询
select SID,SERIAL# from v$session where sid =(select sid from v$mystat where rownum=1);
参考资料:http://blog.csdn.net/tianlesoftware/article/details/5857023
TRCA工具:
http://blog.csdn.net/tianlesoftware/article/details/7246542
3、10053事件:跟踪CBO产生执行计划,解决执行计划失真问题,CBO优化器依赖分析数据,适用于特定的SQL
使用过程:
a.确定当前trace文件
默认即当前会话的SPID对应trace,可以手动设置trace文件标识
alter session set tracefile_identifier='10053_event';
可通过如下sql查询trace文件路径
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc'
AS "trace_file_name"
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_dump_dest') d;
b.启动10053事件
ALTER SESSION SET EVENTS='10053 trace name context forever, level 1[2]';
c.执行sql
select * from all_tables where table_name='T';
d.关闭10053事件
ALTER SESSION SET EVENTS '10053 trace name context off';
e.查看trace文件
在udump目录下含有tracefile_identifier的trace文件。
参考资料:http://blog.csdn.net/tianlesoftware/article/details/5859027
4、oradebug:
oradebug help #查看命令帮助信息
使用过程:
a.追踪进程
系统的进程ID,使用oradebug setospid id;
Oracle ID,使用oradebug setorapid id;
b.查询进程号
select a.username,a.sid ,a.serial#,b.spid from v$session a,v$process b, v$mystat c
where a.paddr=b.addr and a.sid=c.sid and rownum<2;
select pid,spid,username from v$process; #pid oracle_id,spid os_id
c.获得系统状态信息,使用spid
oradebug setospid 27028
oradebug unlimit
oradebug dump systemstate 10
oradebug TRACEFILE_NAME
oradebug close_trace
d.获得某进程信息
oradebug dump processstate 10
e.获得进程错误信息
oradebug dump errorstack 3;
参考资料:http://blog.csdn.net/tianlesoftware/article/details/6525628
5、HANGANALYZE:用于分析hang住而产生严重的性能问题
使用过程
a.单实例
oradebug hanganalyze 3;
b.rac环境使用
ALTER SESSION SET EVENTS 'immediate trace name HANGANALYZE level <level>';
参考资料:
http://blog.csdn.net/tianlesoftware/article/details/6321961
http://blog.itpub.net/12020513/viewspace-615165
6、10060事件:分析SQL的断语,用于执行计划的分析
7、分析事例:block dump分析段碎片:
set autotrace on;查看consistent gets,比较表中的数据和对象视图中数据是否一致,block dump查看是否空块多,
alter system dump datafile 5 block 13;
alter table ...move解决