首页 > 技术文章 > Oracle用户进程跟踪

polestar 2013-08-11 11:24 原文

用户进程跟踪

1 分为 基于会话级别跟踪和 实例级别跟踪;
2 会话级别跟踪又包括 当前会话跟踪和 非当前会话跟踪
3 跟踪文件位置由user_dump_dest设定,大小由max_dump_file_size 决定
4 生成的跟踪文件名为<SID>_ora_<SPID>.trc  其中SID为实例名称,SPID为系统进程号
5 通过v$session中的SQL_TRACE,SQL_TRACE_WAITS,SQL_TRACE_BINDS展示了一个会话的跟踪状态

注:
    在专用服务器模式中:仅仅需要标识该会话并为该会话启用跟踪(专用模式为一对一模式,即一个用户进程对应一个服务器进程)
    在共享模式中:对任何一个会话的跟踪会分布到每个共享服务器进程所生成的跟踪文件内。这时可以用tkprof合并多个sql跟踪文件

1.1 基于会话级别跟踪

1.1.1 针对当前会话跟踪

 1 --以DBA权限 查看用户跟踪文件所在的位置
 2 SQL> show parameter user_dump 
 3 
 4 NAME                                 TYPE        VALUE
 5 ------------------------------------ ----------- ------------------------------
 6 user_dump_dest                       string      /u01/admin/sun/udump
 7 SQL> 
 8 
 9 --清空先前产生的跟踪文件
