Oracle 動態效能表 v$session & v$process各個欄位的說明

不一樣的天空w發表於2017-06-30

Oracle 動態效能表 v$session & v$process各個欄位的說明

oracle官方文件之V$SESSION

v$session描述的物件是一個會話

v$session描述的物件是一個當前存在的會話(該會話不是包括當前連線到的會話,這只是資料庫前臺伺服器程式的會話,還有資料庫後臺程式的會話,它是沒有連線的)。

下面對v$session裡的欄位進行分組說明:


用於標識確定唯一的一個會話:SID:SERIAL#或是SADDR

SADDR: session address

 或是

SID: session identifier,常用於連線其它列。

 SERIAL#: sid 會重用,但是同一個sid被重用時,serial#會增加,不會重複。

 註釋:

AUDSID: audit session id。

可以透過audsid查詢當前session的sid。select sid from v$session where audsid=userenv('sessionid');

所以,SIDAUDSID兩者值是一一對應的。

 AUDSID用途不一樣跟SID



一個會話的與自身相關的屬性:

COMMAND: session正在執行的SQL Id。1代表create table,3代表select。

 TADDR: 當前的transaction address。可以用來關聯v$transaction的addr欄位。

STATUS: 用來判斷session狀態。Active:正執行SQL語句。Inactive:等待操作。Killed:被標註為刪除。

 SERVER: server type (dedicated or shared)

Server type:

  • DEDICATED

  • SHARED

  • PSEUDO (?)

  • POOLED (?)

  • NONE

註釋:

v$session中server欄位何時為none?

TYPE: session type (background or user)

USER#: session's user id。等於dba_users中的user_id。內部程式(即後臺程式)的user#為0。

 USERNAME: session's username,即表示(服務端資料庫裡的)哪個資料庫使用者(而非服務端的的使用者)在使用該會話。等於dba_users中的username。內部程式(即後臺程式)的username為空。

SCHEMA#: schema user id。Oracle內部程式的schema#為0。

 SCHEMANAME: schema username。Oracle內部程式的schemaname為sys。(??不是為空?對應於username?)

一個會話的所在的程式:

PADDR: process address(Address of the process that owns the session),關聯v$process的addr欄位,可以透過這個欄位查處當前session對應作業系統的那個程式的id

 TYPE欄位為background時,PROGRAM為服務端資料庫裡的oracle後臺程式TYPE欄位為user時,PROGRAM為客戶端(用於連線到服務端資料庫的)應用程式(,例如,sqlplus.exe)。而以下除了PROGRAM外的欄位都是用於描述PROGRAM的相關屬性的:

 

PROGRAM: 客戶端應用程式的程式名。這裡說明一點,我們透過客戶端連線到遠端的服務端後,再在比如客戶端的sqlplus視窗上使用v$session來檢視的話,則v$session檢視中PROGRAM欄位裡的值為比如ORACLE.EXE (PMON)這樣子的是表示服務端的例項的後臺程式們,那麼此時v$session檢視中PROCESS欄位裡的值表示為這些服務端的程式在服務端作業系統裡的作業系統級別的程式ID號;而當v$session檢視中PROGRAM欄位裡的值為比如sqlplus.exe或是sqldeveloperw.exe這樣子的時才是表示這些程式是來自客戶端的程式(即一個應用程式(靜)的複製來執行(動))的程式名,那麼此時v$session檢視中PROCESS欄位裡的值才表示為這些來自客戶端的程式在客戶端作業系統裡的作業系統級別的程式ID號;

總之,TYPE欄位為background時,PROGRAM為服務端的oracle後臺程式TYPE欄位為user時,PROGRAM為客戶端的使用者程式

 

OSUSER: 客戶端作業系統使用者名稱。

 PROCESS: 客戶端應用程式在其作業系統級別上的process id。

 MACHINE: 客戶端machine name。(表示ip地址?) 即一般是客戶端所在主機的主機名?

 TERMINAL: 客戶端執行的terminal name。即一般是客戶端所在主機的主機名。與MACHINE區別,不清楚。????

                    附加:

                    當MACHINE=計算機名時,TERMINAL=unkown;MACHINE=工作組/計算機名時,TERMINAL=計算機名


註釋:

類似ORACLE.EXE (PMON)這些例項的後臺程式是沒有和客戶端存在連線的。

如果v$session檢視中PROGRAM欄位裡的值所表示的一個程式是來自服務端的,則v$session檢視中:

OSUSER: 服務端作業系統使用者名稱。

 

PROCESS: 服務端在作業系統級別上的process id。

 

MACHINE: 服務端machine name。

 

TERMINAL: 服務端執行的terminal name。表示服務端所在主機的主機名。

以上幾個欄位表示的是服務端的作業系統上的意義。

如果v$session檢視中PROGRAM欄位裡的值所表示的一個程式是來自客戶端的,則以上幾個欄位表示的是客戶端的作業系統上的意義。


在會話中執行的SQL語句的相關資訊:

COMMAND: session正在執行的SQL Id。1代表create table,3代表select。


