[20181031]如何确定db_link的进程号.txt
--//别人问的问题,就是客户端连接数据库(A),然后通过db_link连接访问别的数据库(B),如果确定数据库(B)中
--//使用db_link的进程号.
--//关于这个问题,我曾经在链接:http://blog.itpub.net/267265/viewspace-2150595/=>[20180129]db_link使用ezconnect注意.txt
--//做过类似尝试,当时为了定位打开db_link的进程,可以讲破费一番波折.我那种方式也仅仅适用我当时的测试环境,没人连接我的测试库.
--//实际上当客户端使用db_link时,使用本地的进程号对应(v$process.spid)连接数据库(B).
--//实际上在数据库(B),查询v$session.porcess = 前面v$process.spid值
--//参考链接:http://blog.itpub.net/267265/viewspace-2146724/=>[20171102]视图v$session中process字段含义.txt
--//对方数据库都是windows,windows使用线程.这样相对linux操作系统复杂一点.
--//通过测试说明问题.
1.环境:
SCOTT@test01p> @ver1
PORT_STRING VERSION BANNER CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
SCOTT@test01p> CREATE PUBLIC DATABASE LINK LOOPBACK CONNECT TO SCOTT IDENTIFIED BY book USING 'localhost:1521/book:DEDICATED';
Database link created.
--//环境限制,使用一台机器测试.
2.定位:
SCOTT@test01p> @ spid
SID SERIAL# PROCESS SERVER SPID PID P_SERIAL# C50
---------- ---------- ------------------------ --------- -------------------- ------- ---------- --------------------------------------------------
87 29146 4848:3848 DEDICATED 6000 25 12 alter system kill session '87,29146' immediate;
--//我当时说过:PROCESS=4848:3848,冒号前4848就是cliend的进程号(PID).后面对应tid(对于windows你可以使用sysinternals的
--//procexp.exe查看)
D:\tools\rlwrap>tasklist /FI "PID eq 4848"
tasklist /FI "PID eq 4848"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
sqlplus.exe 4848 Console 1 19,724 K
--//process对应client的进程号4848.当前连接对应服务器pid=600(注意windows下使用线程,这个也就是线程号)
3.打开db_link看看:
SCOTT@test01p> select sysdate from dual@loopback;
SYSDATE
-------------------
2018-10-18 21:17:08
--//要确定这个db_link的进程号,相当于查询(如果在linux下):
SCOTT@test01p> select * from v$session where process = '6000';
no rows selected
--//这样查不行,因为windows看到spid实际上是线程号.这样前面应该还有pid.
SCOTT@test01p> select sid,serial#,process,program,machine,port,paddr from v$session where process like '%:6000';
SID SERIAL# PROCESS PROGRAM MACHINE PORT PADDR
---------- ---------- ------------------------ -------------------------- -------------------- ---------- ----------------
250 57087 5840:6000 ORACLE.EXE ZWS 50991 000007FF09FA99E0
--//ok,这样查询就ok了.
SCOTT@test01p> select spid from v$process where addr='000007FF09FA99E0';
SPID
-----
5652
--//可以确定数据库B看到的进程号就是5652.你也可以查询端口号50991是否能对上.
D:\tools\rlwrap>netstat -na -o | grep 50991
TCP 127.0.0.1:1521 127.0.0.1:50991 ESTABLISHED 6016
TCP 127.0.0.1:50991 127.0.0.1:1521 ESTABLISHED 5840
--//注意看后面的数值对应pid=5840,就是process的pid部分.
4.最后看看pid=5840,6016是什么?
D:\tools\rlwrap>tasklist /FI "PID eq 5840"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
oracle.exe 5840 Services 0 1,076,996 K
--//这样就对上,oracle在windows下采用线程机制.
D:\tools\rlwrap>tasklist /FI "PID eq 6016"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
tnslsnr.exe 6016 Services 0 8,416 K
--//对应监听进程.
5.使用orakill杀进程看看.
D:\tools\rlwrap>orakill /?
Usage: orakill sid thread
where sid = the Oracle instance to target
thread = the thread id of the thread to kill
The thread id should be retrieved from the spid column of a query such as:
select spid, osuser, s.program from
v$process p, v$session s where p.addr=s.paddr
--//不知道12c能这样用吗?
D:\tools\rlwrap>orakill test01p 5652
Could not attach to Oracle instance test01p: err = 203
--//不能使用pdb.实际上应该使用cdb
D:\tools\rlwrap>orakill test 5652
Kill of thread id 5652 in instance test successfully signalled.
--//OK.回到原来会话执行;
SCOTT@test01p> select sysdate from dual@loopback;
select sysdate from dual@loopback
*
ERROR at line 1:
ORA-24757: duplicate transaction identifier
ORA-02063: preceding line from LOOPBACK
--//证明前面的判断是正确的.db_link链接已经断开.
SCOTT@test01p> commit ;
commit
*
ERROR at line 1:
ORA-02051: another session or branch in same transaction failed or finalized
SCOTT@test01p> select sysdate from dual;
SYSDATE
-------------------
2018-10-18 21:36:24
SCOTT@test01p> commit ;
Commit complete.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2216852/ ,如需转载,请注明出处,否则将追究法律责任。