用户进程跟踪
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>