SQL_ADDRESS, SQL_HASH_VALUE, SQL_ID, SQL_CHILD_NUMBER: session正在執行的sql statement,和v$sql中的address, hash_value, sql_id, child_number相對應。

 

PREV_SQL_ADDR, PREV_HASH_VALUE, PREV_SQL_ID, PREV_CHILD_NUMBER: 上一次執行的sql statement。

 

用於SQL語句跟蹤的會話屬性:

MODULE, MODULE_HASH, ACTION, ACTION_HASH, CLIENT_INFO: 應用透過DBMS_APPLICATION_INFO設定的一些資訊。

 

FIXED_TABLE_SEQUENCE: 當session完成一個user call後就會增加的一個數值,也就是說,如果session inactive,它就不會增加。因此可以根據此欄位的值變化來監控某個時間點以來的session的效能情況。例如,一個小時以前,某個session的FIXED_TABLE_SEQUENCE是10000,而現在是20000,則表明一個小時內其user call比較頻繁,可以重點關注此session的performance statistics。

 LOCKWAIT: 可以透過這個欄位查詢出當前正在等待的鎖的相關資訊。sid & lockwait與v$lock中的sid & kaddr相對應。

ROW_WAIT_OBJ#: 被鎖定行所在table的object_id。和dba_objects中的object_id關聯可以得到被鎖定的table name。

 ROW_WAIT_FILE#: 被鎖定行所在的datafile id。和v$datafile中的file#關聯可以得到datafile name。

 ROW_WAIT_BLOCK#: Identifier for the block containing the row specified in ROW_WAIT_ROW#

 ROW_WAIT_ROW#: session當前正在等待的被鎖定的行。

LOGON_TIME: session logon time


說明:

1、V$SESSION中AUDSID欄位的產生原理及含義


Oracle的V$SESSION檢視中有一列AUDSID,一直不知其含義,在MetaLink上看到一篇文章How Sessions get Their AUDSID Identifier [ID 122230.1],詳細講述了AUDSID的產生原理和含義,大致內容總結如下:

  1. AUDSID由SYS.AUDSES$這個SEQUENCE產生,當有一個新的會話產生,其AUDSID的值即為這個SEQUENCE的NEXTVAL。
  2. Oracle 10g之前,在會話為’CONNECT INTERNAL’ 或為oracle程式是Oracle後臺程式這兩種情況的時候,AUDSID的值為0。’CONNECT INTERNAL’即指以AS SYSDBA和AS SYSOPER連線的會話。
  3. 10g及之後,AUDSID在’CONNECT INTERNAL’ 時為UB4MAX(4294967295), 在Oracle後臺程式連線時為0。具體如下:

If AUDSID=0, then就是 Oracle後臺程式產生的一個會話。

If AUDSID=4294967295, then說明是sys使用者產生的一個會話。

If 0<AUDSID<4294967295,then說明是普通使用者產生的一個會話。


注:UB4=UNSIGNED INT,取值範圍為0-(2^32-1=4294967295)

由此可以看出,AUDSID與V$SESSION檢視中的SID不同的是,AUDSID主要是用於區分Oracle中的一般使用者連線Internal/後臺連線這兩類的。所以對於唯一的確定一個應用使用者(即一般使用者)會話來說,除了使用SID和SERIAL的組合,還可以使用AUDSID,來進行區別。

註釋:

AUDSID由SYS.AUDSES$這個SEQUENCE(即序列,這種資料庫物件)產生, 由desc  SYS.AUDSES$提示證明他是個SEQUENCE(即序列,這種資料庫物件)。


2、看到一個會話,我們首先要區分該會話的型別是什麼,即檢視v$session檢視時首先要看TYPE欄位,因為v$session檢視中欄位PROGRAMPROCESS、OSUSER、MACHINE、TERMINALTYPE欄位為不同值時有不同意義:

TYPE欄位為background時,以上幾個欄位表示的是服務端的作業系統上的意義;

TYPE欄位user,以上幾個欄位表示的是客戶端的作業系統上的意義。



3、select    type,program from v$sessionwheretype =‘background’;或是select    audsid,program from v$session whereaudsid=0;所得結果例如:

SQL>select    type,program from v$session where type =‘background’;

type                    program

-------                   -------------

background      oracle.exe(LGWR)

或者

SQL>select   audsid,program from v$session where audsid=0;

audsid                    program

-------                       -------------

0                             oracle.exe(LGWR)

由上述語句有結果,可以說明一個後臺程式產生是,至少會(伴隨)自動啟動一個屬於自己的會話。


4V$SESSION中 process
欄位的值為XX:XX形式時的解釋

      舉一個更直觀的例子,我在windows作業系統的主機上用sqlplus去遠端連線到AIX伺服器上的oracle資料庫系統。
     假設我們現在已知的條件為:sid=424,paddr=070000012A6DC150。

那麼,

SQL> select spid from v$process where addr='070000012A6DC150';

SPID
------------
1318950
這裡的1318950就是AIX(server端)上fork出來的程式號。


