關於v$process與v$session中process的理解

孤竹星發表於2015-07-22

說明

v$session有個process欄位,V$PROCESS有個SPID欄位,這兩個欄位是不是一個意思呢?是不是都代表會話的作業系統程式呢?
官方文件上的解釋:
SPID      VARCHAR2(12)  Operating system process identifier
PROCESS   VARCHAR2(9)   Operating system client process ID
 
本文以資料庫伺服器安裝在unix上為例進行說明。

V$PROCESS中的SPID表示的是作業系統的程式,v$session中的process表示客戶端程式ID,即客戶端程式在客戶端機器上的程式ID號。一個表示客戶端程式在客戶端機器上的程式號,一個表示伺服器程式在伺服器上的程式號。

連線伺服器的會話,發起會話的客戶端程式可能是unix程式,也可能是windows程式。

-------------------
windows客戶端程式
-------------------
例如,使用windows程式連線unix上的資料庫,對應會話sid=35,對應客戶端windows的988:5412
格式為"客戶端PID:執行緒ID"。如"988:5412",
表明連線到資料庫的客戶端程式在客戶計算機上的程式ID是 988 ,該程式內的5412號執行緒執行了資料庫的連線。

set linesize 200
col machine format a30
col program format a50
col status format a10
col username format a10
select machine,program,username,status from v$session where sid=&oracle_sid;


Enter value for oracle_sid: 35
old   1: select machine,program,username,status,process from v$session where sid=&oracle_sid
new   1: select machine,program,username,status,process from v$session where sid=35

MACHINE                        PROGRAM          USERNAME   STATUS     PROCESS
------------------------------ ---------------- ---------- ---------- ------------
WORKGROUP\HXC                  plsqldev.exe     SYS        INACTIVE   988:5412


sid=35對應的unix資料庫伺服器上的伺服器程式為 16805

SQL> select spid os_sid
  2    from v$process
  3   where addr = (select paddr from v$session where sid = &oracle_sid);
Enter value for oracle_sid: 35
old   3:  where addr = (select paddr from v$session where sid = &oracle_sid)
new   3:  where addr = (select paddr from v$session where sid = 35)

OS_SID
------------
16805

 

[monitor:/]#ps -ef|grep 16805
    root 17278 17174  0 14:27:23 pts/tA    0:00 grep 16805
  oracle 16805     1  0 14:22:56 ?         0:00 oraclerobin (LOCAL=NO)
[monitor:/]#

 

 

-------------------
Unix客戶端程式
-------------------
再來看看unix客戶端連線到unix伺服器端的例項

連線伺服器的會話sid=260

對應的客戶端程式號為 26349

SQL> set linesize 200
SQL> col machine format a30
SQL> col program format a50
SQL> col status format a10
SQL> col username format a10
SQL>
SQL> select machine,program,username,status,process from v$session where sid=&oracle_sid;
Enter value for oracle_sid: 260
old   1: select machine,program,username,status,process from v$session where sid=&oracle_sid
new   1: select machine,program,username,status,process from v$session where sid=260

MACHINE   PROGRAM                              USERNAME   STATUS     PROCESS
--------- ------------------------------------ ---------- ---------- ------------
zhzw01    (TNS V1-V3)    BILL_GATHE ACTIVER    26349
               
               


對應的伺服器程式號為 13472
SQL> select spid os_sid
  2    from v$process
  3   where addr = (select paddr from v$session where sid = &oracle_sid);
Enter value for oracle_sid:  260
old   3:  where addr = (select paddr from v$session where sid = &oracle_sid)
new   3:  where addr = (select paddr from v$session where sid =  260)

OS_SID
------------
13472


hnzzzw01:/arraybill/home/oracle$ ps -ef|grep 13472
 orabill 25649 25452  0 14:22:56 pts/ta    0:00 grep 13472
 orabill 13472     1 255 10月  3  ?        30969:04 oraclehnbill (LOCAL=NO)
hnzzzw01:/arraybill/home/oracle$

 


-------------------
說明
-------------------

如果是透過sid,查詢到程式spid,使用作業系統命令直接殺掉程式
kill -9 spid

注意,是 spid,而不是v$session中對應的客戶端的process,別殺錯了程式。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28282660/viewspace-1744520/,如需轉載,請註明出處,否則將追究法律責任。

相關文章