新闻中心
专业的数据管理基础设施及服务供应商
技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”
发布日期:
2022-08-28

如果把数据中心建设比喻成西天取经,那旅途上的九九八十一难就是我们不得不躲闪、跨越、攻坚的堡垒。希嘉推出“技术栈”板块,集结数据治理BU团队的众位技术大拿,将我们在数据治理与全域数据中心建设中跨越的沟沟坎坎做逐期分享,陪伴高校用户共赴坦途。


高校中最为常见的数据库就是Oracle Database了,各业务系统后台数据库、共享数据库、数据仓库等,大部分均在使用9i、10G、11G、12C等版本的Oracle数据库。随着信息化建设日趋完善,业务部门之间的数据互通频率增大、各自结合数据的管理创新也越来越多,随之而来的是对数据库的访问频率也越来越高,尤其是校级的共享数据库或数据仓库。


但因为校级数据平台建设时重点关注的是数据集成范围是否够大、业务标准口径是否统一、数据交换的技术手段是否丰富等,而忽略了数据平台“性能”方面的问题,一些数据库的基础架构、性能参数往往不是最优,导致校级数据平台在运行阶段频频出现故障。今天就来聊一聊“Oracle数据库超出最大连接数”的故障如何解决以及预防。


数据库的连接数是有限制的,超过这个限制,其就会拒绝新的访问请求,出现如下截图错误:

技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”

我们常说的“ORA-00020:超出最大连接数”错误


出现这个错误怎么办?如图所示,连超级管理员用户都登录不上去,想去操作数据库重启或调整都没有机会。此时需要考虑故障报错信息背后的原因:


● 当前数据库允许的最大连接数是多少?

● 是什么原因导致超出最大连接数?

● 这个连接数是数据库参数吗?可以修改吗?

● 应用端着急上线某个软件,怎么紧急处理?

● 处理完故障后续怎么预防?


顺着上面的思路,我们来理解下。数据库有一个数据库参数processes,在安装时如果不做特别设置,其默认设置是processes=150,也就是数据库允许150个进程访问。如果上述问题出现,可以分为应急处理、适当优化和后续预防三个步骤来处理。


01  应急处理

使用管理员用户登录上数据库并进行调整,首先查看以前是否有已登录的管理员用户窗口。如果有,使用该窗口进行管理,如果没有,则启用特殊命令登录数据库。这里以上面后一种最极端的场景来说明。


技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”

我们常说的“ORA-00020:超出最大连接数”错误


技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”

查看当前数据库设置的最大连接数是多少


技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”

使用sql语句查询当前的连接数

注:这里是测试环境,如果是故障环境,这里的连接数据应该被占满了


如果连接数事实上已经达到了数据库规定的上限,那么进一步查找是哪些进程一直占用数据库连接而不释放。


技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”


使用如图语句查询


上图中查询出终端应用程序是PLSQL客户端的连接进程,其中SPID就是占用数据库连接的数据库服务器上的系统进程号。明确问题根源,使用sql语句拼接系统命令行批量执行,杀掉导致连接数被占满的进程从而释放连接数。


技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”


组装系统命令的sql语句


复制这些命令,在数据库服务器命令号执行,杀掉占用过高的进程。至此,故障基本排除,新的连接已经可以连接进数据库了。


注意:这里要谨慎查找并根据实际经验判断“连接数被占满的主要进程”,千万不要盲目杀进程,导致杀掉系统进程或数据库后台进程,进而出现数据库故障。


在高校场景中,大量终端用户使用PLSQL等数据库开发工具做相关的数据查询、调试和编码,常常是一个PLSQL开十数个窗口,而每一个窗口都是一个单独的会话,一个单独的会话就可能占用3-5个进程。工程师如果长期不关闭调试窗口,这样算下来每个人将占用30-50个进程资源,人数多了之后对数据库的进程资源造成了严重的占用。


实际环境中,常常需要根据经验判断应该差杀掉哪些占用数据库进程数的会话,所以要结合一些条件进行判断。通常可以通过查询v$session视图,结合该视图的数据进行判断。常用的判断条件有下列几个:


● USERNAME:数据库用户名

● MACHINE:远端连接的PC名称

● OSUSER:远端PC名及系统用户名

● PROGRAM:远端连接的软件名称

● MODULE:远端连接软件的模块名

● LOGON_TIME:登录时间


技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”


常用判断字段


经过上面的操作,基本可以使数据库正常响应新的连接请求。至此,可以说“ORA-00020:超出最大连接数”故障已经得到解决。但故障的背后往往隐藏着隐患。除了由于操作不规范造成故障,那么有没有预防的方法呢?


02  适当优化


如上所述,通过类似windows任务管理器查杀占用过高的进程的方法,杀掉Oracle数据库中多余的进程去消除故障。那么对于典型高校的校级数据平台场景,是否有主动预防的相关技术手段呢?当然可以,可以通过修改数据库系统参数来适当扩大数据库允许连接进程的上限数值。通过下述命令可以修改:

技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”


上图显示并没有修改成功,因为该参数需重启数据库生效


在高校中,可以选取一个合适的停机窗口重启数据库使这个参数生效,从而增加数据库连接数被占满的周期。


技术栈|有了这三步,再也不担心“ORA-00020:超出最大连接数”


数据库连接进程数上限已经修改生效


————————————————————————————————————————————


03  后续预防


通过修改参数增加数据库连接最大限制数参数就高枕无忧了?调试窗口、程序连接等操作如果长时间不释放,日积月累调整后的连接限制迟早也会被占满。这里提供一种动态监控自动释放长时间不用的数据库连接的方式。


修改数据库sqlnet配置,oracle 11g 默认在/oracle/product/11.2.0/network/admin/下没有sqlnet.ora文件,从samples目录复制sqlnet.ora文件到/oracle/product/11.2.0/net-work/admin/路径下,在复制的文件中添加配置SQLNET.EXPIRE_TIME=20并保存,设置非活动会话超过20分钟即自动断开。通过这个配置,可以达到定期清理非活动会话,从而减少会话产生的对进程数上限的占用问题。



总结



“ORA-00020:超出最大连接数”错误可以从三个层面去解决:


● 首先,利用经验和技术“查杀”不必要的数据库进程,解决当务之急;

● 其次,从数据库规模、使用范围及日常压力判断,修改数据库参数到一个合理的值;

● 最后,使用监听技术来加固数据库连接的持有条件,从而彻底避免数据库连接“只增不减”的情况。



上述例子说明,数据库不是一经部署就可以长久使用的,就像一辆汽车,在使用过程中需要不断排障和保养,数据库需要在日常中不断发现问题、解决问题。从应急处理,到优化技术再到建立动态防护机制多个层面,关注数据库的运行情况,避免由于底层软件错误导致的上层业务中断。