10 SQL> ! rm -f /u01/admin/sun/udump/*.trc
11 
12 
13 --开启一个会话连接
14 SQL> conn hr/hr123
15 Connected.
16 SQL> 
17 
18 --开启当前会话跟踪
19 SQL> alter session set sql_trace=true;
20 
21 Session altered.
22 
23 SQL> 
24 
25 --执行测试SQL语句
26 --跟踪完毕后执行下面的语句关闭跟踪
27 SQL> alter session set sql_trace = false;
28 
29 Session altered.
30 
31 SQL> 
32 
33 
34 --通过DBA用户获取其SPID
35 SQL> select s.username,s.sid,p.spid from v$session s,v$process p
36   2  where s.paddr = p.addr and s.username = 'HR';
37 
38 USERNAME                              SID SPID
39 ------------------------------ ---------- ------------
40 HR                                    141 1255
41 
42 SQL>

 

 1 #可以使用vi,taik等工具 查看产生的跟踪会话文件
 2 bash-3.00$ vi  sun_ora_1255.trc
 3 ............
 4 =====================
 5 PARSING IN CURSOR #5 len=18 dep=0 uid=55 oct=3 lid=55 tim=6241133514 hv=2637153722 ad='5d4e9008'
 6 select * from jobs  --此处是我的测试sql
 7 END OF STMT
 8 PARSE #5:c=130000,e=189841,p=9,cr=124,cu=0,mis=1,r=0,dep=0,og=1,tim=6241133508
 9 EXEC #5:c=0,e=28,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=6241133636
10 FETCH #5:c=10000,e=37492,p=6,cr=6,cu=0,mis=0,r=1,dep=0,og=1,tim=6241171200
11 FETCH #5:c=0,e=41,p=0,cr=1,cu=0,mis=0,r=15,dep=0,og=1,tim=6241171781
12 FETCH #5:c=0,e=266,p=0,cr=2,cu=0,mis=0,r=3,dep=0,og=1,tim=6241174115
13 STAT #5 id=1 cnt=19 pid=0 pos=1 obj=51968 op='TABLE ACCESS FULL JOBS (cr=9 pr=6 pw=0 time=37479 us)'
14 *** 2013-08-10 10:15:16.843
15 =====================
16 PARSING IN CURSOR #1 len=35 dep=0 uid=55 oct=42 lid=55 tim=6317825775 hv=310044142 ad='5d4e3c80'
17 alter session set sql_trace = false --关闭当前跟踪操作
18 END OF STMT
19 PARSE #1:c=0,e=661,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=6317825738
20 EXEC #1:c=0,e=558,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=6317826627

 

1.1.2 针对非当前会话跟踪

 1 --开启user1 会话连接
 2 SQL> conn user1/user1
 3 Connected.
 4 SQL>
 5 
 6 --用DBA 用户查看
 7 SQL> select s.username,s.sid,p.spid from v$session s,v$process p
 8   2  where s.paddr = p.addr and s.username = 'USER1';
 9 
10 USERNAME                              SID SPID
11 ------------------------------ ---------- ------------
12 USER1                                 137 1325
13 
14 SQL> select sid,serial# from v$session where username = 'USER1';             
15 
16        SID    SERIAL#
17 ---------- ----------
18        137        118
19 
20 SQL>
21 
22 --另开启hr 会话连接
23 SQL> conn hr/hr123
24 Connected.
25 SQL> 
26 --在hr会话中开启对user1的跟踪
27 SQL> exec dbms_monitor.session_trace_enable(session_id=>137,serial_num=>118);
28 
29 PL/SQL procedure successfully completed.
30 
31 SQL> 
32 
33 --执行SQL 语句则开始跟踪
34 --跟踪完毕后执行下面的语句关闭跟踪
35 SQL> exec dbms_monitor.session_trace_disable(session_id=>137,serial_num=>118);
36 
37 PL/SQL procedure successfully completed.
38 
39 SQL> 

 

 1 --查看产生的跟踪会话文件
 2 bash-3.00$ vi sun_ora_1325.trc
 3 =====================
 4 PARSING IN CURSOR #1 len=39 dep=0 uid=61 oct=6 lid=61 tim=8939219692 hv=1424147089 ad='5d4ddba4'
 5 update t
 6 set name = 'TRACE'
 7 WHERE ID =7
 8 END OF STMT
 9 PARSE #1:c=60000,e=46632,p=0,cr=4,cu=0,mis=1,r=0,dep=0,og=1,tim=8939219683
10 EXEC #1:c=10000,e=18323,p=0,cr=37,cu=3,mis=0,r=1,dep=0,og=1,tim=8939238175
11 WAIT #1: nam='SQL*Net message to client' ela= 4 driver id=1650815232 #bytes=1 p3=0 obj#=52616 tim=8939238400
12 WAIT #1: nam='SQL*Net message from client' ela= 940 driver id=1650815232 #bytes=1 p3=0 obj#=52616 tim=8939239394
13 STAT #1 id=1 cnt=0 pid=0 pos=1 obj=0 op='UPDATE  T (cr=37 pr=0 pw=0 time=17923 us)'
14 STAT #1 id=2 cnt=1 pid=1 pos=1 obj=52616 op='TABLE ACCESS FULL T (cr=37 pr=0 pw=0 time=263 us)'
15 WAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1650815232 #bytes=1 p3=0 obj#=52616 tim=8939239595

1.2 基于实例级别跟踪

 1 --清除跟踪文件夹下先前产生的跟踪文件
 2 SQL> ! rm -f /u01/admin/sun/udump/*.trc
 3 
 4 
 5 --设置实例级别的跟踪
 6 SQL> conn /as sysdba
 7 Connected.
 8 SQL> alter system set sql_trace = true;
 9 System altered.
10 SQL> 
11 
12 --开启hr会话测试
13 SQL> conn hr/hr123
14 Connected.
15 SQL> select JOB_TITLE,MIN_SALARY,MAX_SALARY from jobs where JOB_ID='ST_MAN';
16 
17 JOB_TITLE                           MIN_SALARY MAX_SALARY
18 ----------------------------------- ---------- ----------
19 Stock Manager                             5500       8500
20 
21 SQL>
22 
23 --开启user1会话测试
24 SQL> conn user1/user1
25 Connected.
26 SQL> select * from t;
27 
28         ID NAME
29 ---------- ----------------
30          8 inspur
31          1 oracle
32 
33 。。。。。
34 
35 --查看SPID
36 SQL> select s.username,s.sid,p.spid from v$session s,v$process p
37   2  where s.paddr = p.addr; 
38   
39 USERNAME                              SID SPID
40 ------------------------------ ---------- ------------
41 HR                                    137 1378
42 USER1                                 141 1384

 

 1 --查看其各自产生的跟踪文件
 2 bash-3.00$ ls -l *.trc
 3 -rw-r-----   1 oracle   oinstall   17919 Aug 10 11:11 sun_ora_1378.trc  --对hr用户的跟踪
 4 -rw-r-----   1 oracle   oinstall   11140 Aug 10 11:13 sun_ora_1384.trc  --对USER1用户的跟踪
 5 bash-3.00$ 
 6 
 7 --关闭实例级别的跟踪
 8 SQL> alter system set sql_trace = false;
 9 
10 System altered.
11 
12 SQL> 

 

推荐阅读