ORACLE会话连接进程三者总结B

如果设置选项选择多路会话,:PL/SQL Developer 登录ORACLE,每打开一个窗口,将创建一个新的会话,而设置选项选择单路会话,则新打开的窗口会共用一个会话。具体你可以参考PLSQL Developer8.0用户指南:


多路会话:每个测试窗口、SQL窗口和命令窗口都将有它自己的会话,另外的一个会话将被用于编译。这是最灵活的设置,明显地会导致最大数量的数据库会话。另外可能的缺点是,在更新被提交之后,它们只在X窗口中可以看到,而在Y窗口看不到。


双路会话:测试窗口、SQL窗口和命令窗口将共享一个会话,另外一个会话将被用于编译。这个模式的缺点是每次只有一个窗口可以运行程序。


单路会话:所有的窗口和所有的编译都使用同一个会话,这使事务管理变得很困难。在这个模式中调试器被禁用使用。如果你被限制只能使用一个数据库会话,那么你只能使用这个设置了。


 


会话&进程


 




在Oracle中如何查看参数sessiones或processes的值呢?一般使用show parameter命令查看。


SQL> show parameter processes;
 
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ---------------
aq_tm_processes                      integer                          0
db_writer_processes                  integer                          1
gcs_server_processes                 integer                          0
job_queue_processes                  integer                          10
log_archive_max_processes            integer                          2
processes                            integer                          850
SQL> show parameter session;
 
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
session_cached_cursors               integer                          20
session_max_open_files               integer                          10
sessions                             integer                          940
shared_server_sessions               integer
SQL> 
方法2:查询v$parameter


select name, type, value ,display_value, isses_modifiable, issys_modifiable 
from v$parameter
 where name='sessions';
 
 
select name, type, value ,display_value, isses_modifiable, issys_modifiable 
from v$parameter
 where name='processes';
 


方法3:查询v$resiyrce_limit;


clip_image002




 


Oracle的sessions和processes的数量关系是:


Oracle 11g R1以及之前版本


             sessions=(1.1 * processes) + 5


Oracle 11g R2


             sessions=(1.5 * processes) + 22


如下例子所示,在Oracle 10g 版本中,processes与sessions的关系如下所示:


SQL> select * from v$version;
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
 


 


SELECT (1.1 *850)+ 5 FROM DUAL; 其值刚好为940


clip_image003


一般修改参数processes后,sessions参数也会随之变化,但是有一个奇怪的现象时,如下所示,我将processes从


850改为120后,重启数据库实例,发现sessions的值并没有随之变化。这个现象一般发生在改小processes参数。为什么这样呢?


clip_image004


clip_image005


共享服务器模式,一个会话可能由多个服务进程轮流为之服务,一个进程可能为多个会话服务。简单地说,进程和会话之间有一种多对多的关系。


 


会话管理


 


1:查看当前所有用户的会话(SESSION):


SELECT * FROM V$SESSION 
WHERE USERNAME IS NOT NULL
ORDER BY LOGON_TIME , SID;
其中Oracle内部进程的USERNAME为空


 


2:查看当前用户的所有SESSION:


SELECT * FROM V$SESSION
WHERE USERNAME = USER
ORDER BY LOGON_TIME, SID;
 


3:查看当前窗口/当前用户的会话信息


SELECT SID, SERIAL#, STATUS FROM V$SESSION WHERE AUDSID=USERENV('SESSIONID');
 


4:查看所有ACTIVE会话(活动会话)


SELECT * FROM V$SESSION 
WHERE USERNAME IS NOT NULL AND STATUS='ACTIVE'
ORDER BY LOGON_TIME, SID;
 


5:查看当前会话的ID可以通过如下脚本:


SELECT * FROM V$MYSTAT WHERE ROWNUM =1
查看当前用户的SPID


SELECT P.SPID, S.SID, S.SERIAL#
FROM V$PROCESS 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$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$license;
 
SESSIONS_MAX SESSIONS_WARNING SESSIONS_CURRENT SESSIONS_HIGHWATER
------------ ---------------- ---------------- ------------------
           0                0              512                553
SESSIONS_HIGHWATER表示曾经的最大会话数512


 


8:查询那些应用的连接数此时是多少


SELECT  B.PROGRAM , COUNT(1) 
FROM V$PROCESS A, V$SESSION 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 Oracle*XA


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$SESSION S, V$SESSION_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,V$LOCKED_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$session se,v$session_wait st,v$sess_io si,v$process 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值