热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pdb连接数_案例分享|Oracle11gRAC数据库连接数过高处理办法

作者|JiekeXu来源|JiekeXu之路(ID:JiekeXu_IT)转载请联系授权|(微信ID:xxq1426321293)大家好,我是Jieke

作者 | JiekeXu

来源 | JiekeXu之路(ID: JiekeXu_IT)

转载请联系授权 | (微信ID:xxq1426321293)

大家好,我是 JiekeXu,很高兴又和大家见面了,今天分享 Oracle 11g RAC 数据库连接数过高处理办法

本文发布于微信公众号【JiekeXu之路】,欢迎点击上方蓝字关注我,标星或置顶,更多干货第一时间到达!

前   言

近期有一套数据库总是出现如下告警 “严重告警:XXX Oracle 服务器:10.10.X.X 数据库的侦听器 LISTENER 状态为 Inactive ”.这样的告警我们已经屡见不鲜,要么就是数据库宕机,要么就是监听异常关闭,因为是 RAC 环境,又不是什么很大问题,便不慌不忙的去处理此问题。

一 问题过程

当登陆到数据库检查数据库状态无异常,查看监听也是正常,那么集群资源状态也是正常。查看数据库后台日志时发现了错误 "ORA-00020:maximum number of processes(2000) exceeded" 连接数达到最大值 2000.查看当前数据库最大连接数设置为 2000,查看数据库除后台进程外两节点数均为 1940 多,外加 50 多个已经超出 2000 了。

排查数据库最大连接数和当前连接数

SQL> show parameter processNAME TYPE VALUE------------------------------------ ----------- ------------------------------aq_tm_processes integer 1cell_offload_processing boolean TRUEdb_writer_processes                  integer     8gcs_server_processes                 integer     4global_txn_processes integer 1job_queue_processes integer 1000log_archive_max_processes integer 4processes                            integer     2000processor_group_name stringSQL> select inst_id,status,count(*) from gv$session where type <> &#39;BACKGROUNND&#39; group by inst_id,status order by 3;

从当前连接以及后台日志查看&#xff0c;INACTIVE 非活跃会话 1940 之多&#xff0c;但数据库 CPU 内存等资源均正常&#xff0c;也没有异常等待事件&#xff0c;不过下午已经出现过连接数过高的问题&#xff0c;根据经验猜测应用系统的中间件连接池以及初始连接大小设置有问题&#xff0c;果不其然后面联系应用方确认没有设置连接超时。

由于此系统不是核心系统&#xff0c;活跃会话也只有三四个更没有大事物&#xff0c;简单查询后便决定先杀掉连接恢复告警&#xff0c;但当时想要通过数据库杀掉非活跃会话连接&#xff0c;可是通过 SID 和 SERIAL# 查杀时很多会话已经不存在了。那么当时采取的办法就是通过操作系统 kill 查杀了&#xff0c;又因为活跃会话很少无事务&#xff0c;便使用如下命令全部查杀了。

注意&#xff1a;生产系统中谨慎操作&#xff0c;尤其是有大事物时不能直接查杀。

ps -ef | grep LOCAL&#61;NO | grep -v grep | awk &#39;{print $2}&#39; | wc -lps -ef | grep LOCAL&#61;NO | grep -v grep | awk &#39;{print $2}&#39; | xargs kill -9

查杀后连接数下降数据库告警恢复&#xff0c;算是告一段落了&#xff0c;没有深入问题根源。

二 问题复现

第二天早上十点多&#xff0c;还在查看另一系统的性能问题时&#xff0c;有人告知此系统又有问题&#xff0c;无疑又是连接数问题&#xff0c;登陆到系统后查看果不其然。两个节点的连接数已达 1800 多&#xff0c;通过操作系统 kill -9 紧急杀掉会话后数据库连接数下降&#xff0c;但是出现问题时还没达到阈值&#xff0c;肯定还有其他没有来得及的问题存在&#xff0c;这个便要后续排查了。

三 问题排查

发现此数据库内存管理是自动管理的&#xff0c;SGA、PGA 设置的值不合理&#xff0c;当出现大量连接时&#xff0c;PGA  设置不合理&#xff0c;新的会话连接则会出现问题应用方反馈出性能问题&#xff1b;另外大量非活跃会话未释放也没有从数据库端限制&#xff0c;未设置超时连接 SQLNET.EXPIRE_TIME 参数。

