Oracle用户进程跟踪

用户进程跟踪

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> 

 

你可能感兴趣的:(oracle)