[20181031]如何確定db_link的程式號.txt

lfree發表於2018-10-19

[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部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2216852/,如需轉載,請註明出處,否則將追究法律責任。

相關文章