会话管理
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 BYLOGONTIME,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 225sessioncachedcursors 3 20sessionmaxopenfiles 3 107:查看曾经的最大会话数: SQL>SQL>SELECTSESSIONSMAX,SESSIONSWARNING,SESSIONSCURRENT,SESSIONSHIGHWATER 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 'SQL Net%'
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 sessiosi,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