Dead Connection Detection(DCD)

SQLNET.EXPIRE_TIME&#xff1a; 设置 DCD 检测时间为 1 分钟。指定时间间隔(以分钟为单位)&#xff0c;以发送探测以验证客户端/服务端连接处于活动状态。设置一个大于 0 的值可确保不会由于客户端异常终止而无限期地断开连接。

Dead Connection Detection (DCD)与Inactive Sessions

https://blog.csdn.net/leshami/article/details/9188379

Dead Connection Detection (DCD)与Inactive SessionsDead connections:These are previously valid connections with the database but the connection between the client and server processes hasterminated abnormally.Examples of a dead connection:- A user reboots/turns-off their machine without logging off or disconnecting from the database.- A network problem prevents communication between the client and the server.In these cases, the shadow process running on the server and the session in the database may not terminate.Implemented by* adding SQLNET.EXPIRE_TIME &#61; to the sqlnet.ora fileWith DCD is enabled, the Server-side process sends a small 10-byte packet to the client process after the duration ofthe time interval specified in minutes by the SQLNET.EXPIRE_TIME parameter.If the client side connection is still connected and responsive, the client sends a response packet back to the databaseserver, resetting the timer..and another packet will be sent when next interval expires (assuming no other activity onthe connection).If the client fails to respond to the DCD probe packet* the Server side process is marked as a dead connection and* PMON performs the clean up of the database processes / resources* The client OS processes are terminatedNOTE: SQLNET.RECV_TIMEOUT can be set on the SERVER side sqlnet.ora file. This will set a timeout for the server processto wait for data from the client process.Inactive Sessions:These are sessions that remain connected to the database with a status in v$session of INACTIVE.Example of an INACTIVE session:- A user starts a program/session, then leaves it running and idle for an extended period of time.

于是乎则在两个节点中均设置 SQLNET.EXPIRE_TIME&#61;1&#xff0c;这个参数在 RAC 中则需要设置到 Oracle 用户下 $ORACLE_HOME/network/admin/sqlnet.ora 文件中&#xff0c;。还有个问题就是不确定这个参数到底是设置到哪个用户下的话&#xff0c;可以Oracle、grid 两个用户都设置了总有一个会生效。

