背景:
当我们通过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)
当我们通过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/