Oracle内部函数调用追踪器

来源:Oracle认证    发布时间:2012-11-12    Oracle认证视频    评论

  基于以前开发的一个用于监控线程的CPU使用状况的小工具,TopShow,我开发了一个用于追踪Oracle内部函数调用的追踪器——OraTracer. 你可以用该工具追踪监控Oracle多个内部函数的调用情况,还可以尝试探测函数的输入参数的值,也可以打印追踪点被触发时的调用堆栈。追踪可以设置在整个Oracle进程的级别,也可以设置在某个线程以追踪特定的会话。

  例子 1:

  捕获oracle整个实例中被执行的SQL语句。

  首先,在与可执行文件相同的目录下设置追踪点文件”TracePoints.txt”,内容如下:

  _opiprs 6*1

  _rpisplu 6*2

  _kprbprs 6

  与函数名用空格相隔的数值为探测的参数数量,如果再加上”*N”,则表示尝试将双字节数字作为指针对待,递归获取其执行的值,后面的数字为递归深度。例如,对于第一个追踪点,函数名为”_opiprs”,探测6个参数,递归探测指针数据的深度为1。

  注意:”#”为注释符。

  然后从进程列表中选择”ORACLE.EXE”,不要选择任何线程:

  最后,点击”Trace”按钮。一旦有语句被上述函数调用,你就可以从监控窗口看到这些语句:

  SQL代码

  …

  [2010-5-28 3:53:23.426]User call: _rpisplu (TID: 5276)

  [Args(6)]:

  6

  0

  0

  “select privilege#,level from sysauth$ connect by grantee#=prior privilege# and privilege#>0 start with grantee#=:1 and privilege#>0“

  0×84(=>NULL)

  0

  [2010-5-28 3:53:23.442]User call: _rpisplu (TID: 5276)

  [Args(6)]:

  6

  0

  0

  “alter session set NLS_LANGUAGE=’AMERICAN’ NLS_TERRITORY=’AMERICA’ NLS_CURRENCY=’$’ NLS_ISO_CURRENCY=’AMERICA’ NLS_NUMERIC_CHARACTERS=’.,’ NLS_DATE_FORMAT=’DD-MON-RR’ NLS_DATE_LANGUAGE=’AMERICAN’ NLS_SORT=’BINARY’“

  0xd4(=>NULL)

  0

  [2010-5-28 3:53:23.473]User call: _opiprs (TID: 5276)

  [Args(6)]:

  0×70cce00(=>0×4000000)

  “alter session set NLS_LANGUAGE=’AMERICAN’ NLS_TERRITORY=’AMERICA’ NLS_CURRENCY=’$’ NLS_ISO_CURRENCY=’AMERICA’ NLS_NUMERIC_CHARACTERS=’.,’ NLS_DATE_FORMAT=’DD-MON-RR’ NLS_DATE_LANGUAGE=’AMERICAN’ NLS_SORT=’BINARY’“

  0xd5(=>NULL)

  0×4bfe214(=>0×18)

  0

  6

  [2010-5-28 3:53:23.504]User call: _rpisplu (TID: 5276)

  [Args(6)]:

  3

  0×20(=>NULL)

  0×20(=>NULL)

  “select sysdate + 1 / (24 * 60) from dual“

  0×28(=>NULL)

  1

  [2010-5-28 3:53:23.520]User call: _rpisplu (TID: 5276)

  [Args(6)]:

  5

  0×20(=>NULL)

  0×20(=>NULL)

  “DECLARE job BINARY_INTEGER := :job; next_date DATE := :mydate;  broken BOOLEAN := FALSE; BEGIN EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS(); :mydate := next_date; IF broken THEN :b := 1; ELSE :b := 0; END IF; END; “

  0xd5(=>NULL)

  0

  …

  点击”Stop”按钮,停止追踪。

  例子 2:

  理解SQL是如何被执行计划驱动执行的。

  我们知道,查询计划实际上就是驱动Oracle通过特定函数及顺序来获取数据。我们可以通过追踪这些函数来理解执行计划。

  首先下载以下文件,解压,重命名为”TracePoints.txt”,放到OraTracer.exe所在目录:

  http://www.HelloDBA.com/download/TracePoints_ALL_Query_Calls.zip

  然后获取到你需要追踪的会话的SPID:

  SQL代码

  HELLODBA.COM>select distinct spid from v$mystat m, v$session s, v$process p where s.sid=m.sid and s.paddr=p.addr;

  SPID

  ————

  11076

  从进程列表中选择ORACLE.EXE => 从线程列表中选择TID为11076的线程 => 点击”Trace”按钮

  在被追踪的会话中执行一条语句:

  SQL代码

  HELLODBA.COM>select * from demo.t_test1 where owner=‘DEMO’ and object_name like ‘T_TEST%’;

  OWNER                          OBJECT_NAME                    SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         CREATED

  LAST_DDL_TIME       TIMESTAMP           STATUS  T G S

  —————————— —————————— —————————— ———- ————– ——————- ———–

  ——– ——————- ——————- ——- - - -

  DEMO                           T_TEST1                        AAA                                 97819          97819 TABLE               2007-06-07

  13:48:08 2007-06-07 13:48:08 2007-06-07:13:48:08 VALID   N N N

  注意:为了避免回滚调用也被追踪,你最好在追踪之前先运行一次该语句。

  我们可以从追踪窗口看到数据fetch调用情况:

  SQL代码

  [2010-5-28 6:28:29.649]User call: _qertbFetchByRowID (TID: 11076)

  [2010-5-28 6:28:29.711]User call: _qerixtFetch (TID: 11076)

  [2010-5-28 6:28:29.727]User call: _qertbFetchByRowID (TID: 11076)

  [2010-5-28 6:28:29.727]User call: _qerixtFetch (TID: 11076)

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答