ORACLE会话连接进程三者总结

概念介绍

     通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文(Context)。这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器、通过哪个应用程序、哪个用户登录等信息.

 

     连接(Connection):连接是从客户端到ORACLE实例的一条物理路径。连接可以在网络上建立,或者在本机通过IPC机制建立。通常会在客户端进程与一个专用服务器或一个调度器之间建立连接。

 

     会话(Session) 是和连接(Connection)是同时建立的,两者是对同一件事情不同层次的描述。简单讲,连接(Connection)是物理上的客户端同服务器的通信链路,会话(Session)是逻辑上的用户同服务器的通信交互。

 

    
ORACLE中一个用户登录ORACLE服务器的前提,就是该用户具有ORACLE的 “CREATE
SESSION”权限。ORACE允许同一个用户在同一个客户机上建立多个同服务器的会话,每个SESSION都代表了用户与服务器的一个交互。就像你用
IE浏览器打开博客园网站,然后你再打开一个IE窗口,又打开一个博客园网站。两个IE窗口就相当于两个SESSION,
而物理链路就相当于连接(Connection)。后台进程PMON会每隔一段时间,就会检测用户连接状况,如果连接已断开,PMON会清理现场,释放相
关的资源。

    
在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的
任何其他会话。实际上,还可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级Oracle
Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。

    在专用服务器中,一个会话对应一个服务器进程(Process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。

下面是一段关于连接(connection)、会话、进程的英文描述

A
connection is a physical circuit between you and the database. A
connection might be one of many types -- most popular begin DEDICATED
server and SHARED server. Zero, one or more sessions may be established
over a given connection to the database as show above with sqlplus. A
process will be used by a session to execute statements. Sometimes there
is a one to one relationship between CONNECTION->SESSION->PROCESS
(eg: a normal dedicated server connection). Sometimes there is a one to
many from connection to sessions (eg: like autotrace, one connection,
two sessions, one process).

A
process does not have to be dedicated to a specific connection or
session however, for example when using shared server (MTS), your
SESSION will grab a process from a pool of processes in order to execute
a statement. When the call is over, that process is released back to
the pool of processes.

 

会话&链接

在具体的应用场景中连接(connction) 和 会话(session) 有很多情况:

1. SQL*PLUS 登录 ORACLE

这种场景比较容易理解,一个连接对应一个Session。

2. PL/SQL Developer工具登录ORACLE

PL/SQL Developer工具——>首选项——>连接下,你可以设置会话方式,如下图所示:

如果设置选项选择多路会话,: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;

 

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

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

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

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

 

会话管理

 

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

select a.sid
      ,spid
      ,status
      ,substr(a.program,1,40) prog
      ,a.terminal
      ,osuser
      ,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr
   order by value desc
时间: 2024-09-08 11:44:38

ORACLE会话连接进程三者总结的相关文章

建立与Oracle服务器连接的两种连接模式

在建立Oracle数据库的时候,应该会在数据库建立助手向导上面看到这么一个选项,就是数据库的连接模式采用什么方式.在Oracle9i或者10g中,可以看到有2种连接模式,一种叫做专用服务器连接(dedicated server) ,另外一种叫做共享服务器连接(shared server).下面我们来分类说一下这两种连接方式的不同点. 专用服务器模式就是说每次在对Oracle进行访问的时候,Oracle服务器的Listener会得到这个访问请求,然后回为这个访问创建一个新的进程来进行服务.所以说,

concepts阅读总结8——内存结构补充+oracle工具+个别进程

1.内存结构: 关于之前SGA,PGA的介绍我就不多说了,在我的博客里有专门的介绍: http://blog.csdn.net/changyanmanman/article/details/7256255 我们看看各个区域的介绍吧,这是官方的文档,准确性和权威性不言而喻. 2.数据缓存区: 一个新的点,数据缓存区在逻辑上被分成了好几个组,这种分组的内存管理方式减少了多处理器系统中的资源竞争.(共享SQL区也是这样的) 数据缓存区内的缓冲区(buffer)通过两个列表来管理:待写列表(write

Oracle会话超时退出设置

        在itpub上写博客,感觉要比在CSDN上面写方便很多,第一次申请使用CSDN博客是在2010年,至今记忆犹新啦,但愿在这博客上面可以一直坚持下去,也给大家分享下原来写的一些博客:http://blog.csdn.net/dream19881003,感慨就发到这里吧,还是说下前一段时间预计客户的一个问题吧.         前一段时间客户打电话说自从数据库搬迁后连接数据库总是提示会话不可用,和客户沟通才知到他们连接数据库的程序是从早上连上数据库后就一直保持连接状态,一天中需要执行

使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题

平时我们开发使用的是32位的PC机,所以安装的也是Oracle32位的客户端.但是一般服务器都是64位的,安装的也是64位的Oracle客户端,如果要部署使用Oracle.DataAccess连接Oracle的应用程序时,可能会遇到版本上的问题. 主要版本问题有两种,一种是32位版和64位版的问题,如果我们开发出来的应用是32位的,那么就必须使用32位的客户端,如果是64位的应用程序当然对应64位的客户端.这里需要注意:在64位的环境中使用VS开发Web程序,其运行的Web服务"WebDev.W

java-检测应用服务器与oracle服务连接是否正常

问题描述 检测应用服务器与oracle服务连接是否正常 上个月客户那里更换了oracle服务器,这个月跑了两年的应用总是出现问题,每次都需要重启服务才可以恢复生产系统,此时用工具连接数据库正常,有时候重启时明显感觉到从数据库中读取数据很慢,估计应用出问题也跟这个有关.由于数据库另一个公司做管理,我们没有权限来排查问题.现在想请教有没有什么方法可以检测应用服务器访问数据库的情况?不是只显示能否正常连接,因为数据量比较大,访问数据库较慢也会造成请求超时引发问题. 解决方案 在应用服务器上持续观测与数

oracle client 连接oracle 出错:ora-12170如何解决?

问题描述 oracle client 连接oracle 出错:ora-12170如何解决? ping ip是通的,telnet ip 1521是通的,tnsping ip也是通的,就是连接的时候报:ora-12170连接超时错误,有哪位大神帮我解决下这个问题啊 解决方案 oracle client tnsnames.ora configORA-12170 TNS 连接超时 oracle 解决方案二: 首先进入sqlplus命令界面输入lsnrctl status检查监听是否启动. 如果没启就再启

Oracle RAC 连接到指定实例

        在某些特定的情形下,有时候需要从客户端连接到RAC中指定的实例,而不是由客户端Load_balance来动态选择或者是通过服务器端的监听器根据负载情形来转发.对此我们可以通过为tnsnames.ora中特定的网络服务名添加instance_name子项,或者是单独建立一个指向所需实例的网络服务名,下面描述这两种情形.   一.测试环境 -->Oracle 版本 SQL> select * from v$version where rownum<2; BANNER ----

oracle连接eclipse-myeclipse连接oracle时连接不上,没有任何错误提示

问题描述 myeclipse连接oracle时连接不上,没有任何错误提示 运行java application时,控制台里面没有错误提示,就是一直在连接中,郁闷啊 java如下: String url ="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" String userName="scott"; String pwd="tiger"; con = DriverManager.getConnection(url,

oracle 会话 死锁 执行sql 执行job的方法_oracle

//根据用户分组会话 select t.USERNAME,count(*) from v$session t group by t.USERNAME //查找某一用户正在执行的sql_id值 select * from v$session t where t.USERNAME = 'BUDGET' and t.SQL_ID is not null //查找对应sql_id的对应sql语句 select m.SQL_TEXT from v$session t , v$sqlarea m where