ORA-12518:Oracle 监听程序无法分发客户端连接原因及解决方法

本文主要讲解ORA-12518:Oracle监听程序无法分发客户端连接的原因分析及解决方法。

问题描述

数据中台的同步任务有时会报错如下:

ORA-12518, TNS:listener could not hand off client connection。

意即Oracle监听程序无法分发客户端连接,

原因分析

只是有时候会报错,有时候又能成功执行,就可以排除监听配置错误的可能性,大概率是数据库当前的进程数或会话数已经达到设置的上限值,无法接收新的连接了,也可能是服务器内存或CPU资源耗尽,导致数据库无法创建新进程去响应连接。

进程数就是Oracle同时工作的进程数量,会话数就是Oracle同时接受的客户端连接的数量。

查询数据库的进程数上限:

SELECT value FROM v$parameter WHERE name = 'processes';

查询数据库的进会话数上限:

SELECT value FROM v$parameter WHERE name = 'sessions';

查询当前实际进程数:

SELECT COUNT(*) FROM v$process;

查询当前实际会话数:

SELECT COUNT(*) FROM v$session;

查询结果发现

实际进程数非常接近进程数上限值,实际会话数也很接近会话数上限值,而且检查发现Oracle服务器CPU和内存资源都还足够,说明是连接数达到上限了,需要调高上限值。

解决方法

Oracle默认的进程数和会话数上限分别是150和248,显然这是完全不够用的,应该根据实际项目规模来设置相应的进程数上限,

我这里把进程数上限改为1000:

ALTER SYSTEM SET processes=1000 SCOPE=spfile;

会话数上限会根据进程数上限自动计算,不用手动设置,一个进程可以对应多个会话,所以会话数一般高于进程数。

修改完成后需要重启数据库服务以使修改生效,打开运行窗口,输入 services.msc ,再按回车键,打开服务界面,先停止数据库服务和监听服务,再启动数据库服务和监听服务。

修改完进程数上限后,会话数上限也会根据换算关系自动调整过来,如下图,发现会话数上限已经变为1528了。

不同版本的Oracle数据库的会话数和进程数的换算关系有所区别,如下是目前的几种换算关系,从上到下不同的换算关系对应的版本越来越新。

1:会话数 = (进程数 * 1.1) + 5

2:会话数 = (进程数 * 1.5) + 22

3:会话数 = (进程数 * 1.5) + 28

后续观察发现中台同步任务没有再出现ORA-12518的报错了。

相关推荐
qq_2069013910 小时前
如何为 JSON 序列化中的不同浮点字段指定独立的小数精度
jvm·数据库·python
空中海10 小时前
Redis 原理深度解析:持久化 × 主从复制 × Sentinel × Cluster × 性能排查全攻略
数据库·redis·sentinel
AI-小柒10 小时前
磅上线!DataEyes 聚合平台正式接入 GPT-Image-2,开启多模态 AI 生成全新纪元
大数据·开发语言·数据库·人工智能·gpt·php
m0_5887584810 小时前
解决Navicat正向工程从模型建表报错怎么办_外键关联与语法解析
jvm·数据库·python
2501_9142459310 小时前
如何修复宝塔面板由于inode耗尽导致无法创建文件_清理海量小文件缓存与会话目录
jvm·数据库·python
Gauss松鼠会10 小时前
GaussDB for DWS 数据融合:Oracle数据迁移到GaussDB(DWS)
数据库·oracle·数据库开发·gaussdb
2401_8371638910 小时前
WordPress后台插件隐藏策略:仅对指定管理员显示特定插件
jvm·数据库·python
qq_1898070310 小时前
C++如何验证YAML语法格式是否正确_try-catch解析校验用法【实战】
jvm·数据库·python
财经汇报10 小时前
当“多级流转“占据六成版图——供应链金融的结构性迁移与产融结合新范式
大数据·数据库
zhangchaoxies10 小时前
c++如何读取YAML格式配置文件_yaml-cpp库快速入门【详解】
jvm·数据库·python