[20181031]如何确定db_link的进程号.txt

来源:这里教程网 时间:2026-03-03 12:06:38 作者:

[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.

相关推荐