跟踪DBLINK创建的会话(Tracing session created through dblink )

背景:
     当我们通过DBLINK执行的sql或者存储过程,但无法再本地获取到对应的执行计划。
     这时我们可以通过追踪,并对远端的对应进程trace跟踪,达到本地执行,远端生成执行计划的目的,以便于进行分析


1) 远端数据库确认该用户没有session(即创建DBLINK中使用的用户)
    SQL> select * from v$session where username = 'user_name';

2)本地端sqlplus登录,使用该DBLINK向远端发起一个简单的select查询如下,并保持该会话open
SQL>select count(*) from dual@dblink;


3)在远端数据库,找出上边通过DBLINK创建并生成的session id。可根据MACHINE列确认出对应SID(如果出现多个会话,使用步骤1确认出)
SQL>select sid, username, machine from v$session;
In case of multiple outputs with same username,machine combination, use the output from step1 to identify the new session created.
    
    然后使用SID确认出对应的process
    V$PROCESS:
    SELECT pid FROM v$process
    WHERE addr =
           (SELECT paddr FROM v$session
            WHERE  sid =&sid);
    
4) 开启对远端进程PID跟踪(从上边获取到的)
      SQL> connect / as sysdba
      SQL> oradebug setorapid pid
      SQL> oradebug unlimit
      SQL> oradebug event 10046 trace name context forever, level 12
    
5) 然后在本地同一个session窗口,手工执行存过或者查询带有该DBLINK的操作  


 
实验过程:
1、本地: 创建DBLINK  TEST_REMOTE_TRACE 用作实验,并验证DBLINK是通的

SQL>  CREATE public DATABASE LINK TEST_REMOTE_TRACE
  2   CONNECT TO test IDENTIFIED BY "test"
  3   USING 'DB11G';
Database link created.

SQL> select * from dual@TEST_REMOTE_TRACE;
D
-
X
2、远端: 确认远端数据库没有改DBKINK用户对应的session
SQL> select * from v$session where username = 'test';

no rows selected

3、本地:本地端sqlplus登录,使用该DBLINK向远端发起一个简单的select查询如下,并保持该会话open
SQL> select * from dual@TEST_REMOTE_TRACE;
D
-
X
4、在远端数据库,找出上边通过DBLINK创建并生成的session id。可根据MACHINE列确认出对应SID(如果出现多个会话,使用步骤1确认出)
SQL> col USERNAME for a20
SQL> col MACHINE for a30
SQL> select sid, username, machine,process source_process from v$session where username=upper('test');


       SID USERNAME             MACHINE                        SOURCE_PROCESS
---------- -------------------- ------------------------------ ------------------------------------------------------------------------
        40 test            db2                           15184    >>>该列只是为了确认确实是该process来自源端


--找到该session在远端数据库对应的process id
SQL>             SELECT pid FROM v$process
  2              WHERE addr =
  3                             (SELECT paddr FROM v$session
  4                              WHERE  sid =&sid);
Enter value for sid: 40


       PID
----------
        30
4) 开启对远端进程PID跟踪(从上边获取到的)
SQL> oradebug setorapid 30   >>>指定pid
Oracle pid: 30, Unix process pid: 21678, image: oracle@db11g
SQL> oradebug unlimit
Statement processed.
SQL> oradebug event 10046 trace name context forever, level 12
Statement processed.
SQL> oradebug tracefile_name   >>>显示对应的tracefile
/u01/app/oracle/diag/rdbms/db11g/db11g/trace/db11g_ora_21678.trc


5)格式化trc并分析
tkprof /u01/app/oracle/diag/rdbms/db11g/db11g/trace/db11g_ora_21678.trc     /u01/app/oracle/diag/rdbms/db11g/db11g/trace/21678.tkf

NOTE:以上演示的只是追踪的原理,实际上在生产环境中,我们只需从第4步,因为在本地我们通过确定本地的process,能在dblink的远端直接确认sid,继而确定远端的process进行trace跟踪。

相关参考: Tracing session created through dblink (文档 ID 258754.1)
              

                   SQL TRACE TKProf报告:http://www.askmaclean.com/archives/maclean-tech-tkprof-10046.html

















来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31043804/viewspace-2107611/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31043804/viewspace-2107611/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值