/home/guest/dxhibm>ps -ef | grep 1318950
  oracle 1318950       1   0 10:00:05      -  0:00 oracleora92 (LOCAL=NO)
  dxhibm 3711144 1138788   0 10:02:48  pts/1  0:00 grep 1318950

SQL> select process from v$session where sid=424 ;

PROCESS
------------
2856:3260

這個就是在windows(client端)對應的sqlplus這個程式的程式號和執行緒號。

明白了,WINDWOW和PLSQL DEVELOPE等有執行緒的概念,所以把執行緒寫出來,如果是UNIX下,沒有執行緒的概念,就沒有這個XX:XX的東東了


註釋:

實驗環境還是,我在一個windows作業系統的主機上,用sqlplus去遠端連線到AIX伺服器上的oracle資料庫系統。接著,我在sqlplus視窗上,執行 select s.type,s.process,p.spid from v$session s,v$process p where s.paddr=p.addr;語句,結果發現:

type為background時,s.process值和p.spid值相同,因為此時兩者都是表示同一個程式(即位於服務端的oracle後臺程式)的程式號;

p.spidp.spidp.spidp.spid

type為user時,s.process值和p.spid值不一樣,因為此時前者表示使用者程式(位於客戶端)的程式號,後者依然表示同一個程式(位於服務端)的程式號表示同一個程式(位於服務端)的程式號表示伺服器程式(也即oracle前臺程式,位於服務端)的程式號

參考:http://www.itpub/thread-736652-2-1.html


5、type為background時,欄位OSUSER一般為SYSTEM(位於服務端的作業系統的作業系統使用者)。由此看出,在window下,oracle例項的後臺程式,都是在該使用者下執行的,而不是我們登陸該window作業系統的使用者。

關於window下的SYSTEM使用者,參考:

《WINDOWS下system使用者至高無上的許可權》

====================================================================================================================================

 v$process

前言:v$process所檢視的程式都是服務端裡(oracle系統)的程式。

ADDR: process address。可以和v$session的paddr欄位關聯。

 PID: Oracle程式identifier,即表示該程式在其所在的oracle資料庫系統裡的程式ID號。

 SERIAL#:: process serial number。類似於v$session中的SERIAL#是配合SID的一樣,這裡的SERIAL#配合PID的SERIAL#不是一個獨立欄位,即pid 會重用,但是同一個pid被重用時,serial#會增加,不會重複。

SPID: 作業系統程式identifier,即表示該程式在其所在的作業系統裡的程式ID號。

PROGRAM: 程式正在執行的程式(e.g., ORACLE.EXE (ARC0)),和v$session中的program類似。它表示的是該程式在作業系統中的名稱。

PNAME: 它表示的是該程式在oracle資料庫系統中的名稱。

 BACKGROUND: 1代表oracle background process,null代表normal process。

TERMINAL: 作業系統terminal identifier(e.g., computer name)。表示該程式所在作業系統的主機名。

 USERNAME: 作業系統程式的使用者名稱。並非Oracle使用者名稱。它表示的是該程式所在的屬於作業系統的使用者名稱。如,在window作業系統下,PROGRAM為 ORACLE.EXE (LGWR)的程式,是屬於作業系統使用者system的。


註釋:v$process中的username欄位和v$session中的osuser欄位一樣表示作業系統的使用者,而v$session中的username欄位表示oracle系統的使用者。

=====================================================================================================

附加:

1、v$process
這個檢視提供的資訊,都是oracle服務程式的資訊,沒有客戶端程式相關的資訊
服務程式分兩類,一是後臺的,一是dedicate/shared server
pid, serial#     這是oracle分配的PID
spid             這才是作業系統的pid
program          這是服務程式對應的作業系統程式名

v$session:
這個檢視主要提供的是一個資料庫connect的資訊,
主要是client端的資訊,比如以下欄位:
machine   在哪臺機器上
terminal  使用什麼終端
osuser    作業系統使用者是誰
program   透過什麼客戶端程式,比如TOAD
process   作業系統分配給TOAD的程式號
logon_time  在什麼時間
username    以什麼oracle的帳號登入
command     執行了什麼型別的SQL命令
sql_hash_value  SQL語句資訊

有一些是server端的資訊:
paddr   即v$process中的server程式的addr
server  伺服器是dedicate/shared

還有其它一些資訊,可以理解為是client/server共享的資訊,主要是針對這個session而言的

2、

至於sid和audsid的區別,自己也沒太搞明白,網上摘了一段:

  --from asktom

  the audsid column is populated via a sequence and for normal

  sessions is the same as "userenv('sessionid')" -- but for some background sessions -- it is not set

  (it comes back as "0" making the view not work.

  So, I'd just ignore "audsid" for now and use SID.

3、

關於Oracle10g裡v$session.audsid欄位的解釋

In 10g we make a further distinction for SYS sessions: 

If AUDSID=0, then it is an internally generated SYS session. 

If AUDSID=UB4MAX(4294967295), then it is a direct SYS session. 比如Dataguard裡備庫的連線程式.

refer:

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

相關文章