知识大全 Oracle内部函数调用追踪器

Posted 函数

篇首语:贵有恒,何必三更起、五更眠、最无益,只怕一日曝、十日寒。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Oracle内部函数调用追踪器相关的知识,希望对你有一定的参考价值。

Oracle内部函数调用追踪器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

  例子

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

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

  _opiprs *

  _rpisplu *

  _kprbprs

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

  注意 # 为注释符

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

  

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

  SQL代码

  …

  [ : : ]User call: _rpisplu (TID: )

  [Args( )]:

  

  

  

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

   × (=>NULL)

  

  [ : : ]User call: _rpisplu (TID: )

  [Args( )]:

  

  

  

   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

   xd (=>NULL)

  

  [ : : ]User call: _opiprs (TID: )

  [Args( )]:

   × cce (=> × )

   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

   xd (=>NULL)

   × bfe (=> × )

  

  

  [ : : ]User call: _rpisplu (TID: )

  [Args( )]:

  

   × (=>NULL)

   × (=>NULL)

   select sysdate + / ( * ) from dual

   × (=>NULL)

  

  [ : : ]User call: _rpisplu (TID: )

  [Args( )]:

  

   × (=>NULL)

   × (=>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 := ; ELSE :b := ; END IF; END;

   xd (=>NULL)

  

  …

  点击 Stop 按钮 停止追踪

  例子 :

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

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

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

  

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

  SQL代码

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

  SPID

  ————

  

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

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

  SQL代码

  HELLODBA >select * from demo t_test 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_TEST                         AAA                                           TABLE              

   : : : : : : : VALID   N N N

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

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

  SQL代码

  [ : : ]User call: _qertbFetchByRowID (TID: )

  [ : : ]User call: _qerixtFetch (TID: )

  [ : : ]User call: _qertbFetchByRowID (TID: )

  [ : : ]User call: _qerixtFetch (TID: )

  有了这样的追踪记录 你可以尝试将他们与执行计划中节点映射

  SQL代码

  HELLODBA >select * from demo t_test where owner= DEMO and object_name like T_TEST% ;

  Execution Plan

  ———————————————————

  Plan hash value:

  ——————————————————————————————

  | Id  | Operation                   | Name        | Rows  | Bytes | Cost (%CPU)| Time     |

  ——————————————————————————————

  |   | SELECT STATEMENT            |             |     |   |        ( )| : : |

  |   |  TABLE ACCESS BY INDEX ROWID| T_TEST      |     |   |        ( )| : : | ==> _qertbFetchByRowID

  |*  |   INDEX RANGE SCAN          | T_TEST_IDX |     |       |        ( )| : : | ==> _qerixtFetch

  例子 :

  打印某个特定函数被调用时的线程调用堆栈

  我们这里追踪 _kkeAdjSingTabCard 设置追踪点

  SQL代码

  _kkeAdjSingTabCard*

  函数名后的 *N 指定输出的调用个数 为无限制

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

  SQL代码

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

  SPID

  ————

  

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

  在被追踪的会话中解释一条语句

  SQL代码

  HELLODBA >explain plan for select /*+full(t)*/ count(*) from demo t_test t;

  Explained

  我们就可以从监控窗口获取到该函数被调用时的整个调用堆栈的情况

  SQL代码

  [ : : ]User call: _kkeAdjSingTabCard (TID: )

  Call Stacks( ):

   × (ORACLE EXE!_kkoitbp+ )

   × c d (ORACLE EXE!_kkoijbad+ )

   × d b (ORACLE EXE!_kkoCopyPreds+ )

   × ee a (ORACLE EXE!_kkosta+ )

   × d f c (ORACLE EXE!__PGOSF __apaRequestBindCapture+ )

   × d (ORACLE EXE!_apagcp+ )

   × d c (ORACLE EXE!_apafbr+ )

   xea (ORACLE EXE!_opitcaNcp+ )

   × b eb (ORACLE EXE!_kksMinimalTypeCheck+ )

   × d (ORACLE EXE!_rpidrus+ )

   × b ce (ORACLE EXE!_kksSetNLSHandle+ )

   × e (ORACLE EXE!_kxsReleaseRuntimeLock+ )

   × (ORACLE EXE!_kkscbt+ )

   × e cf (ORACLE EXE!_kksParseCursor+ )

   × f b (ORACLE EXE!_kksxscpat+ )

   × e (ORACLE EXE!_opibrp+ )

   × cd ed (ORACLE EXE!_kpodrd+ )

   × cba c (ORACLE EXE!_kpocrs+ )

   × e (ORACLE EXE!_opirip+ )

   × feff (oramon dll!_ttcpro+ )

   × a (ORACLE EXE!_opiodr+ )

   × (ORACLE EXE!_opiino + )

   × e (ORACLE EXE!_opirip+ )

   × e (ORACLE EXE!_opidcl+ )

   × a (ORACLE EXE!_ksdwri+ )

   × (ORACLE EXE!_ssthrnfy+ )

   × (ORACLE EXE!_opimai_init+ )

   × (ORACLE EXE!_osnsoiint+ )

   × c b (KERNEL dll!GetModuleFileNameA+ )

  [Args( )]:

   × e d

   × e da

  

   × a

   ×

cha138/Article/program/Oracle/201311/18739

相关参考

知识大全 使用OTL调用Oracle的存储函数

使用OTL调用Oracle的存储函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  OTL介绍 

知识大全 在Java中调用Oracle的过程和函数

在Java中调用Oracle的过程和函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  内容或简

知识大全 在PB中调用外部函数[1]

在PB中调用外部函数[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ORACLE数据库的P

知识大全 javascript中iframe里面的页面调用父窗口js函数的方法

  实现iframe内部页面直接调用该iframe所属父窗口自定义函数的方法  比如有A窗口A内有个IFRAMEBB里面的装载的是C页面这时C要直接调用A里面的一个自定义函数ExpandPage();

知识大全 不同类型的成员函数

   在上例的成员函数声明中你需要注意两点getArea()定义为private型drawRect()定义为public型public型意味着任何类都可以调用它private型它只能被所声明的类内部调

知识大全 Oracle10g回溯版本查询追踪行变化

Oracle10g回溯版本查询追踪行变化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  故障检查

知识大全 php方法调用模式与函数调用模式简例

  现有某函数与对象如下:  vardoubling=function(x)returnx*;;varobj=val:;函数调用模式时this被绑定到全局对象这种情况在对象的属性与方法被初始化时也能够

知识大全 JavaScript:new 一个函数和直接调用函数的区别分析

JavaScript:new一个函数和直接调用函数的区别分析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 函数调用方式的区别[thiscall,

  通常在使用VC进行函数定义时会指定该函数调用方式诸如   int__stdcallmax(intaintb)     

知识大全 C#调用Windows API函数

C#调用WindowsAPI函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Api函数是构筑