跟蹤使用者的SQL

lsm_3036發表於2011-04-07

在Oracle中做SQL跟蹤,估計大部分都會用sqlplus中的autotrace或者設定10046跟蹤。但是,如果是除錯某個應用系統的話,特別是開啟了連線池的系統,靠以上兩種方法基本上就歇菜了。還是SQL Server的SQL Server Profiler好啊。
最近在看馮大輝翻譯的《Oracle效能診斷藝術》,發現一個很好的技巧,思路是建一個Logon,現摘錄如下(稍作了一個修改):
create role trace_10046_role;
CREATE OR REPLACE TRIGGER SYS.set_10046_trace_on_logon
AFTER LOGON ON DATABASE
BEGIN
  if ( dbms_session.is_role_enabled('trace_10046_role') and user not in ('SYS','SYSTEM')  ) then
    EXECUTE IMMEDIATE 'alter session set statistics_level=ALL';
    EXECUTE IMMEDIATE 'alter session set max_dump_file_size=UNLIMITED';
    EXECUTE IMMEDIATE 'alter session set tracefile_identifier='''||user||'_10046''';
    EXECUTE IMMEDIATE 'alter session set events ''10046 trace name context forever, level 12''';
  end if;
END set_10046_trace_on_logon;啟用和禁用對系統進行做10046跟蹤SQL:
SQL> show user;
USER is "SYS"
SQL> grant trace_10046_role to cms_text;
SQL> select * from dba_ROLE_PRIVS where granted_role='TRACE_10046_ROLE';
GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
SYS                            TRACE_10046_ROLE               YES YES
CMS_TEXT                       TRACE_10046_ROLE               NO  YES
Grant succeeded.
SQL> revoke trace_10046_role from cms_text;
SQL> select * from dba_ROLE_PRIVS where granted_role='TRACE_10046_ROLE';

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
SYS                            TRACE_10046_ROLE               YES YES其實就是將 trace_10046_role grant/revoke 給相應的使用者。
當具有 trace_10046_role 角色的使用者登入後在udump下就會出現相應的trc檔案:
[oracle@test-server udump]$ pwd
/u01/app/admin/ora8i/udump
[oracle@test-server udump]$ ls
ora8i_ora_8259_CMS_TEXT_10046.trc

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16978544/viewspace-691844/,如需轉載,請註明出處,否則將追究法律責任。

相關文章