♣数据库
题目部分api
在Oracle中,跟踪会话执行语句的方法有哪几种?session
♣oracle
答案部分
app
由于TRACE的目标范围不一样,因此致使必须使用不一样的方法。若做用于数据库全局的,则改初始化参数。若只做用于当前会话的,则就用ALTER SESSION命令。若做用于其它会话的,则就用DBMS_SYSTEM包。ide
① SQL_TRACE参数设置:很是传统的方法工具
SQL_TRACE能够做为初始化参数在全局启用,也能够经过命令行方式在具体会话启用。在参数文件(PFILE/SPFILE)中指定:SQL_TRACE=TRUE或ALTER SYSTEM SET SQL_TRACE=TRUE;。性能
经过在全局启用SQL_TRACE能够跟踪到全部后台进程及全部用户进程的活动,经过跟踪文件的实时变化,能够清晰地看到各个进程之间的紧密协调。须要注意的是,在全局启用SQL_TRACE会产生大量trace文件,很容易耗尽磁盘空间,这一般会致使比较严重的性能问题,因此在生产环境中要谨慎使用,而且及时关闭。命令行
在大多数时候使用SQL_TRACE跟踪的都是当前会话的进程。经过跟踪当前进程能够发现当前操做的后台数据库递归活动,这在研究数据库新特性时尤为有效,在研究SQL执行,发现后台错误等方面也很是有用。debug
在会话级启用和中止SQL_TRACE的方式以下所示:
启用当前SESSION的跟踪:
1SQL> ALTER SESSION SET SQL_TRACE=TRUE; 2Session altered.
此时的SQL操做将被跟踪:
1SQL> SELECT COUNT(*) FROM DBA_USERS; 2 COUNT(*) 3---------- 4 44
结束跟踪:
1SQL> ALTER SESSION SET SQL_TRACE=FALSE; 2Session altered.
在不少时候须要跟踪其余用户的进程,而不是当前用户,这能够经过Oracle提供的系统包DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION来完成。
经过V$SESSION能够得到SID、SERIAL#等信息,得到进程信息,选择须要跟踪的进程:
1SQL> col spid for a8 2SQL> col spid for a10 3SQL> col username for a10 4SQL> col tracefile for a80 5SQL> SELECT S.INST_ID, S.SID, S.SERIAL#, P.SPID, S.USERNAME, P.TRACEFILE 6 2 FROM GV$SESSION S, GV$PROCESS P 7 3 WHERE P.ADDR = S.PADDR 8 4 AND S.INST_ID = P.INST_ID 9 5 AND S.USERNAME IS NOT NULL; 10 INST_ID SID SERIAL# SPID USERNAME TRACEFILE 11---------- ---------- ---------- ---------- ---------- --------------------------------------------------------------------------- 12 1 144 293 37302 SYS /u02/app/oracle/diag/rdbms/oratest/oratest/trace/oratest_ora_37302_lhr.trc 13 1 146 1557 37340 SYS /u02/app/oracle/diag/rdbms/oratest/oratest/trace/oratest_ora_37340.trc 14 1 26 321 37380 LHR /u02/app/oracle/diag/rdbms/oratest/oratest/trace/oratest_ora_37380.trc 15 1 152 3243 37400 SYS /u02/app/oracle/diag/rdbms/oratest/oratest/trace/oratest_ora_37400.trc
设置跟踪SID为26的会话:
1SQL> EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(26,321,TRUE); 2PL/SQL procedure successfully completed.
能够等候片刻,等待SID为26的会话执行SQL,完成后,中止跟踪:
1SQL> EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(26,321,FALSE); 2PL/SQL procedure successfully completed.
② 使用10046事件
全局设定:参数文件中指定:EVENT="10046 TRACE NAME CONTEXT FOREVER,LEVEL 12"
或者:
1SQL> ALTER SYSTEM SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';--启用 2SQL> ALTER SYSTEM SET EVENTS '10046 TRACE NAME CONTEXT OFF';--关闭
当前会话设定:
1SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12'; 2SQL> --执行SQL语句 3SQL> ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';
在Oracle 11g中还能够对单个SQL打开10046事件跟踪,命令以下所示:
1ALTER SYSTEM SET EVENTS 'SQL_TRACE [SQL:&&SQL_ID] WAIT=TRUE,BIND=TRUE,PLAN_STAT=ALL_EXECUTIONS,LEVEL=12';
关闭单个SQL的跟踪命令以下所示:
1ALTER SYSTEM SET EVENTS 'SQL_TRACE [SQL:&&SQL_ID] OFF';
若要针对每一个新链接的会话生成10046跟踪文件,则可使用登陆触发器。以下的代码是跟踪LHR用户的信息,在用户LHR登陆数据库系统时会启动10046跟踪。
1CREATE OR REPLACE TRIGGER TRI_SET_TRACE_LHR 2AFTER LOGON ON DATABASE 3WHEN (USER IN ('LHR')) 4DECLARE 5BEGIN 6 EXECUTE IMMEDIATE 'ALTER SESSION SET STATISTICS_LEVEL=ALL'; 7 EXECUTE IMMEDIATE 'ALTER SESSION SET MAX_DUMP_FILE_SIZE=UNLIMITED'; 8 EXECUTE IMMEDIATE 'ALTER SESSION SET EVENTS ''10046 TRACE NAME CONTEXT FOREVER, LEVEL 12'''; 9END TRI_SET_TRACE_LHR;
③ DBMS_SESSION包:只能跟踪当前会话,不能指定会话
跟踪当前会话:
1SQL> EXEC DBMS_SESSION.SET_SQL_TRACE(TRUE); 2SQL> 执行SQL 3SQL> EXEC DBMS_SESSION.SET_SQL_TRACE(FALSE);
DBMS_SESSION.SET_SQL_TRACE至关于ALTER SESSION SET SQL_TRACE,从生成的TRACE文件能够明确地看ALTER SESSION SET SQL_TRACE语句。使用DBMS_SESSION.SESSION_TRACE_ENABLE过程,不只能够看到等待事件信息还能够看到绑定变量信息,至关于“ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';”语句:
1SQL> EXEC DBMS_SESSION.SESSION_TRACE_ENABLE(WAITS=>TRUE,BINDS=>TRUE); 2SQL> 执行SQL 3SQL> EXEC DBMS_SESSION.SESSION_TRACE_DISABLE();
④ DBMS_SYSTEM包
使用DBMS_SYSTEM.SET_EV设置10046事件:
1SQL> EXEC DBMS_SYSTEM.SET_EV(SID,SERIAL#,10046,12,'');--启用跟踪 2SQL> EXEC DBMS_SYSTEM.SET_EV(SID,SERIAL#,10046,0,'');--结束跟踪
⑤ DBMS_MONITOR包
该包是从Oracle 10g开始提供的,功能很是强大。可在模块级别、动做级别、客户端级别、数据库级别、会话级别进行跟踪,Oracle官方支持。
跟踪当前会话:
1SQL> EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE; 2SQL> --执行SQL 3SQL> EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE;
跟踪其余会话:
1SQL>EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(SESSION_ID=>SID,SERIAL_NUM=>SERIAL#,WAITS=>TRUE,BINDS=>TRUE); 2SQL> --执行SQL 3SQL>EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(SESSION_ID=>SID,SERIAL_NUM=>SERIAL#);
⑥ oradebug
这是SQL*Plus的工具,须要提供OSPID或者Oracle PID。
跟踪当前会话:
1SQL> oradebug setmypid; 2Statement processed. 3SQL> oradebug unlimit; 4Statement processed. 5SQL> oradebug event 10046 trace name context forever,level 12; 6Statement processed. 7SQL> 执行SQL 8SQL> oradebug tracefile_name 9SQL> oradebug event 10046 trace name context off; 10Statement processed.
跟踪其余会话:
1SQL> select spid,pid2 from v$process 2 2 where addr in (select paddr from v$session where sid=(select distinct sid from v$mystat)); 3SPID PID 4------------ ---------- 51457 313 6SQL> oradebug setospid 1457; 7Statement processed.
或者:
1SQL> oradebug setorapid 313; 2Statement processed. 3SQL> oradebug unlimit; 4Statement processed. 5SQL> oradebug event 10046 trace name context forever,level 12; 6Statement processed. 7SQL> oradebug tracefile_name 8SQL> oradebug event 10046 trace name context off; 9Statement processed.
使用oradebug help能够查看oradebug的命令帮助。