Oracle V$SESSION中的常用列
V$SESSION中的常用列
V$SESSION是基礎資訊檢視,用於找尋使用者SID或SADDR。不過,它也有一些列會動態的變化,可用於檢查使用者。如例:
SQL_HASH_VALUE,SQL_ADDRESS:這兩列用於鑑別預設被session執行的SQL語句。如果為null或0,那就說明這個session沒有執行任何SQL語句。PREV_HASH_VALUE和PREV_ADDRESS兩列用來鑑別被session執行的上一條語句。
注意:當使用SQL*Plus進行選擇時,確認你重定義的列寬不小於11以便看到完整的數值。
STATUS:這列用來判斷session狀態是:
Achtive:正執行SQL語句(waiting for/using a resource)
Inactive:等待操作(即等待需要執行的SQL語句)
Killed:被標註為刪除
下列各列提供session的資訊,可被用於當一個或多個combination未知時找到session。
Session資訊
SID:SESSION標識,常用於連線其它列
SERIAL#:如果某個SID又被其它的session使用的話則此數值自增加(當一個 SESSION結束,另一個SESSION開始並使用了同一個SID)。
AUDSID:審查session ID唯一性,確認它通常也用於當尋找並行查詢模式
USERNAME:當前session在oracle中的使用者名稱。
Client資訊
資料庫session被一個執行在資料庫伺服器上或從中間伺服器甚至桌面透過SQL*Net連線到資料庫的客戶端程式啟動,下列各列提供這個客戶端的資訊
OSUSER:客戶端作業系統使用者名稱
MACHINE:客戶端執行的機器
TERMINAL:客戶端執行的終端
PROCESS:客戶端程式的ID
PROGRAM:客戶端執行的客戶端程式
要顯示使用者所連線PC的 TERMINAL、OSUSER,需在該PC的ORACLE.INI或Windows中設定關鍵字TERMINAL,USERNAME。
Application資訊
呼叫DBMS_APPLICATION_INFO包以設定一些資訊區分使用者。這將顯示下列各列。
CLIENT_INFO:DBMS_APPLICATION_INFO中設定
ACTION:DBMS_APPLICATION_INFO中設定
MODULE:DBMS_APPLICATION_INFO中設定
下列V$SESSION列同樣可能會被用到:
ROW_WAIT_OBJ#
ROW_WAIT_FILE#
ROW_WAIT_BLOCK#
ROW_WAIT_ROW#
V$SESSION中的連線列
Column View Joined Column(s)
SID V$SESSION_WAIT,,V$SESSTAT,,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR SID
(SQL_HASH_VALUE, SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
(PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
TADDR V$TRANSACTION ADDR
PADDR V$PROCESS ADDR
示例:
1.查詢你的session資訊
SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS
FROM V$SESSION WHERE audsid = userenv('SESSIONID');
2.當machine已知的情況下查詢session
SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL
FROM V$SESSION
WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1';
查詢當前被某個指定session正在執行的sql語句。假設sessionID為100
select b.sql_text
from v$session a,v$sqlarea b
where a.sql_hash_value=b.hash_value and a.sid=100
尋找被指定session執行的SQL語句是一個公共需求,如果session是瓶頸的主要原因,那根據其當前在執行的語句可以檢視session在做些什麼。
.如果資料庫瓶頸是系統資源(如:cpu,記憶體),並且佔用資源最多的使用者總是停留在某幾個服務程式,那麼進行如下諸項:
1>.找出資源程式
2>.找出它們的session,你必須將程式與會話聯絡起來。
3>.找出為什麼session佔用瞭如此多的資源
2.SQL跟蹤檔名是基於服務程式的作業系統程式ID。要找出session的跟蹤檔案,你必須將session與服務程式聯絡起來。
3.某些事件,如rdbms ipc reply,鑑別session程式的Oracle程式ID在等什麼。要發現這些程式在做什麼,你必須找出它們的session。
4.你所看到的伺服器上的後臺程式(DBWR,LGWR,PMON等)都是服務程式。要想知道他們在做什麼,你必須找到他們的session。
V$PROCESS中的常用列
ADDR:程式物件地址
PID:oracle程式ID
SPID:作業系統程式ID
V$PROCESS中的連線列
Column View Joined Column(s)
ADDR V$SESSION PADDR
示例:
1.查詢指定系統使用者在oracle中的session資訊及程式id,假設作業系統使用者為:junsansi
select s.sid,s.SERIAL#, s.username,p.spid
from v$session s, v$process p
where s.osuser = 'junsansi'
and s.PADDR = p.ADDR
2.檢視鎖和等待
SELECT /*+ rule */
lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#,p.spid
FROM v$locked_object l, dba_objects o, v$session s, v$process p
WHERE l.object_id = o.object_id
AND l.session_id = s.sid and s.paddr = p.addr
ORDER BY o.object_id, xidusn DESC
附註:
在linux環境可以透過ps檢視程式資訊包括pid,windows中工作管理員的PID與v$process中pid不能一一對應,這塊在oracleDocument中也沒有找到介紹,後來google了一下,有資料介紹說是由於windows是多執行緒伺服器,每個程式包含一系列執行緒。這點於unix等不同,Unix每個Oralce程式獨立存在,在Nt上所有執行緒由Oralce程式衍生。
要在windows中顯示oracle相關程式pid,我們可以透過一個簡單的sql語句來實現。
SELECT s.SID, p.pid, p.spid signaled, s.osuser, s.program
FROM v$process p, v$session s
WHERE p.addr = s.paddr;
SID PID SIGNALED OSUSER PROGRAM
1 2 2452 SYSTEM ORACLE.EXE
2 3 2460 SYSTEM ORACLE.EXE
3 4 2472 SYSTEM ORACLE.EXE
4 5 2492 SYSTEM ORACLE.EXE
5 6 2496 SYSTEM ORACLE.EXE
6 7 2508 SYSTEM ORACLE.EXE
7 8 2520 SYSTEM ORACLE.EXE
8 9 2524 SYSTEM ORACLE.EXE
10 12 1316 JSSjunsansi PlSqlDev.exe
9 13 3420 JSSjunsansi PlSqlDev.exe
13 14 660 JSSjunsansi PlSqlDev.exe
還可以透過和 v$bgprocess 連線查詢到後臺程式的名字:
SELECT s.SID SID, p.spid threadid, p.program processname, bg.NAME NAME
FROM v$process p, v$session s, v$bgprocess bg
WHERE p.addr = s.paddr
AND p.addr = bg.paddr
AND bg.paddr <> '00';
SID THREADID PROCESSNAME NAME
1 2452 ORACLE.EXE PMON
2 2460 ORACLE.EXE DBW0
3 2472 ORACLE.EXE LGWR
4 2492 ORACLE.EXE CKPT
5 2496 ORACLE.EXE SMON
6 2508 ORACLE.EXE RECO
7 2520 ORACLE.EXE CJQ0
8 2524 ORACLE.EXE QMN0
Eygle大師寫了一段sql指令碼getsql.sql,用來獲取指定pid正在執行的sql語句,在此也附註上來。
REM getsql.sql
REM author eygle
REM 在windows上,已知程式ID,得到當前正在執行的語句
REM 在windows上,程式ID為16進位制,需要轉換,在UNIX直接為10進位制
SELECT /*+ ORDERED */
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,
0, prev_hash_value,
sql_hash_value
),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr
FROM v$process c
WHERE c.spid = TO_NUMBER ('&pid', 'xxxx')))
ORDER BY piece ASC
V$SESSION是基礎資訊檢視,用於找尋使用者SID或SADDR。不過,它也有一些列會動態的變化,可用於檢查使用者。如例:
SQL_HASH_VALUE,SQL_ADDRESS:這兩列用於鑑別預設被session執行的SQL語句。如果為null或0,那就說明這個session沒有執行任何SQL語句。PREV_HASH_VALUE和PREV_ADDRESS兩列用來鑑別被session執行的上一條語句。
注意:當使用SQL*Plus進行選擇時,確認你重定義的列寬不小於11以便看到完整的數值。
STATUS:這列用來判斷session狀態是:
Achtive:正執行SQL語句(waiting for/using a resource)
Inactive:等待操作(即等待需要執行的SQL語句)
Killed:被標註為刪除
下列各列提供session的資訊,可被用於當一個或多個combination未知時找到session。
Session資訊
SID:SESSION標識,常用於連線其它列
SERIAL#:如果某個SID又被其它的session使用的話則此數值自增加(當一個 SESSION結束,另一個SESSION開始並使用了同一個SID)。
AUDSID:審查session ID唯一性,確認它通常也用於當尋找並行查詢模式
USERNAME:當前session在oracle中的使用者名稱。
Client資訊
資料庫session被一個執行在資料庫伺服器上或從中間伺服器甚至桌面透過SQL*Net連線到資料庫的客戶端程式啟動,下列各列提供這個客戶端的資訊
OSUSER:客戶端作業系統使用者名稱
MACHINE:客戶端執行的機器
TERMINAL:客戶端執行的終端
PROCESS:客戶端程式的ID
PROGRAM:客戶端執行的客戶端程式
要顯示使用者所連線PC的 TERMINAL、OSUSER,需在該PC的ORACLE.INI或Windows中設定關鍵字TERMINAL,USERNAME。
Application資訊
呼叫DBMS_APPLICATION_INFO包以設定一些資訊區分使用者。這將顯示下列各列。
CLIENT_INFO:DBMS_APPLICATION_INFO中設定
ACTION:DBMS_APPLICATION_INFO中設定
MODULE:DBMS_APPLICATION_INFO中設定
下列V$SESSION列同樣可能會被用到:
ROW_WAIT_OBJ#
ROW_WAIT_FILE#
ROW_WAIT_BLOCK#
ROW_WAIT_ROW#
V$SESSION中的連線列
Column View Joined Column(s)
SID V$SESSION_WAIT,,V$SESSTAT,,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR SID
(SQL_HASH_VALUE, SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
(PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
TADDR V$TRANSACTION ADDR
PADDR V$PROCESS ADDR
示例:
1.查詢你的session資訊
SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS
FROM V$SESSION WHERE audsid = userenv('SESSIONID');
2.當machine已知的情況下查詢session
SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL
FROM V$SESSION
WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1';
查詢當前被某個指定session正在執行的sql語句。假設sessionID為100
select b.sql_text
from v$session a,v$sqlarea b
where a.sql_hash_value=b.hash_value and a.sid=100
尋找被指定session執行的SQL語句是一個公共需求,如果session是瓶頸的主要原因,那根據其當前在執行的語句可以檢視session在做些什麼。
.如果資料庫瓶頸是系統資源(如:cpu,記憶體),並且佔用資源最多的使用者總是停留在某幾個服務程式,那麼進行如下諸項:
1>.找出資源程式
2>.找出它們的session,你必須將程式與會話聯絡起來。
3>.找出為什麼session佔用瞭如此多的資源
2.SQL跟蹤檔名是基於服務程式的作業系統程式ID。要找出session的跟蹤檔案,你必須將session與服務程式聯絡起來。
3.某些事件,如rdbms ipc reply,鑑別session程式的Oracle程式ID在等什麼。要發現這些程式在做什麼,你必須找出它們的session。
4.你所看到的伺服器上的後臺程式(DBWR,LGWR,PMON等)都是服務程式。要想知道他們在做什麼,你必須找到他們的session。
V$PROCESS中的常用列
ADDR:程式物件地址
PID:oracle程式ID
SPID:作業系統程式ID
V$PROCESS中的連線列
Column View Joined Column(s)
ADDR V$SESSION PADDR
示例:
1.查詢指定系統使用者在oracle中的session資訊及程式id,假設作業系統使用者為:junsansi
select s.sid,s.SERIAL#, s.username,p.spid
from v$session s, v$process p
where s.osuser = 'junsansi'
and s.PADDR = p.ADDR
2.檢視鎖和等待
SELECT /*+ rule */
lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#,p.spid
FROM v$locked_object l, dba_objects o, v$session s, v$process p
WHERE l.object_id = o.object_id
AND l.session_id = s.sid and s.paddr = p.addr
ORDER BY o.object_id, xidusn DESC
附註:
在linux環境可以透過ps檢視程式資訊包括pid,windows中工作管理員的PID與v$process中pid不能一一對應,這塊在oracleDocument中也沒有找到介紹,後來google了一下,有資料介紹說是由於windows是多執行緒伺服器,每個程式包含一系列執行緒。這點於unix等不同,Unix每個Oralce程式獨立存在,在Nt上所有執行緒由Oralce程式衍生。
要在windows中顯示oracle相關程式pid,我們可以透過一個簡單的sql語句來實現。
SELECT s.SID, p.pid, p.spid signaled, s.osuser, s.program
FROM v$process p, v$session s
WHERE p.addr = s.paddr;
SID PID SIGNALED OSUSER PROGRAM
1 2 2452 SYSTEM ORACLE.EXE
2 3 2460 SYSTEM ORACLE.EXE
3 4 2472 SYSTEM ORACLE.EXE
4 5 2492 SYSTEM ORACLE.EXE
5 6 2496 SYSTEM ORACLE.EXE
6 7 2508 SYSTEM ORACLE.EXE
7 8 2520 SYSTEM ORACLE.EXE
8 9 2524 SYSTEM ORACLE.EXE
10 12 1316 JSSjunsansi PlSqlDev.exe
9 13 3420 JSSjunsansi PlSqlDev.exe
13 14 660 JSSjunsansi PlSqlDev.exe
還可以透過和 v$bgprocess 連線查詢到後臺程式的名字:
SELECT s.SID SID, p.spid threadid, p.program processname, bg.NAME NAME
FROM v$process p, v$session s, v$bgprocess bg
WHERE p.addr = s.paddr
AND p.addr = bg.paddr
AND bg.paddr <> '00';
SID THREADID PROCESSNAME NAME
1 2452 ORACLE.EXE PMON
2 2460 ORACLE.EXE DBW0
3 2472 ORACLE.EXE LGWR
4 2492 ORACLE.EXE CKPT
5 2496 ORACLE.EXE SMON
6 2508 ORACLE.EXE RECO
7 2520 ORACLE.EXE CJQ0
8 2524 ORACLE.EXE QMN0
Eygle大師寫了一段sql指令碼getsql.sql,用來獲取指定pid正在執行的sql語句,在此也附註上來。
REM getsql.sql
REM author eygle
REM 在windows上,已知程式ID,得到當前正在執行的語句
REM 在windows上,程式ID為16進位制,需要轉換,在UNIX直接為10進位制
SELECT /*+ ORDERED */
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,
0, prev_hash_value,
sql_hash_value
),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr
FROM v$process c
WHERE c.spid = TO_NUMBER ('&pid', 'xxxx')))
ORDER BY piece ASC
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29500582/viewspace-1409484/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 11g中v$session檢視server列的含義OracleSessionServer
- 【Oracle】-【v$session】v$session的SNIPED狀態OracleSession
- v$session中的serverSessionServer
- 【SESSION】v$session and v$license 中sessions_current 的區別Session
- 關於v$session中的taddr列(事務物件地址)Session物件
- Oracle V$SESSION_WAITOracleSessionAI
- ORACLE中的KILLED SESSIONOracleSession
- Oracle常用的V$檢視Oracle
- oracle 什麼時候才回收v$session 中status='KILLED'的程式OracleSession
- 關於v$process與v$session中process的理解Session
- Oracle中Kill session的研究OracleSession
- Oracle中Kill session的研究 for oracle -- 轉OracleSession
- Oracle中Kill sessionOracleSession
- v$process和v$session中欄位解釋Session
- 命令列中的常用操作命令列
- Oracle中診斷阻塞的sessionOracleSession
- 處理Oracle Session中的鎖OracleSession
- oracle中session跟process的研究OracleSession
- 大話Oracle中的kill sessionOracleSession
- V$SESSIONSession
- Oracle中Kill session [轉]OracleSession
- (轉):學習Oracle動態效能表-(9)-V$SESSION_WAIT,V$SESSION_EVENTOracleSessionAI
- Oracle等待檢視v$session_waitOracleSessionAI
- Ruby 中陣列的常用操作陣列
- oracle中的processes,session,transaction引數OracleSession
- v$session的解釋Session
- v$session的來源Session
- v$session表的妙用Session
- V$session 表的妙用Session
- MTS方式連線V$SESSION中的SERVER狀態SessionServer
- v$session中command欄位的含義解析Session
- V$ACTIVE_SESSION_HISTORY 檢視中包含的資訊Session
- v$session中LAST_CALL_ET引數的理解SessionAST
- v$session的blocking_session含義SessionBloC
- 【管理】Oracle 常用的V$ 檢視指令碼Oracle指令碼
- session和v$session說明Session
- oracle如何找出登入會話v$session的IP地址?Oracle會話Session
- Oracle 動態效能表 v$session & v$process各個欄位的說明OracleSession