Oracle 11g下如何捕捉library cache对象执行时产生的(2)


###对Trace得到的内容作一下总结
(1) 在父游标上获取Null模式的lock
(2) 在父游标上获取Exclusive模式的pin
(3) 释放父游标上Exclusive模式的pin
(4) 在子游标上获取Null模式的lock
(5) 在子游标上获取Exclusive模式的pin
(6) 释放子游标上Exclusive模式的pin
(7) 释放子游标上Null模式的lock
(8) 释放父游标上Null模式的lock


oracle 11g里该如何实现跟踪?
如果要在11g Trace出这些内容,使用10049 event时无效的,因为在11g里功能更强大的隐含参数_kgl_debug替代了原先的10049 event。
_kgl_debug参数可以在系统或者会话级别灵活设定跟踪对象,这个对象可以是table、index等object,也可以library cache里的一条语句
跟踪scott.t2这个对象:
alter session set "_kgl_debug"="name='T2' schema='SCOTT' namespace=1 debug=96"
其中namespace为1时表示:table/view/sequence/synonym等类型的object
其中namespace为2时表示:package body/type body等类型的object
debug=96表示仅针对lock和pin执行trace操作:
Trace Locks:0x20
Trace Pins:0x40
Trace Locks + Trace Pins=0x60=96


跟踪full hash value为0c3fd8f8071f22064d99be791649a55f的语句:
alter session set "_kgl_debug"="hash='0c3fd8f8071f22064d99be791649a55f' debug=96";
注意这里的full hash_value来自于X$KGLOB.KGLNAHSV,如何得到这个值,后面会有详细介绍。


下面就来演示一下11g里Trace lock/pin的过程
//////////////////////////
// ORACLE 11gR2 下的测试
//////////////////////////
###创建测试表
create table scott.t0517_2 as select * from all_users;


select * from scott.t0517_2;


###获取SQL的hash_value
set linesize 150
select address,child_address,sql_id,hash_value from v$sql where sql_text like 'select * from scott.t0517_2';
ADDRESS          CHILD_ADDRESS    SQL_ID        HASH_VALUE
---------------- ---------------- ------------- ----------
07000000BD3AEF00 07000000BD3AECB0 3ywd5md8ay2q0 1353648832


###根据hash_value找到KGLNAHSV
col KGLNAOWN format a30
col KGLNAOBJ format a30
set linesize 190
select kglhdadr,kglhdpar,kglnaown,kglnaobj,KGLNAHSH,KGLNAHSV from x$kglob where KGLNAHSH=1353648832;
KGLHDADR        KGLHDPAR        KGLNAOWN                      KGLNAOBJ                        KGLNAHSH KGLNAHSV
---------------- ---------------- ------------------------------ ------------------------------ ---------- --------------------------------
07000000BD3AECB0 07000000BD3AEF00                                select * from scott.t0517_2    1353648832 45ecd74da55e32363f71a59b50af0ac0
07000000BD3AEF00 07000000BD3AEF00                                select * from scott.t0517_2    1353648832 45ecd74da55e32363f71a59b50af0ac0


###session的Trace File名称
SQL> select value from v$diag_info where;


VALUE
------------------------------------------------------------------------------------------------------------------------------------------------------
/oradata06/tstdb1_diag/diag/rdbms/tstdb1/tstdb1/trace/tstdb1_ora_8193016.trc


###设置_kgl_debug同时跟踪表对象和SQL语句
alter system flush shared_pool;
alter session set "_kgl_debug"="name='T0517_2' schema='SCOTT' namespace=1 debug=96,hash='45ecd74da55e32363f71a59b50af0ac0' debug=96";  <---中间以逗号分隔


###执行语句
select * from scott.t0517_2;


###最后关闭_kgl_debug(将debug值设为0)
alter session set "_kgl_debug"="name='T0517_2' schema='SCOTT' namespace=1 debug=0,hash='45ecd74da55e32363f71a59b50af0ac0' debug=0";  <---中间以逗号分隔


因为我们设置_kgl_debug参数时指定了Scott.t0517_2表和"select * from scott.t0517_2"语句的作为Trace的对象,中间以逗号分隔,所以生成的TraceFile里既包含了Scott.t0517_2表上的


library cache lock/pin操作,也包含了"select * from scott.t0517_2"这条语句上的library cache lock/pin,Trace文件是按照xml格式组织的,以下是摘录的部分片段(来自于sql语句的跟踪):
<KGLTRACE>
  <Timestamp>2016-05-18 12:50:01.066</Timestamp>
  <SID>266</SID>
  <Function>kgllkal</Function>
  <Reason>TRACELOCK</Reason>
  <Param1>7000000bda28ef8</Param1>
  <Param2>0</Param2>
  <LibraryHandle>
    <Address>7000000bd9ef918</Address>
    <Hash>50af0ac0</Hash>
    <LockMode>N</LockMode>
    <PinMode>0</PinMode>
    <LoadLockMode>0</LoadLockMode>
    <Status>VALD</Status>
    <ObjectName>
      <Name>select * from scott.t0517_2</Name>
      <FullHashValue>45ecd74da55e32363f71a59b50af0ac0</FullHashValue>
      <Namespace>SQL AREA(00)</Namespace>                                <---<Namespace>SQL AREA(00)</Namespace>表示对SQL的跟踪,如果是<Type>TABLE(02)</Type>则表示对

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b30f18d2dd6b0e7dc6d087fce904bf2f.html