ORACLE中STATUS为INACTIVE但是SERVER为SHARED状态的会话浅析
我们知道当ORACLE数据库启用共享服务器模式时,通过共享服务器模式连接到数据库的会话是有一些特征的。在v$session里面,其SERVER的状态一般为SHARED和NONE, 为SHARED时,表示当前会话正在执行SQL语句,其占用共享服务器进程,会话的STATUS状态为ACTIVE;当会话状态STATUS处于INACITVE时,它的SERVER字段值一般为NONE,意味着此时并没有共享服务器进程服务该会话,这个详细请见v$session中server为none与shared值解析 这篇博客。但是最近在一数据库中突然见到一些会话STATUS为INACTIVE,但是SERVER状态为SHARED的会话,如下所示:
其实发现这个问题是因为在追查一个TNS-12535的问题时发现的。当时突然出现短暂的数据库(Oracle 10g R2)连接不上的情况,nmon监控发现当时的整体资源开销都非常小,也分析过AWR、ASH报告,并没有发现很特殊的情况,但是在bdump下面发现shared server进程生成的trc文件。例如下面一个 epps_d004_24858.trc,截图所示:
在这篇博客”TNS-12535: TNS:operation timed out案例解析”里面我分析、构造过出现TNS-12535错误的场景。但是我们分析ASH报告和查询dba_hist_active_sess_history时发现出现问题的时间段,active会话的数量不超过4个。所以可以排除是这种情形。后面检查发现共享服务器模式的会话居然有STATUS为INACTIVE但是SERVER为SHARED状态的会话,而且数量较多,本身这台服务器的max_shared_servers参数为32,所以当大量INACTIVE会话一直占用shared server进程时,当ACITVE会话需要shared server服务进程时就会由于shared server进程不够而处于等待状态,时间长了就会出现TNS-12535错误。那么就有可能出现active session不多,但是连接不上数据库的这种情况。分析至此,那么就有两个问题需要解决:1 为什么INACTIVE的会话会占用shared server进程不释放? 2 这个分析必须要经测试验证确认. 3:如何解决这个问题?
SQL> show parameter max_shared_servers;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer 32
SQL>
关于第一个问题,刚刚开始一直没有找到答案,后面才在oracle metalink上面找到了答案,官方文档High Number Of Shared Servers Usage In 10g When Compared To 9i (文档 ID 444950.1)里面有相关介绍,如下摘抄所示:
APPLIES TO:
Oracle Server - Enterprise Edition - Version: 9.2.0.1 to 10.2.0.3
This problem can occur on any platform.
SYMPTOMS
On 10g having a shared server configuration and seeing many sessions with "STATUS" "INACTIVE" but still these sessions are not releasing the shared server process.
When you query from V$SESSION
SQL>select sid,server,status FROM v$session WHERE SID='154';
SID SERVER STATUS
---------- --------- --------
154 SHARED INACTIVE
In 9i The shared server process is released.
SQL> select SID,Server,STATUS from V$Session where SID=10;
SID SERVER STATUS
---------- --------- --------
10 NONE INACTIVE
In 10g Since the sessions are not releasing the shared server processes, Number of shared server processes increases and will cause new connections to terminate with a message max limit(MAX_SHARED_SERVERS) for shared_servers exceeded.
If you trace the session then you will observe the following wait events.
WAIT #0: nam='virtual circuit status' ela= 30000256 circuit#=7 status=2 p3=0
obj#=-1 tim=745725456
*** 2006-11-28 14:46:43.906
WAIT #0: nam='virtual circuit status' ela= 30000250 circuit#=7 status=2 p3=0
obj#=-1 tim=775725785
CAUSE
When using WORKAREA_SIZE_POLICY=AUTO, In 10g for certain operations (Like SORT) SQL memory can intentionally spill into the PGA of the shared server rather than taking up space in shared memory. When data spills to the PGA the session has to stay tied to that specific shared server. And hence the Process in Inactive can still be holding a shared server until it is terminated.
SOLUTION
The behavior observed is expected in 10g when WORKAREA_SIZE_POLICY is set to automatic.
Use WORKAREA_SIZE_POLICY=MANUAL to prevent the SORT operation to spill over the PGA. This will make sure the session doesn't require any more shared server process and the SHARED_SERVER will be released by the process when it is in INACTIVE status.
BUG 5689608 can be referred for more information
REFERENCES
BUG:5689608 - INACTIVE SESSION IS NOT RELEASING SHARED SERVER PROCESS
当数据库参数WORKAREA_SIZE_POLICY = AUTO时,在10g中对于某些SQL操作(如SORT)所用的SQL内存,可能有意地放入( spill over这里没有翻译为溢出)共享服务器的PGA当中,而不是占用共享内存(shared memroy)中的空间。 当数据放入到PGA时,会话必须保持绑定到该特定的共享服务器(shared server)。 因此,处于非活动状态的进程仍可以持有共享服务器,直到会话终止。
另外,解决方案里面也介绍,可以将参数WORKAREA_SIZE_POLICY设置为MANUAL,这样可以阻止排序操作将数据放入PGA当中。这个设定可以确保会话不会要求更多的共享服务器进程,并且当会话变成INACTIVE状态时,共享服务器很快就能释放。
那么第一个问题解决了,接下来我们来看第二个问题,后面我观察时,发现出现问题的时候,ACTIVE和INACTVIE的shared server数量等于32了. 那么我们接下来看看,如何构造这种状态的会话
在共享连接方式的会话1中执行下面SQL
SQL> show user;
USER is "TEST"
SQL> create table test as select * from dba_objects;
Table created.
SQL> create or replace package cursor_package as
2 cursor mycursor is select * from test order by object_name;
3 end;
4 /
Package created.
SQL> begin
2 open cursor_package.mycursor;
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> create or replace procedure test_case is
2 l_row TEST%rowtype;
3 begin
4 if cursor_package.mycursor%isopen then
5 fetch cursor_package.mycursor into l_row;
6 end if;
7 end;
8 /
Procedure created.
SQL> select sys_context('userenv', 'sid') from dual;
SYS_CONTEXT('USERENV','SID')
--------------------------------------------------------------------------------
932
如上所示,我们知道这个会话ID为932,此时开启另外一个会话2,查看会话ID为932的状态。如下所示
SQL> select sid, serial#, status ,server from v$session where sid=932;
SID SERIAL# STATUS SERVER
---------- ---------- -------- ---------
932 23 INACTIVE NONE
在会话1中执行下面SQL语句,如下截图所示:
SQL> exec test_case;
PL/SQL procedure successfully completed.
SQL>
然后去会话2中检查会话ID为932的状态,此时就会出现STATUS为INACTIVE,SERVER状态为SHARED的会话状态了。

