Oracle跟踪与调试之oradebug、dbms_system等

oradebug跟踪调试

oradebug help   ----查看帮助

oradebug setmypid  --跟踪当前会话

oradebug setospid  --跟踪系统进程

oradebug setorapid  --跟踪ORACLE进程

oradebug unlimit   --取消trace文件大小限制    

oradebug tracefile_name  --查看trace文件名及位置

 

1、 用oradebug做oracle process级10046

   oradebug setorapid 19048 ---此为操作系统PID

   oradebug unlimit

   oradebug event 10046 trace name context forever ,level 4

   oradebug event 10046 trace name context off

   oradebug tracefile_name

2、 oradebug系统hang住原因分析

sqlplus -prelim / as sysdba   (不加参数登录不了时)

   如果系统HANG住,只要sys用户可以登陆,那么用oradebug做原因分析是非常有用的

   oradebug setmypid

   oradebug unlimit

   oradebug setinst all   --RAC环境

   oradebug hanganalyze 3  -- 级别一般指定为3足够了

   oradebug -g def dump systemstate 10  --RAC环境

   oradebug tracefile_name

3、 获取某进程的状态信息

   oradebug setospid 22180

   oradebug dump processstate 10

   oradebug tracefile_name

4、 获取进程错误信息状态

   oradebug setospid 22180

   oradebug dump errorstack 3

5、 追踪造成错误信息的原因,如ORA-04031

   oradebug event 4031 trace name errorstack level 3

6、systemstate dump

使用ass109.awk分析

awk -f ass109.awk /opt/diag/rdbms/orcl/rac1/trace/rac1_ora_18713.trc

 

 

2: dump (不包括lock element)

10: dump

11: dump + global cache of RAC

256: short stack (函数堆栈)

258: 256+2 -->short stack +dump(不包括lock element)

266: 256+10 -->short stack+ dump

267: 256+11 -->short stack+ dump + global cache of RAC

 

单实例

Hanganalyze
sqlplus '/ as sysdba'
oradebug setmypid
oradebug unlimit
oradebug hanganalyze 3
-- Wait one minute before getting the second hanganalyze
oradebug hanganalyze 3
oradebug tracefile_name
exit

Systemstate
sqlplus '/ as sysdba'
oradebug setmypid
oradebug unlimit
oradebug dump systemstate 266
oradebug dump systemstate 266
oradebug tracefile_name
exit

 

RAC

For 11g:
sqlplus '/ as sysdba'
oradebug setorapname reco
oradebug  unlimit
oradebug -g all hanganalyze 3
oradebug -g all hanganalyze 3
oradebug -g all dump systemstate 266
oradebug -g all dump systemstate 266
exit
Collection commands for Hanganalyze and Systemstate: RAC without fixes for Bug 11800959 and Bug 11827088
sqlplus '/ as sysdba'
oradebug setorapname reco
oradebug unlimit
oradebug -g all hanganalyze 3
oradebug -g all hanganalyze 3
oradebug -g all dump systemstate 258
oradebug -g all dump systemstate 258
exit
For 10g, run oradebug setmypid instead of oradebug setorapname reco:
sqlplus '/ as sysdba'
oradebug setmypid
oradebug unlimit
oradebug -g all hanganalyze 3
oradebug -g all hanganalyze 3
oradebug -g all dump systemstate 258
oradebug -g all dump systemstate 258
exit

 

ALTER SESSION

语法:

alter session set events '[eventnumber|immediate] trace name eventname [forever] [, level levelnumber] : .......'

通过:符号,可以连续设置多个事件,也可以通过连续使用alter session set events 来设置多个事件。

格式说明:

eventnumber:指触发dump的事件号,事件号可以是Oracle错误号(出现相应错误时跟踪指定的事件)或oralce内部事件号,内部事件号在10000到10999之间,不能与immediate关键字同用。

immediate:表示命令发出后,立即将指定的结构dump到跟踪文件中,这个关键字只用在alter session语句中,并且不能与eventnumber、forever关键字同用。

 

