威尼斯www.9778.com-威尼斯正版官方网站

全面介绍Oracle的诊断事件

日期:2019-12-25编辑作者:数据库

Oracle为RDBMS提供了多种的诊断工具,诊断事件(Event)是其中一种常用、好用的方法,它使DBA可以方便的转储数据库各种结构及跟踪特定事件的发生。

10046event可以跟踪记录orale有关sql执性语句情况。跟踪记录文件记录在user_dump_dest指定的目录下。

oracle sql跟踪方法:
1、sql_trace

打开跟踪:alter session set sql_trace=true;
为跟踪文件做标记:alter session set tracefile_identifier='look_for_me';
停止跟踪:alter session set sql_trace=false;
最后生成的跟踪文件可以采用tkprof工具生成来查看。

一、Event的通常格式及分类

其中有四种level:

2、10046跟踪代码
跟踪界别介绍:
Level 0 停用SQL跟踪,相当于SQL_TRACE=FALSE
Level 1 标准SQL跟踪,相当于SQL_TRACE=TRUE
Level 4 在level 1的基础上增加绑定变量的信息
Level 8 在level 1的基础上增加等待事件的信息
Level 12 在level 1的基础上增加绑定变量和等待事件的信息

1、 通常格式如下:

  • 1:执行sql语句跟踪;
  • 4:绑定变量 ;
  • 8:等待事件;
  • 12:绑定变量和等待

打开跟踪:
GRANT ALTER SESSION TO lttfm; --必须具有alter session权限
alter session set events '10046 trace name context forever,level 12';--当前用户设置
或者在init.ora文件中插入下面的行:event = 10046 trace name context forever,level 12;--为全局设置

EVENT=事件名称动作跟踪项目范围限定

 

关闭跟踪:
alter session set events '10046 trace name context off';--关闭用户跟踪

2、 Event分类

打开事件跟踪:

注:sql_trace和10046设置代码跟踪只能针对本会话或者系统级进行会话跟踪,具体设置某个非本会话的跟踪需要采用oradebug或者
dbms_system.set_ev或者dbms_monitor.session_trace_enable。

诊断事件大体上可以分为四类:

  1. 针对所有session,在initsid.ora里设置-打开 或 alter system set:event='10046 trace name context forever,level n'  [scope=spfile]  --需要重启oracle
  2. 针对所有session,在initsid.ora里设置-关闭 或 alter system set:event=''  [scope=spfile]  --需要重启oracle
  3. 针对当前session,打开:alter session set events='10046 trace name context forever,level n'  --立即生效
  4. 针对当前session,关闭:alter session set events='10046 trace name context off'  --立即生效
  5. 针对其他session,如何跟踪:

3、使用oradebug
--用如下语句找出要跟踪的spid
select * from v$session a where audsid = userenv('sessionid'); --查询当前的sessionid
select s.USERNAME,
s.OSUSER,
s.SID,
s.PADDR,
s.PROCESS,
p.spid os_process_id,
p.pid oracle_process_id
from v$session s, v$process p
where s.paddr = p.addr
and s.username = upper('LTWEBGIS')
and s.SID = 145;

a. 转储类事件:它们主要用于转储Oracle的一些结构,例如转储一下控制文件、数据文件头等内容。

step1:确定要跟踪的pid(oracle的processid) 或 spid(os的进程pid):

--设置跟踪进程id。
SQL> connect / as sysdba
SQL> oradebug setospid 5672;该语句为跟踪其他会话(5672为v$process的spid),

b. 捕捉类事件:它们用于捕捉一些Error事件的发生,例如捕捉一下ORA-04031发生时一些Rdbms信息,以判断是Bug还是其它原因引起的这方面的问题。

SELECT a.sid, a.serial#, b.spid, b.pid, a.username, a.osuser, a.machine 

若跟踪本会话,执行 oradebug setmypid。

SQL> connect / as sysdba
SQL> oradebug setorapid 15 --输入的15为v$process的pid

c. 改变执行途径类事件:它们用于改主一些Oracle内部代码的执行途径,例如设置10269将会使Smon进程不去合并那些Free的空间。

FROM v$session a, v$process b

--设置跟踪文件大小无限制
SQL> oradebug unlimit;
--设置跟踪,级别8
SQL> oradebug event 10046 trace name context forever,level 8;
已处理的语句

d. 跟踪类事件:这们用于获取一些跟踪信息以用于Sql调优等方面,最典型的便是10046了,将会对Sql进行跟踪。

WHERE a.username IS NOT NULL AND a.paddr=b.addr;

--关闭跟踪
SQL> oradebug event 10046 trace name context off;

3、 说明:

step2:以sysdba的身份登陆sqlplus

执行该语句(SQL> oradebug setospid 5672;)时,提示“ORA-01031: 权限不足”,
原因:oradebug是sysdba的命令(一般用户执行提示权限不足),而且是sqlplus特有的命令,不能在plsql工具中执行(否则提示无效sql)。
可以用oradebug help命令查看oradebug工具说明。

a. 如果immediate放在第一个说明是无条件事件,即命令发出即转储到跟踪文件。

step3:初始化跟踪,oradebug setpid pid_n | oradebug setospid spid_n


**
4、dbms_system(必须用sys用户执行)**
exec dbms_system.set_ev(si => 159,se => 254,ev => 10046,le =>8 ,nm => '');--会话id等参数必须设置正确,否则trace无法生成
生成后可用sql语句查看trace文件位置。

b. trace name位于第二、三项,除它们外的其它限定词是供Oracle内部开发组用的。

step4:打开跟踪,oradebug event 10046 trace name context forever,lever n

