概念介绍

通俗来讲,会话(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

 

参考资料:

http://www.linuxidc.com/Linux/2011-06/37178.htm

http://shaharear.blogspot.com/2008/05/oracle-session-resource-profiler.html

http://www.linuxidc.com/Linux/2013-05/84924.htm

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

  1. 理解oracle中连接和会话

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp44 理解oracle中连接和会话 1.  概念不同:概念不同: 连接是指物 ...

  2. Oracle体系结构之进程

    Oracle体系结构之进程 一.概述 Oracle中的每个进程都要执行一个特定的任务(或者一组任务),每个进程都会为自己分配内存(PGA)来完成它的任务.一个Oracle实例主要有以下3类进程: (1 ...

  3. Oracle 已连接到空闲例程或ORA-01034: ORACLE not available

    因为是本地数据库没有重要资料,所以可以随便自己折腾. 出现问题原因:从生产数据库导入一个表到本地库测试,因数据量过大,在导入4-5个小时后,手动中断导入.是否异常关机不能确定. 之后再打开数据库出现一 ...

  4. 关于oracle的连接时ORA-12519错误的解决方案

    系统在运行时出现了ORA-12519的错误,无法连接数据库,后来在网上找了下,找到了如下的解决方法,共享下. OERR: ORA-12519 TNS:no appropriate service ha ...

  5. Oracle建立连接的过程分析

    Oracle建立连接的过程 如果我们想登陆数据库并在数据库中真正做事情,就必须先建立连接,首先我会介绍如何建立连接,再介绍建立连接的两种方式的原理,以及建立连接的过程中在客户端和服务端都做了些什么. ...

  6. [terry笔记]Oracle会话追踪(一):SQL_TRACE&EVENT 10046

      SQL_TRACE/10046 事件是 Oracle 提供的用于进行 SQL 跟踪的手段,在日常的数据库问题诊断和解决中是非常常用的方法.但其生成的trace文件需要tkprof工具生成一个可供人 ...

  7. Oracle会话超时退出设置

    前一段时间客户打电话说自从数据库搬迁后连接数据库总是提示会话不可用,和客户沟通才知到他们连接数据库的程序是从早上连上数据库后就一直保持连接状态,一天中需要执行几次操作,由于数据库中的会话连接有超时限制 ...

  8. Oracle会话及连接数优化

    一.改动Oracle会话及最大连接数 1.查看最大连接数 SQL> show parameter processes; NAME                                 ...

  9. Oracle彻底杀掉进程

    kill session 是DBA经常碰到的事情之一.如果kill 掉了不该kill 的session,则具有破坏性,因此尽可能的避免这样的错误发生.同时也应当注意,如果kill 的session属于 ...

随机推荐

  1. 相克军_Oracle体系_随堂笔记016-参数文件及数据库的启动和关闭

    参数文件: spfile<SID>.ora    动态参数文件,是二进制文件,9i以后引入并建议使用 init<SID>.ora    静态参数文件,是文本文件 动态参数,部分 ...

  2. (十七)WebGIS中距离及面积测量的原理和实现以及坐标转换的简单介绍

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在这一章里我们将讨论基础工具栏中另外两个常用工具:距离测量工 ...

  3. CSS实现的手风琴特效

    CSS样式: //图像个数 @imageN:5; //图像hover之前的总宽度 @w:800px; //图像hover之后的宽度 @imageL:640px; //图像hover之前的宽度 @ima ...

  4. WebSocket 介绍(一)

    WebSocket 发起单个请求,服务端不需要等待客服端,客户端在任何时候也能发消息到服务端,减少了轮询时候的延迟.经历一次连接后,服务器能给客户端发多次.下图是轮询与WebSocket的区别. 基于 ...

  5. DIB位图(Bitmap)的读取和保存

    设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...

  6. Centos7下修改mysql5.6编码方式 解决网站中文显示问号

    解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操作: 1.进入MySQL控制台 mysql  -u root -p 输入密码 查看 ...

  7. linux中的通配符与正则表达式

    在linux中,有通配符及正则表达式,那么什么是通配符和正则表达式,什么时候用?   通配符 它是由shell解析,并且一般用于匹配文件名,实际上就是shell解释器去解析的特殊符号,linux系统通 ...

  8. 体验VS2015 Update 2 的 Android 和 Python

    趁着假期不用加班,又遇到build 2016的劲爆消息--Xamarin免费集成到VS中 所以立马把vs升级到update 2体验一下下(之前也体验过). 在安装的时候也是只勾选了部分,不需要太多(全 ...

  9. Solr3.6.1 在Tomcat6下的环境搭建

    Solr3.6.1 在Tomcat6下的环境搭建 Tomcat路径:D:\prg\apache-tomcat-6-solr 简写为tomcat_home Solr文件下载保存路径为:F:\softwa ...

  10. C# 发送Http请求 - WebClient类

    WebClient位于System.Net命名空间下,通过这个类可以方便的创建Http请求并获取返回内容. 一.用法1 - DownloadData string uri = "http:/ ...