eventname指事件名称(见后面),即要进行dump的实际结构名。若eventnamecontext,则指根据内部事件号进行跟踪。
             forever关键字表示事件在实例或会话的周期内保持有效状态,不能与immediate同用。
             level为事件级别关键字。但在dump错误栈(errorstack)时不存在级别。
             levelnumber表示事件级别号,一般从1101表示只dump结构头部信息,10表示dump结构的所有信息。
   1buffers事件:dump SGA缓冲区中的db buffer结构
     alter session set events 'immediate trace name buffers level 1'; --表示dump缓冲区的头部。
   2blockdump事件: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个数据块。
   3controlf事件:dump控制文件结构
     alter session set events 'immediate trace name controlf level 10'; --表示dump控制文件的所有内容。
   4locks事件: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时,表示2levelnumber次方个日志历史项。
      alter session set events 'immediate trace name loghist level 4'; --表示dump 16个日志历史项。
   7file_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 所有数据文件的完整文件头。
   8errorstack事件:dump 错误栈信息,通常Oracle发生错误时前台进程将得到一条错误信息,但某些情况下得不到错误信息,可以采用这种方式得到Oracle错误。
       alter session set events '604 trace name errorstack forever'; --表示当出现604错误时,dump 错误栈和进程栈。
   9systemstate事件:dump所有系统状态和进程状态
       alter session set events 'immediate trace name systemstate level 10'; --表示dump 所有系统状态和进程状态。
   10coalesec事件:dump指定表空间中的自由区间
      levelnumber以十六进制表示时,两个高位字节表示自由区间数目,两个低位字节表示表空间号,如0x00050000表示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 PGASGAUGA中的信息
      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';
    

 

 

----开启10046跟踪

alter session set events '10046 trace name context forever ,level 12' ;

---关闭10046跟踪

alter session set events '10046 trace name context off' ;

 

dbms_system

下属跟踪相当于exec dbms_system.set_ev(45,67,10046,1,'');  即只开启LEVEL1级的10046跟踪

1.select sid,serial#,username,osuser,machine from v$session;查询sessionsid,serial#
2.exec dbms_system.set_sql_trace_in_session(141,6,true);
开始跟踪
3.exec dbms_system.set_sql_trace_in_session(141,6,true) 停止跟踪
4.tkprof *.trc *.txt
5.
查看文件

 

 

查看具体那个tracefile

select sid,a.serial#,a.username,a.program,a.MACHINE,b.pid,b.spid,b.pname,b.tracefile from v$session a ,v$process b  where sid = 45 and a.paddr = b.addr;

 

 

