ITPub博客

首页 > 数据库 > Oracle > [20181031]如何确定db_link的进程号.txt

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

原创 Oracle 作者:lfree 时间:2018-10-19 07:48:14 0 删除 编辑

[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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7970751