[oracle&#64;JiekeXu ~]$ cd /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/[oracle&#64;JiekeXu admin]$ lltotal 16K-rw-r--r-- 1 oracle oinstall 378 May 18 2019 listener.oradrwxr-xr-x 2 oracle oinstall 4.0K Oct 27 2017 samples-rw-r--r-- 1 oracle oinstall 835 Feb 18 2019 shrept.lst-rw-r----- 1 oracle oinstall 332 May 18 2019 tnsnames.ora[oracle&#64;JiekeXu admin]$[oracle&#64;JiekeXu admin]$ vi sqlnet.ora[oracle&#64;JiekeXu admin]$ more sqlnet.oraSQLNET.EXPIRE_TIME&#61;1DIAG_ADR_ENABLED&#61;OFF

设置完后我这边又通过数据库杀掉了一些连接&#xff0c;通过拼接 SQL 杀掉一个小时前的非活跃会话及非后台进程会话。但是发现数据库中出现 KILLED 会话达 594 个。会话没有得到释放&#xff0c;节点二便采用系统层面的 kill -9 杀掉会话。

select &#39;alter system kill session &#39;&#39;&#39;||sid||&#39;,&#39;||serial#||&#39;&#39;&#39;; &#39;from v$session s where s.STATUS&#61;&#39;INACTIVE&#39; and type <> &#39;BACKGROUND&#39; and LOGON_TIME<&#61;(sysdate-1/24);alter system kill session &#39;59,19341&#39;;select inst_id,status, count(*) from gv$session where type <> &#39;BACKGROUND&#39; group by inst_id,status order by 3;

14:03:19 SQL> alter system kill session &#39;1938,3645&#39;;System altered.……………………………省略部分……………………………14:03:19 SQL> alter system kill session &#39;1943,3215&#39;;System altered.14:03:24 SQL> select &#39;alter system kill session &#39;&#39;&#39;||sid||&#39;,&#39;||serial#||&#39;&#39;&#39;; &#39;from v$session s where s.STATUS&#61;&#39;INACTIVE&#39; and type <> &#39;BACKGROUND&#39; and LOGON_TIME<&#61;(sysdate-1/24);&#39;ALTERSYSTEMKILLSESSION&#39;&#39;&#39;||SID||&#39;,&#39;||SERIAL#||&#39;&#39;&#39;;&#39;--------------------------------------------------------------------------------alter system kill session &#39;59,19341&#39;;alter system kill session &#39;458,3637&#39;;……………………………省略部分……………………………alter system kill session &#39;1952,5867&#39;;alter system kill session &#39;1971,2023&#39;;14:06:34 SQL> select inst_id,count(*) from gv$session group by inst_id;INST_ID COUNT(*)---------- ----------1 11972 119414:06:40 SQL> select inst_id,status, count(*) from gv$session where type <> &#39;BACKGROUND&#39; group by inst_id,status order by 3;INST_ID STATUS COUNT(*)---------- -------- ----------2 ACTIVE 11 ACTIVE 41 INACTIVE 5431 KILLED 5942 INACTIVE 1138节点 2 这里又通过 kill -9 杀掉会话&#xff0c;节点 2 的非活跃会话得到释放&#xff0c;但是节点 1 的 KILLED 的会话还是没明显的下降 。SQL> select inst_id,status, count(*) from gv$session where type <> &#39;BACKGROUND&#39; group by inst_id,status order by 3;INST_ID STATUS COUNT(*)---------- -------- ----------1 ACTIVE 32 ACTIVE 41 INACTIVE 3971 KILLED 5922 INACTIVE 671

后面应用方根据建议设置了中间件 Weblogic 连接池超时为 180s 最小连接数为 1 后&#xff0c;节点一 KILLED 也得到了释放&#xff0c;数据库的连接也下降到 400 左右了&#xff0c;算是一个正常范围值。

内存调整

前面说过内存管理为自动管理&#xff0c;这里需要将其调整为手动管理&#xff0c;由于是生产环境不能够随时重启则需要停机窗口&#xff0c;这里先将需要调整的内存参数以及合理的值列出来。

SQL> show parameter targetNAME TYPE VALUE------------------------------------ ----------- ------------------------------archive_lag_target integer 0db_flashback_retention_target integer 1440fast_start_io_target integer 0fast_start_mttr_target integer 0memory_max_target big integer 39168Mmemory_target big integer 39168Mparallel_servers_target integer 1024pga_aggregate_target big integer 0sga_target big integer 0SQL> show parameter sgaNAME TYPE VALUE------------------------------------ ----------- ------------------------------lock_sga boolean FALSEpre_page_sga boolean FALSEsga_max_size big integer 39168Msga_target big integer 0SQL> show parameter pgaNAME TYPE VALUE------------------------------------ ----------- ------------------------------pga_aggregate_target big integer 0SQL>SQL> select * from v$sgastat where name &#61; &#39;free memory&#39; and pool &#61; &#39;shared pool&#39;;POOL NAME BYTES------------ -------------------------- ----------shared pool free memory 856007376--以下为调整步骤sqlplus / as sysdbacreate pfile&#61;&#39;/tmp/pfile1028.ora&#39; from spfile;alter system set shared_pool_size&#61;5G scope&#61;spfile sid&#61;&#39;*&#39;;alter system set db_cache_size&#61;15G scope&#61;spfile sid&#61;&#39;*&#39;;alter system set large_pool_size&#61;1G scope&#61;spfile sid&#61;&#39;*&#39;alter system set java_pool_size&#61;128M scope&#61;spfile sid&#61;&#39;*&#39;;alter system set streams_pool_size&#61;256M scope&#61;spfile sid&#61;&#39;*&#39;;alter system set memory_max_target&#61;0 scope&#61;spfile sid&#61;&#39;*&#39;;alter system set memory_target&#61;0 scope&#61;spfile sid&#61;&#39;*&#39;;alter system set sga_max_size&#61;30g scope&#61;spfile sid&#61;&#39;*&#39;;alter system set sga_target&#61;30G scope&#61;spfile sid&#61;&#39;*&#39;;alter system set pga_aggregate_target&#61;14G scope&#61;spfile sid&#61;&#39;*&#39;;

AIX 操作系统内存 64G&#xff0c;数据库内存 38.25G&#xff0c;将其调整为 30G&#xff0c;PGA 调整为 14G&#xff0c;shared_pool 5G&#xff0c;db_cache 15G&#xff0c;large_pool 1G&#xff0c;java_pool 128G&#xff0c;streams_pool 256M。这些值都是一个近似的值&#xff0c;一个较为合理的值&#xff0c;并不保证 100% 完美正确&#xff0c;在 AWR 报告中Advisory Statistics部分&#xff0c;也会有相关的建议值&#xff0c;如下便是一个较为合理的 shared_pool 的值。设置完这些值后重启数据库系统&#xff0c;将会有一个很大的提升。

最后说一下利用Profile 超时设置&#xff0c;这个没有使用过&#xff0c;网上有方法便晚上回来测试一番 。

首先查询数据库是否开启 resource limit 限制&#xff0c;如果没有开启&#xff0c;则开启这个参数。

SYS&#64;JiekeXu>col name format a15SYS&#64;JiekeXu>col value format a10SYS&#64;JiekeXu>SELECT name, value FROM gv$parameter WHERE name &#61; &#39;resource_limit&#39;;NAME VALUE--------------- ----------resource_limit FALSESYS&#64;JiekeXu>set time on00:44:34 SYS&#64;JiekeXu>00:44:35 SYS&#64;JiekeXu>ALTER SYSTEM SET RESOURCE_LIMIT&#61;TRUE;System altered.00:44:40 SYS&#64;JiekeXu>SELECT name, value FROM gv$parameter WHERE name &#61; &#39;resource_limit&#39;;NAME VALUE--------------- ----------resource_limit  TRUE--然后创建空闲 1 分钟中止空闲例程的 Profile00:44:49 SYS&#64;JiekeXu>CREATE PROFILE app_user LIMIT IDLE_TIME 1;Profile created.--设置 scott 用户的 Profile00:46:27 SYS&#64;JiekeXu>alter user scott profile app_user;User altered.--当然也可以使用 默认的 Profile00:46:58 SYS&#64;JiekeXu>ALTER PROFILE DEFAULT LIMIT IDLE_TIME 1;Profile altered.

然后使用客户端工具 SQLPlus 远程连接&#xff0c;查询业务数据等待 1 分钟后在继续查询则会报错 ORA-02396。

[oracle&#64;JiekeXu ~]$ more /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora# Generated by Oracle configuration tools.JiekeXu &#61;(DESCRIPTION &#61;(ADDRESS &#61; (PROTOCOL &#61; TCP)(HOST &#61; 192.168.3.101)(PORT &#61; 1521))(CONNECT_DATA &#61;(SERVER &#61; DEDICATED)(SERVICE_NAME &#61; JiekeXu)))[oracle&#64;JiekeXu ~]$ sqlplus scott/scott&#64;JiekeXuSQL*Plus: Release 11.2.0.4.0 Production on Wed Oct 28 00:56:29 2020Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSCOTT&#64;JiekeXu>set time on00:56:35 SCOTT&#64;JiekeXu>select sysdate from dual;SYSDATE---------28-OCT-2000:56:45 SCOTT&#64;JiekeXu>00:56:45 SCOTT&#64;JiekeXu>select sysdate from dual;select sysdate from dual*ERROR at line 1:ORA-02396: exceeded maximum idle time, please connect again01:12:48 SCOTT&#64;JiekeXu>

今天的分享就到这里了&#xff0c;如果本文对您有一点儿帮助&#xff0c;请多支持“在看”与转发&#xff0c;不求小费了哪怕是一个小小的赞&#xff0c;您的鼓励都将是我最大的动力&#xff0c;让我有一直写下去的动力&#xff0c;最后一起加油,奥利给&#xff01;

一键三连“分享、在看与点赞”&#xff0c;给我充点儿电吧~



推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
author-avatar
C1_VISION
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有