来源: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)
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。