关于如何解决这个问题,我们并没有将将参数WORKAREA_SIZE_POLICY设置为MANUAL,因为修改这个参数过后,需要调整sort_area_size,hash_area_size等参数. 在复杂环境下,一个固定值比较难满足各个时段的需求。这个数据库实例本身max_shared_server的值(32)比较小,我们将其调整为48, 另外本身设置了一个crontab作业, 定期清理那些空闲超过一段时间的INACTIVE会话。
参考资料:
High Number Of Shared Servers Usage In 10g When Compared To 9i (文档 ID 444950.1)
ORACLE中STATUS为INACTIVE但是SERVER为SHARED状态的会话浅析的更多相关文章
- Oracle中INSTR函数与SQL Server中CHARINDEX函数
Oracle中INSTR函数与SQL Server中CHARINDEX函数 1.ORACLE中的INSTR INSTR函数格式:INSTR(源字符串, 目标字符串, 起始位置, 匹配序号) 说明:返回 ...
- 在oracle中通过链接服务器(dblink)访问sql server
在oracle中通过链接服务器(dblink)访问sql server 2013-10-16 一. 工作环境: <1> Oracle数据库版本:Oracle 11g 运行环境 :IB ...
- SQL Server与Oracle中的隔离级别
在SQL92标准中,事务隔离级别分为四种,分别为:Read Uncommitted.Read Committed.Read Repeatable.Serializable 其中Read Uncommi ...
- sql server中类似oracle中decode功能的函数
sqlserver 2008 写法 select t.PROJECTNAME, t.BUILDCONTENTSCALE, CASE t.PROJECTLEVEL ' THEN '国家重点' ' THE ...
- Oracle session active 和 inactive 状态 说明
Oracle session active 和 inactive 状态 说明 原创 2011年06月12日 13:08:00 标签: session / oracle / database / ser ...
- Oracle中Kill session的研究(转 出自eagle)
itpub link: http://www.itpub.net/235873.html 我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为: a ...
- ORACLE 中KILL session
我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为: alter system kill session 'sid,serial#' ; 被kil ...
- Oracle session连接数和inactive的问题记录
Oracle session连接数和inactive的问题记录 http://timnity.javaeye.com/blog/280383 从上周起,服务器Oracle数据库出现问题,用不到半天,就 ...
- oracle中的listener.ora和tnsnames.ora
一.oracle的客户端与服务器端 oracle在安装完成后服务器和客户端都需要进行网络配置才能实现网络连接. 服务器端配置监听器,客户端配置网络服务名. 服务器端可配置一个或多个监听程序 . ...
随机推荐
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- 工厂方法模式——创建型模式02
1. 简单工厂模式 在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- CRL快速开发框架系列教程三(更新数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)
建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...
- C#——传值参数(1)
//我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)<C#语言入门详解>学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师! 这次与大家一起学习C#中的值 ...
- RMS:不能对生产服务器使用测试清单
问题说明:在使用office软件RMS加密时报:不能对生产服务器使用测试清单,或者使用 rmsbulk.exe进行RMS加密时,报不能连接到RMS服务器. 解决办法: 请到https://suppor ...
- Atitit.技术管理者要不要自己做开发??
Atitit.技术管理者要不要自己做开发?? 1. 为什么很多管理者不能自己亲自做了1 1.1. 沟通成本多了1 1.2. .组织分散. 1 1.3. 会议多 .协调多 1 1.4. 问题的根源在于我 ...
- github入门到上传本地项目【网上资源整合】
[在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...
- MyBatis3.2从入门到精通第一章
第一章一.引言mybatis是一个持久层框架,是apache下的顶级项目.mybatis托管到goolecode下,再后来托管到github下.(百度百科有解释)二.概述mybatis让程序将主要精力 ...


