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在安装完成后服务器和客户端都需要进行网络配置才能实现网络连接. 服务器端配置监听器,客户端配置网络服务名. 服务器端可配置一个或多个监听程序 . ...
随机推荐
- python开发编译器
引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...
- 【.net 深呼吸】启动一个进程并实时获取状态信息
地球人和火星人都知道,Process类既可以获取正在运行的进程,也可以启动一个新的进程.在79.77%应用场合,我们只需要让目标进程顺利启动就完事了,至于它执行了啥,有没有出错,啥时候退出就不管了. ...
- 前端学HTTP之报文首部
前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 在centos7上安装ClamAV杀毒,并杀毒(centos随机英文10字母)成功
前言 上传文件的时候发现总是失败,查看top发现有个进程一直cpu占用80%以上,而且名称还是随机数.kill之后,一会儿又重新生成了.突然发现居然没有在服务端杀毒的经历.在此处补齐. 安装clama ...
- Loadrunner Http Json接口压力测试
前天接到了一个测试任务,要求测试一下ES(elsticsearch)在不同并发下的查询效率.如图: 业务场景是在客户端根据具体车牌查询相关车辆信息,结果返回前10条记录. 从图中可以看到,接口的请求参 ...
- 电信计费业务:预后融合OCS到底应该实扣还是虚扣?
引入OCS的初衷之一是为了让计费系统能够参与到用户的通讯控制中来,也就是所谓的实时信控.用户在没有余额时,通讯就会被停止,不会造成"天价欠费 ",一方面保障用户的利益,一方面也保障 ...
- BPM嵌入式流程解决方案分享
一.需求分析由于企业业务的独特性或者企业高层独特的管理思想,很多客户选择了自行开发业务系统的方式来实现独有的竞争力. 这类信息系统通常经过了多年的开发,伴随着企业的发展一直在不断优化,与企业的业务非常 ...
- Android菜单项内容大全
一.介绍: 菜单是许多应用中常见的用户界面组件. Android3.0版本以前,Android设备会提供一个专用"菜单"按钮呈现常用的一些用户操作, Android3.0版本以后, ...
- 【腾讯Bugly干货分享】Android性能优化典范——第6季
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...