--停止跟踪
exec dbms_system.set_ev(si => 159,se => 254,ev => 10046,le =>0 ,nm => '');

c. level通常位于1-10之间(10046有时用到12),10意味着转储事件所有的信息。例如当转储控制文件时,level1表示转储控制文件头,而level 10表明转储控制文件全部内容。

step5:关闭跟踪,oradebug event 10046 trace name context off

5、dbms_monitor
exec dbms_monitor.session_trace_enable(session_id => 136,serial_num => 4,waits => true,binds => true);
exec dbms_monitor.session_trace_disable(session_id => 136,serial_num => 4);
如果不设置session_id或者设置为null,则跟踪当前会话

d. 转储所生成的trace文件在user_dump_dest初始化参数指定的位置。

其他:oradebu还可以设置跟踪文件的fullpathname,oradebug tracefile_name filepec

6、dbms_support
exec dbms_support.start_trace_in_session(sid => 1234,serial# => 56789,waits => true,binds => true);
exec dbms_support.stop_trace_in_session(sid => 1234,serial# => 56789);
dbms_support默认情况下,系统不安装这个包。如果需要使用的话,需进行单独设置。在$ORACLE_HOME/rdbms/admin/目录下应该存在
dbmssupp.sql,prvtsupp.plb这两个文件,执行这两个文件后才可使用,如果别的用户要使用,需要进行相应的授权,并创建同义词。

跟踪类别

  6.使用dbms_system

注:3,4,5,6这几种跟踪方法都是在sys的用户下才能执行,可对任意会话进行跟踪。

事件名称

Dbms_system.set_ev (
si binary_integer, -- SID
se binary_integer, -- Serial#
ev binary_integer, -- Event code or number to set.
le binary_integer, -- Usually level to trace
cm binary_integer -- When to trigger (NULL = context forever.)
 
To enable 10046 level 12 tracing for SID 22 with a serial# of 99 we would execute the set_ev procedure as shown here:
Exec dbms_system.set_ev(12,22,10046,12,’’);
To disable 10046 tracing enter the following:
Exec dbms_system.set_ev(12,22,10046,0,’’);

获取跟踪文件:
1)oradebug获取跟踪文件
--使用oradebug获取本会话跟踪文件位置
SQL> oradebug setmypid
SQL> oradebug tracefile_name

动作 (Action)

--获取任意会话跟踪文件位置
SQL> oradebug setospid 5392
已处理的语句
SQL> oradebug tracefile_name
d:oracleproduct10.2.0adminfgisdbudumpfgisdb_ora_5600.trc

Name


2)sql获取跟踪文件

--sql查看当前session跟踪文件位置
SELECT d.value || '' || lower(rtrim(i.instance_name, chr(0))) || '_ora_' ||
p.spid || '.trc' 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 instance_name FROM v$instance) i,
(SELECT VALUE FROM v$parameter WHERE NAME = 'user_dump_dest') d;

跟踪项目

--以下sql为查询输入的spid的会话跟踪文件
select d.value || '' || lower(rtrim(i.instance_name, chr(0))) || '_ora_' ||
&spid || '.trc' trace_file_name
from (SELECT instance_name FROM v$instance) i,
(select value from v$parameter where name = 'user_dump_dest') d;

查看跟踪级别

1)查看当前session的跟踪级别(必须在sys用户下执行)
declare
event_level number;
begin
dbms_system.read_ev(10046,event_level);
dbms_output.put_line(to_char(event_level));
end;

2)执行如下语句查看跟踪事件的跟踪级别

SQL> oradebug setospid spid --先指定要查看跟踪级别的spid
SQL> oradebug eventdump session
10046 trace name CONTEXT level 8, forever

范围限定

注:如果开启了跟踪会话,但之后数据库关闭,那么跟踪自动关闭。

转储类事件

转自:http://www.cnblogs.com/lanzi/archive/2012/07/31/2616606.html

immediate

Trace

name

blockdump

redohdr

file_hdrs

controlf

systemstate

Level block#

Level 10

Level 10

Level 10

Level 10

捕捉类事件

Error number

Trace

name

Error stack

processstate

Heapdump

Foreve

Off

Level nr

改变执行途径类事件

Even code corresponding to path

Trace

name

Context

Forever or

Level 10

跟踪类事件

10046

Trace

name

Context

Forever

Level n

off

二、说一说设置的问题了

可以在init.ora中设置所需的事件,这将对所有会话期打开的会话进行跟踪,也可以用alter session set event 等方法设置事件跟踪,这将打开正在进行会话的事件跟踪。

1、 在init.ora中设置跟踪事件的方法

a. 语法

EVENT=event 语法|,level n|:event 语法|,level n|

b. 举例

event=10231 trace name context forever,level 10

c. 可以这样设置多个事件:

EVENT=

10231 trace name context forever, level 10:

10232 trace name context forever, level 10

2、 通过Alter session/system set events这种方法

举个例子大家就明白了

Example:

Alter session set events immediate trace name controlf level 10;

Alter session set events immediate trace name blockdump level 112511416; (*)

在oracle8x及之上的版本也有这样的语句:

Alter system dump datafile 13 block 15;实现的功能与(*)是类似的。

3、 使用DBMS_SYSTEM.SET_EV的方法

a. 过和定义如下

DBMS_SYSTEM.SET_EV(

SI Binary_integer,

SE Binary_integer,

EV Binary_integer,

LE Binary_integer,

NM Binary_integer);

SI: 即v$session中的sid

本文由威尼斯www.9778.com发布于数据库,转载请注明出处:全面介绍Oracle的诊断事件

关键词: