會話管理
?
1:查看當前所有用戶的會話(SESSION):
SELECT * FROM V S E S S I O N W H E R E U S E R N A M E I S N O T N U L L O R D E R B Y L O G O N T I M E , S I D ; 其中 O r a c l e 內部進程的 U S E R N A M E 為空? 2 :查看當前用戶的所有 S E S S I O N : S E L E C T ? F R O M V SESSION? WHERE USERNAME IS?NOT?NULL ORDER?BY LOGON_TIME , SID; 其中Oracle內部進程的USERNAME為空 ? 2:查看當前用戶的所有SESSION: SELECT * FROM V SESSION?WHEREUSERNAMEIS?NOT?NULLORDER?BYLOGONT?IME,SID;其中Oracle內部進程的USERNAME為空?2:查看當前用戶的所有SESSION:SELECT?FROMVSESSION
WHERE USERNAME = USER
ORDER?BY LOGON_TIME, SID;
?
3:查看當前窗口/當前用戶的會話信息
SELECT SID, SERIAL#, STATUS FROM V S E S S I O N W H E R E A U D S I D = U S E R E N V ( ′ S E S S I O N I D ′ ) ; 4 :查看所有 A C T I V E 會話 ( 活動會話 ) S E L E C T ? F R O M V SESSION?WHERE AUDSID=USERENV('SESSIONID'); ? 4:查看所有ACTIVE會話(活動會話) SELECT * FROM V SESSION?WHEREAUDSID=USERENV(′SESSIONID′);?4:查看所有ACTIVE會話(活動會話)SELECT?FROMVSESSION?
WHERE USERNAME IS?NOT?NULL?AND STATUS=‘ACTIVE’
ORDER?BY LOGON_TIME, SID;
?
5:查看當前會話的ID可以通過如下腳本:
SELECT * FROM VKaTeX parse error: Expected 'EOF', got '#' at position 66: …S.SID, S.SERIAL#? FROM VPROCESS P
INNER?JOIN V$SESSION S ON P.ADDR = S.PADDR
WHERE S.AUDSID=USERENV(‘SESSIONID’);
?
6:查看數據庫允許最大會話數
SQL> SHOW PARAMETER SESSIONS;
?
NAME???????????????????????????????? TYPE??????? VALUE
java_max_sessionspace_size?????????? integer???? 0
java_soft_sessionspace_limit???????? integer???? 0
license_max_sessions???????????????? integer???? 0
license_sessions_warning???????????? integer???? 0
logmnr_max_persistent_sessions?????? integer???? 1
sessions???????????????????????????? integer???? 225
shared_server_sessions?????????????? integer????
?
?
SQL> SELECT NAME, TYPE, VALUE?FROM V P A R A M E T E R W H E R E N A M E L I K E ′ s e s s i o n N A M E T Y P E V A L U E ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s e s s i o n s 3 225 s e s s i o n c a c h e d c u r s o r s 3 20 s e s s i o n m a x o p e n f i l e s 3 107 :查看曾經的最大會話數:? S Q L > S Q L > S E L E C T S E S S I O N S M A X , S E S S I O N S W A R N I N G , S E S S I O N S C U R R E N T , S E S S I O N S H I G H W A T E R 2 F R O M v PARAMETER?WHERE NAME LIKE?'session%'; ? NAME?????????????????????? TYPE???????????????? VALUE ---------???????????????? ----------???????????? ----------- sessions????????????????????????? 3??????????????? 225 session_cached_cursors??????????? 3??????????????? 20 session_max_open_files??????????? 3??????????????? 10 7:查看曾經的最大會話數: ? SQL> SQL> SELECT SESSIONS_MAX,SESSIONS_WARNING,SESSIONS_CURRENT,SESSIONS_HIGHWATER? ? 2? FROM v PARAMETER?WHERENAMELIKE?′session?NAME??????????????????????TYPE????????????????VALUE??????????????????????????????????????????????????????????sessions?????????????????????????3???????????????225sessionc?achedc?ursors???????????3???????????????20sessionm?axo?penf?iles???????????3???????????????107:查看曾經的最大會話數:?SQL>SQL>SELECTSESSIONSM?AX,SESSIONSW?ARNING,SESSIONSC?URRENT,SESSIONSH?IGHWATER??2?FROMvlicense;
?
SESSIONS_MAX SESSIONS_WARNING SESSIONS_CURRENT SESSIONS_HIGHWATER
0??????????????? 0????????????? 512??????????????? 553
SESSIONS_HIGHWATER表示曾經的最大會話數512
?
8:查詢那些應用的連接數此時是多少
SELECT? B.PROGRAM , COUNT(1)
FROM V P R O C E S S A , V PROCESS A, V PROCESSA,VSESSION B
WHERE A.ADDR = B.PADDR
????? AND? B.USERNAME IS?NOT?NULL
GROUP?BY B.PROGRAM;
?
會話狀態:
會話有ACTIVE、INACTIVE、KILLED、CACHED、SNIPED五個狀態,一般比較常見的有ACTIVE、INACTIVE、KILLED三個狀態。
?
ACTIVE?? :處于此狀態的會話,表示正在執行,處于活動狀態。
INACTIVE :處于此狀態的會話表示不是正在執行的
KILLED?? :處于此狀態的會話,表示出現了錯誤或進程被殺掉,正在回滾,當然,這個狀態的會話也占用系統資源的。還有一點就是,??? KILLED的狀態一般會持續較長時間,如果你想快速殺掉回話,可以參考我以前的一篇文章ORACLE快速徹底Kill掉的會話
CACHED?? : Session temporarily cached for use by OracleXA
SNIPED?? : Session inactive, waiting on the client。 標記為SNIPED的進程被釋放有兩種條件:
???????? 1、相關的terminal再一次試圖登錄及執行sql
???????? 2、手動的在操作系統后臺kill掉相應的spid
關于會話信息
通過如下SQL你可以查詢你的每個應用程序到底在等待什么,從而針對這些信息對數據庫的性能進行調整。
COL USERNAME FOR A12;
COL PROGRAM? FOR A32;
COL EVENT??? FOR A26;
SELECT S.USERNAME
????? ,S.PROGRAM
????? ,S.STATUS
????? ,SE.EVENT
????? ,SE.TOTAL_WAITS
????? ,SE.TOTAL_TIMEOUTS
????? ,SE.TIME_WAITED
????? ,SE.AVERAGE_WAIT
FROM V S E S S I O N S , V SESSION S, V SESSIONS,VSESSION_EVENT SE
WHERE S.SID=SE.SID AND SE.EVENT NOT?LIKE?'SQLNet%’
? AND S.STATUS =‘ACTIVE’?AND S.USERNAME IS?NOT?NULL;
?
2.ORACLE中查詢被鎖的表并釋放session
SELECT A.OWNER
? ,A.OBJECT_NAME
? ,B.XIDUSN
? ,B.XIDSLOT
? ,B.XIDSQN
? ,B.SESSION_ID
? ,B.ORACLE_USERNAME
? ,B.OS_USER_NAME
? ,B.PROCESS
? ,B.LOCKED_MODE
? ,C.MACHINE
? ,C.STATUS
? ,C.SERVER
? ,C.SID
? ,C.SERIAL#
? ,C.PROGRAM
FROM ALL_OBJECTS A,VKaTeX parse error: Expected group after '_' at position 23: …OBJECT B,SYS.GV_?SESSION C
WHERE? A.OBJECT_ID = B.OBJECT_ID? AND B.PROCESS = C.PROCESS? ORDER?BY 1,2;
?
3.查看占用系統IO較大的session
SELECT se.sid
????? ,se.serial#
????? ,pr.spid
????? ,se.username
????? ,se.status
????? ,se.terminal
????? ,se.program
????? ,se.module
????? ,se.sql_address
????? ,st.event
????? ,st.p1text
????? ,si.physical_reads
????? ,si.block_changes
FROM v s e s s i o n s e , v session se,v sessionse,vsession_wait st,v s e s s i o s i , v sess_io si,v sessi?osi,vprocess pr
WHERE st.sid=se.sid? AND st.sid=si.sid
? AND se.paddr=pr.ADDR AND se.sid>6
? AND st.wait_time=0 AND st.event NOT?LIKE?‘%SQL%’?
? ORDER?BY physical_reads DESC;
?
4.找出耗cpu較多的session
select a.sid
????? ,spid
????? ,status
????? ,substr(a.program,1,40) prog
????? ,a.terminal
????? ,osuser
????? ,value/60/100 value
from v s e s s i o n a , v session a,v sessiona,vprocess b,v$sesstat c
where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr
?? order?by?value desc