exec dbms_system.set_ev(sid,serial#,evert number,level,'');

1、exec dbms_system.set_ev(45,67,10046,12,'');   ----开启跟踪

执行语句

2、exec dbms_system.set_ev(45,67,10046,0,'');    ---关闭跟踪

 

dbms_monitor

SQL> exec dbms_monitor.session_trace_enable(267,996,waits=>true,binds=>true);  -- 启动trace

PL/SQL 过程已成功完成。

 

SQL> exec dbms_monitor.session_trace_disable(267,996); -- 关闭trace

PL/SQL 过程已成功完成。

 

 

注意:如果一条SQL语句中包含了通过DBLINK进行的数据操作,我们想对这条SQL进行trace跟踪,在本地只能够trace到本地执行的SQL信息,而对于远程的SQL语句,由于它运行在远端的数据库上,我们要获得它的信息,需要到远端的数据库上,找到运行这条SQL语句的session,然后对它做Trace。 另外,这条SQL语句的执行计划也只能从远端数据库上捕获到

内部事件号

110013:用于监视事务恢复
210015:转储UNDO SEGMENT头部
        event = "10015 trace name context forever"
3
10029:用于给出会话期间的登陆信息
410030:用于给出会话期间的注销信息
510032:转储排序的统计信息
610033:转储排序增长的统计信息
710045:跟踪Freelist管理操作
810046:跟踪SQL语句,针对不同LEVEL0级为禁用

       level 1:跟踪sql语句,包括解析、执行、提取、提交和回滚等。

       level 4:包括变量的详细信息

       level 8:包括等待事件

       level 12:包括绑定变量与等待事件。

       其中,level 1相当于打开了sql_trace

 


   alter session set events '10046 trace name context forever, level 4'; --跟踪SQL语句并显示绑定变量
   alter session set events '10046 trace name context forever, level 8'; --跟踪SQL语句并显示等待事件
910053:转储优化策略
1010059:模拟redo日志中的创建和清除错误
1110061:阻止SMON进程在启动时清除临时段
1210079:转储 SQL*NET统计信息
1310081:转储高水标记变化
1410104:转储Hash连接统计信息
1510128:转储分区休整信息
1610200:转储一致性读信息
1710201:转储一致性读中Undo应用
1810209:允许在控制文件中模拟错误
1910210:触发数据块检查事件
        event = "10210 trace name context forever, level 10"
20
10211:触发索引检查事件
2110213:模拟在写控制文件后崩溃
2210214:模拟在控制文件中的写错误
   levelnumber1-9表示产生错误的块号,大于等于10则每个控制文件将出错
2310215:模拟在控制文件中的读错误
2410220:转储Undo头部变化
2510221;转储Undo变化
2610224:转储索引的分隔与删除
2710225:转储基于字典管理的区间的变化
2810229:模拟在数据文件上的I/O错误
2910231:设置在全表扫描时忽略损坏的数据块
         alter session set events '10231 trace name context off'; -- 关闭会话期间的数据块检查
         event = "10231 trace name context forever, level 10" -- 对任何进程读入SGA的数据块进行检查
3010232:将设置为软损坏(DBMS_REPAIR包设置或DB_BLOCK_CHECKINGTRUE时设置)的数据块dump到跟踪文件
3110235:用于内存堆检查
   alter session set events '10235 trace name context forever, level 1';
32
10241:转储远程SQL执行
3310246:跟踪PMON进程
3410248:跟踪dispatch进程
3510249:跟踪MTS进程
3610252:模拟写数据文件头部错误
3710253:模拟写redo日志文件错误
3810262:允许连接时存在内存泄漏
   alter session set events '10262 trace name context forever, level 300'; -- 允许存在300个字节的内存泄漏
3910270:转储共享游标
4010285:模拟控制文件头部损坏
4110286:模拟控制文件打开错误
4210287:模拟归档出错
4310357:调试直接路径机制
4410500:跟踪SMON进程
4510608:跟踪位图索引的创建
4610704:跟踪enqueues
47
10706:跟踪全局enqueues
48
10708:跟踪RACbuffer cache
49
10710:跟踪对位图索引的访问
5010711:跟踪位图索引合并操作
5110712:跟踪位图索引OR操作
5210713:跟踪位图索引AND操作
5310714:跟踪位图索引MINUS操作
5410715:跟踪位图索引向ROWID的转化
5510716:跟踪位图索引的压缩与解压
5610719:跟踪位图索引的修改
5710731:跟踪游标声明
5810928:跟踪PL/SQL执行
5910938:转储PL/SQL执行统计信息
   最后要说明的是,由于版本不同以上语法可能有些变化,但大多数还是可用的。

附完整的跟踪事件列表,event No.10000 to 10999

SET SERVEROUTPUT ON
DECLARE
err_msg VARCHAR2(120);
BEGIN
dbms_output.enable (1000000);
FOR err_num IN 10000..10999
LOOP
err_msg := SQLERRM (-err_num);
IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN
dbms_output.put_line (err_msg);
END IF;
END LOOP;
END;
/

 

TKPROF

使用tkprof命令,转换TRC文件

注意:tkprof 工具只能用在处理SQL_TRACE10046事件产生的trace,其他事件如10053不能处理。
在命令行下执行oracletkprof命令,将zftang_ora_596.trc转化为文本文件
如:
$ tkprof  /u01/app/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_1720.trc ora11g_ora_1720.sql

 

 

 

查询当前会话

 

查询会话event

--dbms_system实现

SQL> set serveroutput on size 1000000

SQL> declare

  2  event_level number;

  3  begin

  4  for i in 1..100000 loop

  5  sys.dbms_system.read_ev(i,event_level);

  6  if (event_level > 0) then

  7  dbms_output.put_line('Event '||to_char(i)||' set at level '||

  8  to_char(event_level));

  9  end if;

 10  end loop;

 11  end;

 12  /

Event 10510 set at level 1

Event 10513 set at level 2

Event 60025 set at level 1

 

PL/SQL procedure successfully completed.

 

--oradebug实现

SQL> oradebug SETMYPID

Statement processed.

SQL> oradebug eventdump session

10510 trace name context forever,level 1

10513 trace name context forever,level 2

60025 trace name context forever

sql_trace level=4

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值