如何生成其他會話的10046?
微信群有朋友問,
如何生成其他會話的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
1. 獲取當前session id,SID值是132,
SQL> select sid from v$mystat where rownum = 1;
SID
----------
132
2. 另一個會話執行輸入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: "
...
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: "
...
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的個人雜貨鋪,
TAG:bisal的個人雜貨鋪 |