ORACLE会话连接进程三者总结
2014-11-16 05:53
316 查看
概念介绍
通俗来讲,会话(Session)是通信双方从开始通信到通信结束期间的一个上下文(Context)。这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器、通过哪个应用程序、哪个用户登录等信息.
连接(Connection):连接是从客户端到ORACLE实例的一条物理路径。连接可以在网络上建立,或者在本机通过IPC机制建立。通常会在客户端进程与一个专用服务器或一个调度器之间建立连接。
会话(Session)是和连接(Connection)是同时建立的,两者是对同一件事情不同层次的描述。简单讲,连接(Connection)是物理上的客户端同服务器的通信链路,会话(Session)是逻辑上的用户同服务器的通信交互。
ORACLE中一个用户登录ORACLE服务器的前提,就是该用户具有ORACLE的“CREATESESSION”权限。ORACE允许同一个用户在同一个客户机上建立多个同服务器的会话,每个SESSION都代表了用户与服务器的一个交互。就像你用IE浏览器打开博客园网站,然后你再打开一个IE窗口,又打开一个博客园网站。两个IE窗口就相当于两个SESSION,而物理链路就相当于连接(Connection)。后台进程PMON会每隔一段时间,就会检测用户连接状况,如果连接已断开,PMON会清理现场,释放相关的资源。
在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,还可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级OracleNet特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。
在专用服务器中,一个会话对应一个服务器进程(Process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。
下面是一段关于连接(connection)、会话、进程的英文描述
Aconnectionisaphysicalcircuitbetweenyouandthedatabase.Aconnectionmightbeoneofmanytypes--mostpopularbeginDEDICATEDserverandSHAREDserver.Zero,oneormoresessionsmaybeestablishedover
agivenconnectiontothedatabaseasshowabovewithsqlplus.Aprocesswillbeusedbyasessiontoexecutestatements.SometimesthereisaonetoonerelationshipbetweenCONNECTION->SESSION->PROCESS(eg:anormaldedicatedserverconnection).Sometimes
thereisaonetomanyfromconnectiontosessions(eg:likeautotrace,oneconnection,twosessions,oneprocess).
Aprocessdoesnothavetobededicatedtoaspecificconnectionorsessionhowever,forexamplewhenusingsharedserver(MTS),yourSESSIONwillgrabaprocessfromapoolofprocessesinordertoexecuteastatement.
Whenthecallisover,thatprocessisreleasedbacktothepoolofprocesses.
会话&链接
在具体的应用场景中连接(connction)和会话(session)有很多情况:
1.SQL*PLUS登录ORACLE
这种场景比较容易理解,一个连接对应一个Session。
2.PL/SQLDeveloper工具登录ORACLE
PL/SQLDeveloper工具——>首选项——>连接下,你可以设置会话方式,如下图所示:
如果设置选项选择多路会话,:PL/SQLDeveloper登录ORACLE,每打开一个窗口,将创建一个新的会话,而设置选项选择单路会话,则新打开的窗口会共用一个会话。具体你可以参考PLSQLDeveloper8.0用户指南:
多路会话:每个测试窗口、SQL窗口和命令窗口都将有它自己的会话,另外的一个会话将被用于编译。这是最灵活的设置,明显地会导致最大数量的数据库会话。另外可能的缺点是,在更新被提交之后,它们只在X窗口中可以看到,而在Y窗口看不到。
双路会话:测试窗口、SQL窗口和命令窗口将共享一个会话,另外一个会话将被用于编译。这个模式的缺点是每次只有一个窗口可以运行程序。
单路会话:所有的窗口和所有的编译都使用同一个会话,这使事务管理变得很困难。在这个模式中调试器被禁用使用。如果你被限制只能使用一个数据库会话,那么你只能使用这个设置了。
会话&进程
在Oracle中如何查看参数sessiones或processes的值呢?一般使用showparameter命令查看。
方法2:查询v$parameter
方法3:查询v$resiyrce_limit;
Oracle的sessions和processes的数量关系是:
Oracle11gR1以及之前版本
sessions=(1.1*processes)+5
Oracle11gR2
sessions=(1.5*processes)+22
如下例子所示,在Oracle10g版本中,processes与sessions的关系如下所示:
SELECT(1.1*850)+5FROMDUAL;其值刚好为940
一般修改参数processes后,sessions参数也会随之变化,但是有一个奇怪的现象时,如下所示,我将processes从
850改为120后,重启数据库实例,发现sessions的值并没有随之变化。这个现象一般发生在改小processes参数。为什么这样呢?
共享服务器模式,一个会话可能由多个服务进程轮流为之服务,一个进程可能为多个会话服务。简单地说,进程和会话之间有一种多对多的关系。
会话管理
1:查看当前所有用户的会话(SESSION):
其中Oracle内部进程的USERNAME为空
2:查看当前用户的所有SESSION:
3:查看当前窗口/当前用户的会话信息
4:查看所有ACTIVE会话(活动会话)
5:查看当前会话的ID可以通过如下脚本:
查看当前用户的SPID
6:查看数据库允许最大会话数
7:查看曾经的最大会话数:
SESSIONS_HIGHWATER表示曾经的最大会话数512
8:查询那些应用的连接数此时是多少
会话状态:
会话有ACTIVE、INACTIVE、KILLED、CACHED、SNIPED五个状态,一般比较常见的有ACTIVE、INACTIVE、KILLED三个状态。
ACTIVE:处于此状态的会话,表示正在执行,处于活动状态。
INACTIVE:处于此状态的会话表示不是正在执行的
KILLED:处于此状态的会话,表示出现了错误或进程被杀掉,正在回滚,当然,这个状态的会话也占用系统资源的。还有一点就是,KILLED的状态一般会持续较长时间,如果你想快速杀掉回话,可以参考我以前的一篇文章ORACLE快速彻底Kill掉的会话
CACHED:SessiontemporarilycachedforusebyOracle*XA
SNIPED:Sessioninactive,waitingontheclient。标记为SNIPED的进程被释放有两种条件:
1、相关的terminal再一次试图登录及执行sql
2、手动的在操作系统后台kill掉相应的spid
关于会话信息
通过如下SQL你可以查询你的每个应用程序到底在等待什么,从而针对这些信息对数据库的性能进行调整。
2.ORACLE中查询被锁的表并释放session
3.查看占用系统IO较大的session
4.找出耗cpu较多的session
通俗来讲,会话(Session)是通信双方从开始通信到通信结束期间的一个上下文(Context)。这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器、通过哪个应用程序、哪个用户登录等信息.
连接(Connection):连接是从客户端到ORACLE实例的一条物理路径。连接可以在网络上建立,或者在本机通过IPC机制建立。通常会在客户端进程与一个专用服务器或一个调度器之间建立连接。
会话(Session)是和连接(Connection)是同时建立的,两者是对同一件事情不同层次的描述。简单讲,连接(Connection)是物理上的客户端同服务器的通信链路,会话(Session)是逻辑上的用户同服务器的通信交互。
ORACLE中一个用户登录ORACLE服务器的前提,就是该用户具有ORACLE的“CREATESESSION”权限。ORACE允许同一个用户在同一个客户机上建立多个同服务器的会话,每个SESSION都代表了用户与服务器的一个交互。就像你用IE浏览器打开博客园网站,然后你再打开一个IE窗口,又打开一个博客园网站。两个IE窗口就相当于两个SESSION,而物理链路就相当于连接(Connection)。后台进程PMON会每隔一段时间,就会检测用户连接状况,如果连接已断开,PMON会清理现场,释放相关的资源。
在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,还可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级OracleNet特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。
在专用服务器中,一个会话对应一个服务器进程(Process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。
下面是一段关于连接(connection)、会话、进程的英文描述
Aconnectionisaphysicalcircuitbetweenyouandthedatabase.Aconnectionmightbeoneofmanytypes--mostpopularbeginDEDICATEDserverandSHAREDserver.Zero,oneormoresessionsmaybeestablishedover
agivenconnectiontothedatabaseasshowabovewithsqlplus.Aprocesswillbeusedbyasessiontoexecutestatements.SometimesthereisaonetoonerelationshipbetweenCONNECTION->SESSION->PROCESS(eg:anormaldedicatedserverconnection).Sometimes
thereisaonetomanyfromconnectiontosessions(eg:likeautotrace,oneconnection,twosessions,oneprocess).
Aprocessdoesnothavetobededicatedtoaspecificconnectionorsessionhowever,forexamplewhenusingsharedserver(MTS),yourSESSIONwillgrabaprocessfromapoolofprocessesinordertoexecuteastatement.
Whenthecallisover,thatprocessisreleasedbacktothepoolofprocesses.
会话&链接
在具体的应用场景中连接(connction)和会话(session)有很多情况:
1.SQL*PLUS登录ORACLE
这种场景比较容易理解,一个连接对应一个Session。
2.PL/SQLDeveloper工具登录ORACLE
PL/SQLDeveloper工具——>首选项——>连接下,你可以设置会话方式,如下图所示:
如果设置选项选择多路会话,:PL/SQLDeveloper登录ORACLE,每打开一个窗口,将创建一个新的会话,而设置选项选择单路会话,则新打开的窗口会共用一个会话。具体你可以参考PLSQLDeveloper8.0用户指南:
多路会话:每个测试窗口、SQL窗口和命令窗口都将有它自己的会话,另外的一个会话将被用于编译。这是最灵活的设置,明显地会导致最大数量的数据库会话。另外可能的缺点是,在更新被提交之后,它们只在X窗口中可以看到,而在Y窗口看不到。
双路会话:测试窗口、SQL窗口和命令窗口将共享一个会话,另外一个会话将被用于编译。这个模式的缺点是每次只有一个窗口可以运行程序。
单路会话:所有的窗口和所有的编译都使用同一个会话,这使事务管理变得很困难。在这个模式中调试器被禁用使用。如果你被限制只能使用一个数据库会话,那么你只能使用这个设置了。
会话&进程
在Oracle中如何查看参数sessiones或processes的值呢?一般使用showparameter命令查看。
SQL>showparameterprocesses;
NAMETYPEVALUE
-----------------------------------------------------------------------------------
aq_tm_processesinteger0
db_writer_processesinteger1
gcs_server_processesinteger0
job_queue_processesinteger10
log_archive_max_processesinteger2
processesinteger850
SQL>showparametersession;
NAMETYPEVALUE
-------------------------------------------------------------------------------
java_max_sessionspace_sizeinteger0
java_soft_sessionspace_limitinteger0
license_max_sessionsinteger0
license_sessions_warninginteger0
logmnr_max_persistent_sessionsinteger1
session_cached_cursorsinteger20
session_max_open_filesinteger10
sessionsinteger940
shared_server_sessionsinteger
SQL>
方法2:查询v$parameter
selectname,type,value,display_value,isses_modifiable,issys_modifiable
fromv$parameter
wherename='sessions';
selectname,type,value,display_value,isses_modifiable,issys_modifiable
fromv$parameter
wherename='processes';
方法3:查询v$resiyrce_limit;
Oracle的sessions和processes的数量关系是:
Oracle11gR1以及之前版本
sessions=(1.1*processes)+5
Oracle11gR2
sessions=(1.5*processes)+22
如下例子所示,在Oracle10g版本中,processes与sessions的关系如下所示:
SQL>select*fromv$version;
BANNER
----------------------------------------------------------------
OracleDatabase10gRelease10.2.0.4.0-64bitProduction
PL/SQLRelease10.2.0.4.0-Production
CORE10.2.0.4.0Production
TNSforLinux:Version10.2.0.4.0-Production
NLSRTLVersion10.2.0.4.0-Production
SELECT(1.1*850)+5FROMDUAL;其值刚好为940
一般修改参数processes后,sessions参数也会随之变化,但是有一个奇怪的现象时,如下所示,我将processes从
850改为120后,重启数据库实例,发现sessions的值并没有随之变化。这个现象一般发生在改小processes参数。为什么这样呢?
共享服务器模式,一个会话可能由多个服务进程轮流为之服务,一个进程可能为多个会话服务。简单地说,进程和会话之间有一种多对多的关系。
会话管理
1:查看当前所有用户的会话(SESSION):
SELECT*FROMV$SESSION
WHEREUSERNAMEISNOTNULL
ORDERBYLOGON_TIME,SID;
其中Oracle内部进程的USERNAME为空
2:查看当前用户的所有SESSION:
SELECT*FROMV$SESSION
WHEREUSERNAME=USER
ORDERBYLOGON_TIME,SID;
3:查看当前窗口/当前用户的会话信息
SELECTSID,SERIAL#,STATUSFROMV$SESSIONWHEREAUDSID=USERENV('SESSIONID');
4:查看所有ACTIVE会话(活动会话)
SELECT*FROMV$SESSION
WHEREUSERNAMEISNOTNULLANDSTATUS='ACTIVE'
ORDERBYLOGON_TIME,SID;
5:查看当前会话的ID可以通过如下脚本:
SELECT*FROMV$MYSTATWHEREROWNUM=1
查看当前用户的SPID
SELECTP.SPID,S.SID,S.SERIAL#
FROMV$PROCESSP
INNERJOINV$SESSIONSONP.ADDR=S.PADDR
WHERES.AUDSID=USERENV('SESSIONID');
6:查看数据库允许最大会话数
SQL>SHOWPARAMETERSESSIONS;
NAMETYPEVALUE
-----------------------------------------------------------------------------
java_max_sessionspace_sizeinteger0
java_soft_sessionspace_limitinteger0
license_max_sessionsinteger0
license_sessions_warninginteger0
logmnr_max_persistent_sessionsinteger1
sessionsinteger225
shared_server_sessionsinteger
SQL>SELECTNAME,TYPE,VALUEFROMV$PARAMETERWHERENAMELIKE'session%';
NAMETYPEVALUE
------------------------------
sessions3225
session_cached_cursors320
session_max_open_files310
7:查看曾经的最大会话数:
SQL>
SQL>SELECTSESSIONS_MAX,SESSIONS_WARNING,SESSIONS_CURRENT,SESSIONS_HIGHWATER
2FROMv$license;
SESSIONS_MAXSESSIONS_WARNINGSESSIONS_CURRENTSESSIONS_HIGHWATER
--------------------------------------------------------------
00512553
SESSIONS_HIGHWATER表示曾经的最大会话数512
8:查询那些应用的连接数此时是多少
SELECTB.PROGRAM,COUNT(1)
FROMV$PROCESSA,V$SESSIONB
WHEREA.ADDR=B.PADDR
ANDB.USERNAMEISNOTNULL
GROUPBYB.PROGRAM;
会话状态:
会话有ACTIVE、INACTIVE、KILLED、CACHED、SNIPED五个状态,一般比较常见的有ACTIVE、INACTIVE、KILLED三个状态。
ACTIVE:处于此状态的会话,表示正在执行,处于活动状态。
INACTIVE:处于此状态的会话表示不是正在执行的
KILLED:处于此状态的会话,表示出现了错误或进程被杀掉,正在回滚,当然,这个状态的会话也占用系统资源的。还有一点就是,KILLED的状态一般会持续较长时间,如果你想快速杀掉回话,可以参考我以前的一篇文章
CACHED:SessiontemporarilycachedforusebyOracle*XA
SNIPED:Sessioninactive,waitingontheclient。标记为SNIPED的进程被释放有两种条件:
1、相关的terminal再一次试图登录及执行sql
2、手动的在操作系统后台kill掉相应的spid
关于会话信息
通过如下SQL你可以查询你的每个应用程序到底在等待什么,从而针对这些信息对数据库的性能进行调整。
COLUSERNAMEFORA12;
COLPROGRAMFORA32;
COLEVENTFORA26;
SELECTS.USERNAME
,S.PROGRAM
,S.STATUS
,SE.EVENT
,SE.TOTAL_WAITS
,SE.TOTAL_TIMEOUTS
,SE.TIME_WAITED
,SE.AVERAGE_WAIT
FROMV$SESSIONS,V$SESSION_EVENTSE
WHERES.SID=SE.SIDANDSE.EVENTNOTLIKE'SQL*Net%'
ANDS.STATUS='ACTIVE'ANDS.USERNAMEISNOTNULL;
2.ORACLE中查询被锁的表并释放session
SELECTA.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
FROMALL_OBJECTSA,V$LOCKED_OBJECTB,SYS.GV_$SESSIONC
WHEREA.OBJECT_ID=B.OBJECT_IDANDB.PROCESS=C.PROCESSORDERBY1,2;
3.查看占用系统IO较大的session
SELECTse.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
FROMv$sessionse,v$session_waitst,v$sess_iosi,v$processpr
WHEREst.sid=se.sidANDst.sid=si.sid
ANDse.paddr=pr.ADDRANDse.sid>6
ANDst.wait_time=0ANDst.eventNOTLIKE'%SQL%'
ORDERBYphysical_readsDESC;
4.找出耗cpu较多的session
selecta.sid
,spid
,status
,substr(a.program,1,40)prog
,a.terminal
,osuser
,value/60/100value
fromv$sessiona,v$processb,v$sesstatc
wherec.statistic#=12andc.sid=a.sidanda.paddr=b.addr
orderbyvaluedesc
相关文章推荐
- ORACLE会话连接进程三者总结
- ORACLE会话连接进程三者总结
- ORACLE会话连接进程三者总结
- ORACLE会话连接进程三者总结
- 讨论oracle 11g 会话 连接 与服务进程之间的关系
- oracle技术之进程、会话、连接之间的差异
- 连接Oracle 10g时ORA-12514TNS监听进程不能解析在连接描述符中给出的 SERVICE_NAME 错误的解决
- oracle左右连接总结
- 连接Oracle 10g时ORA-12514: TNS: 监听进程不能解析在连接描述符中给出的 SERVICE_NAME 错误的解决
- oracle连接的总结(关于tnsname和监听)
- 如何查看和清除oracle无用的连接进程
- Oracle左右全连接总结
- Oracle左右全连接总结
- Oracle调优--修改Oracle的进程数[processes]及会话数[sessions]
- 数据库数据库(sqlserver,db2,oracle)的jdbc连接总结
- Oracle左右全连接总结
- 【经典】连接oracle的总结(关于tnsname和监听)
- 连接oracle的总结
- 连接oracle的总结(关于tnsname和监听)
- JSP连接ORACLE 方式总结