微信群有朋友问,
如何生成其他会话的10046?
对于本地session的10046事件trace,可以使用以下两种方法,
alter session set events ‘10046 trace name context forever, level 12’;
oradebug event 10046 trace name context forever, level 12;
但是生产环境,可能一般用户,没有执行10046的权限,这就需要其他用户执行,来获得10046的trace日志,主要有两种方法,一是使用oradebug,二是使用DBMS_SYSTEM程序包。
方法一:使用oradebug
可以参考《How To Collect 10046 Trace (SQL_TRACE) Diagnostics for Performance Issues (Doc ID 376442.1)》。
这里有两个概念,
SPID is the operating system Process identifier (os pid) PID is the Oracle Process identifier (ora pid)
步骤一:如果使用oradebug,需要SPID作为参数。
获取会话SPID,可以有两种场景。
场景1:知道需要获取10046的会话session id
- 获取当前session id,SID值是132,
SQL select sid from v$mystat where rownum = 1;
SID ---------- 132
- 另一个会话执行输入132,就可以知道会话132的SPID值是29457,
SQL select p.PID,p.SPID,s.SID 2 from v$process p,v$session s 3 where s.paddr = p.addr 4 and s.sid = &SESSION_ID 5 / Enter value for session_id: 132 old 4: and s.sid = &SESSION_ID new 4: and s.sid = 132
PID SPID SID ---------- ------------------------ ---------- 132 29568 132
场景2:不知道需要获取10046的会话session id
执行以下SQL,就会列出所有的会话信息,含有SPID,帮助你找到目标会话,
SQL select 'ospid: ' || p.spid || ' # ''' ||s.sid||','||s.serial#||''' '|| 2 s.osuser || ' ' ||s.machine ||' '||s.username ||' '||s.program line 3 from v$session s , v$process p 4 where p.addr = s.paddr 5 and s.username ' ';
LINE -------------------------------------------------------------------------------- ospid: 29656 # '71,30485' oracle DB SYS sqlplus@DB (TNS V1-V3) ospid: 29568 # '132,9193' oracle DB SYS sqlplus@DB (TNS V1-V3)
步骤二:执行oradebug
有了SPID,就可以执行oradebug指令,
SQL oradebug setospid 29568
Oracle pid: 22, Unix process pid: 29568, image: oracle@DB (TNS V1-V3)
此时可以开启10046,
SQL oradebug event 10046 trace name context forever,level 12
Statement processed.
会话132执行语句,
SQL select * from dual;
D - X
关闭10046事件,
SQL oradebug event 10046 trace name context off Statement processed.
看下trace文件路径和名称,
SQL oradebug tracefile_name /DATA/oracle/u01/app/oracle/diag/rdbms/07/07/trace/07_ora_29568.trc
从07_ora_29568.trc就可以看执行的10046事件,
Received ORADEBUG command (#1) 'event 10046 trace name context forever,level 12' from process 'Unix process pid: 29431, image: none'
... Finished processing ORADEBUG command (#1) 'event 10046 trace name context forever,level 12'
... select * from dual ...Received ORADEBUG command (#2) 'event 10046 trace name context off' from process 'Unix process pid: 29431, image: none' ... Finished processing ORADEBUG command (#2) 'event 10046 trace name context off'
方法二:使用dbms_system
可以参考《演示使用sql_trace和10046事件对其他会话进行跟踪,并给出trace结果》(https://www.cnblogs.com/Richardzhu/archive/2013/02/05/2893162.html),就不再赘述了,觉得还是第一种比较方便。
如果您觉得本文有帮助,欢迎关注转发:bisal的个人杂货铺,