ITPub博客

首页 > 数据库 > Oracle > 跟踪DBLINK创建的会话(Tracing session created through dblink )

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

原创 Oracle 作者:闪电帥龟龟 时间:2016-05-26 22:44:36 0 删除 编辑
背景:
     当我们通过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博客 ” ,链接:https://blog.itpub.net/31043804/viewspace-2107611/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2016-03-19

  • 博文量
    26
  • 访问量
    61306