
好的,我们来详细解析一下 ORA-00115 错误。这是一个与 Oracle 网络连接和会话中断相关的错误。
一、官方正式说明
1. 错误信息结构组成
- 错误代码:
ORA-00115 - 错误消息:
connection refused; incidentals unavailable- 中文翻译: 连接被拒绝;附属信息不可用
2. 错误原因
当客户端进程尝试与 Oracle 数据库服务器建立连接时,连接请求已到达服务器端的网络接收器(如监听器),但在建立会话的最终阶段,由于某种原因,服务器进程无法完成连接的建立。关键点在于“incidentals unavailable”,这表示服务器端缺少了建立会话所必需的某些关键信息或资源,导致连接被拒绝。
3. 发生场景
此错误通常发生在连接建立的最后阶段,可能的原因包括:
- 资源耗尽: 服务器操作系统层面的资源耗尽,如进程描述符(process descriptors)、内存或交换空间不足,导致无法 fork 出新的服务器进程(dedicated server)或无法为新的共享服务器进程分配资源。
- 内部错误: Oracle 服务器进程在初始化自身时发生内部错误,无法获取或初始化会话所需的“附属”数据结构。
- 环境问题: Oracle 软件的家目录 (
ORACLE_HOME) 权限错误,或者某些关键的共享库(.so或.dll文件)丢失或损坏,导致新创建的服务器进程无法正常加载和运行。 - 极端负载: 数据库服务器正处于极端高负载状态,虽然监听器可以接收请求,但系统已无法承担创建新会话的开销。
4. 相关原理
Oracle 专用服务器(Dedicated Server)连接建立流程:
- 客户端联系监听器。
- 监听器验证请求并 fork 出一个新的操作系统进程(在Unix/Linux上)或线程(在Windows上)——这就是专用的服务器进程。
- 该新进程继承监听器的环境,并执行一系列复杂的初始化操作:加载 Oracle 内核库、分配内存、建立会话数据结构等。
- 初始化成功后,监听器将连接移交给这个新进程,客户端与之通信。
ORA-00115 错误的根本原理在于:上述流程在第 2 或 3 步失败。监听器成功收到了请求,但在创建或初始化那个专属于客户端的服务器进程时,由于缺乏资源或遇到内部错误,导致进程创建失败或初始化“附属信息”失败。因此,监听器只能向客户端返回一个“连接被拒绝”的消息。
5. 相关联的其他 ORA-错误
- ORA-12500: TNS:监听程序无法启动专用服务器进程。这与 ORA-00115 非常相似,但 ORA-12500 通常更侧重于“启动”进程这个动作本身的失败。
- ORA-12518: TNS:监听程序无法分发客户端连接。通常发生在共享服务器(MTS)模式下,调度进程无法分配共享服务器进程。
- ORA-27100: 共享内存领域已存在。与内存资源相关。
- ORA-03113: 通信通道的文件结束。连接建立后因网络或服务器进程崩溃而中断。
- 操作系统错误: 如
Linux Error: 12: Cannot allocate memory,这些是导致 ORA-00115 的根本原因,有时会伴随出现。
6. 定位原因与分析过程
排查需要从操作系统和数据库两个层面进行:
-
检查操作系统资源(在数据库服务器上执行):
- 内存和交换空间:
检查free -havailable内存和swap是否即将用尽。 - 进程数限制: 检查当前进程数和用户级、系统级限制。
ps -ef | grep -i oracle | wc -l # 查看当前Oracle进程数 ulimit -u # 查看当前用户可创建的最大进程数 cat /proc/sys/kernel/pid_max # 查看系统全局PID最大值
- 内存和交换空间:
-
检查监听器日志: 监听器日志通常包含更详细的错误信息,甚至会记录操作系统的原始错误代码。
- 定位日志文件:
lsnrctl status | grep -i "listener log" - 查看日志尾部的最新错误:
tail -100f <listener_log_file>
在日志中寻找与 ORA-00115 同时出现的、更具体的错误信息。
- 定位日志文件:
-
检查数据库警报日志(Alert Log): 虽然此错误主要发生在连接阶段,但严重的系统资源问题也会在警报日志中体现。
- 定位警报日志:
SQL> SELECT value FROM v$diag_info WHERE name = 'Diag Trace'; - 查看日志:
tail -50f <alert_SID.log>
寻找关于内存分配失败、无法fork进程等记录。
- 定位警报日志:
7. 解决方案
根据分析结果采取相应措施:
-
场景一:操作系统资源耗尽
- 释放资源: 识别并终止一些非关键的系统进程或数据库会话(如使用
kill -9命令终止僵死的进程)。 - 增加资源: 临时增加交换空间(swap),或者为操作系统添加更多内存。
- 调整限制: 如果是
ulimit限制导致,修改/etc/security/limits.conf文件中 oracle 用户的设置,增加nproc(进程数)和nofile(文件描述符)的限制。
- 释放资源: 识别并终止一些非关键的系统进程或数据库会话(如使用
-
场景二:Oracle 软件或权限问题
- 检查
ORACLE_HOME目录及其下的bin,lib子目录的权限,确保 Oracle 软件所有者(通常是oracle用户)有读和执行权限。 - 使用 Oracle 的
relink all命令重新链接所有可执行文件和库,确保其完整性。
- 检查
-
场景三:高负载下的临时问题
- 稍等片刻,待系统负载下降后重试连接。
- 如果问题持续,考虑重启数据库实例(作为最后的手段)来释放所有资源。
8. 相关SQL语句
此错误发生在建立 SQL 连接之前,因此没有直接的解决方案 SQL。但一旦连接成功,可以查询资源使用情况:
- 查看当前会话数:
SELECT COUNT(*) FROM v$session; - 查看进程数:
SELECT COUNT(*) FROM v$process; - 查看资源限制(需要诊断权限):
SELECT * FROM v$resource_limit WHERE resource_name IN ('processes', 'sessions');
二、通俗易懂的讲解
我们再次使用“打电话”的比喻来理解这个错误。
想象一下:
- 你(客户端) 想给 Oracle公司(数据库服务器) 打电话。
- 你拨通了总机接线员(监听器Listener)。
- 接线员接到电话,说:“好的,我马上给您转接给一位专门的客服代表(专用服务器进程)来处理您的问题。”
现在,错误 ORA-00115 发生了:
错误场景: 接线员放下你的电话,赶紧跑去客服部的小隔间,准备叫醒一位空闲的客服代表来接电话。但是,她到了之后发现:
- 要么: 所有的小隔间都坐满了人,一个空闲的都没有了(操作系统进程数耗尽)。
- 要么: 她发现虽然有空隔间,但电话线、电脑、记事本这些“办公用品”(附属信息 - incidentals)都用光了,无法给新客服配置工位。
- 要么: 她好不容易找到一个客服,但那个客服一起身就突然晕倒了(服务器进程初始化失败,可能是软件bug或权限问题)。
接线员没办法,只能跑回来,无奈地告诉你:“ORA-00115:连接被拒绝!我们找不到能为您服务的客服,或者无法为他准备好办公用品!”
为什么会这样?
问题不是出在“找到接线员”(联系到监听器)这一步,而是出在“接线员为你分配专属客服”(监听器创建服务器进程)这一步。服务器那边已经“超载”或者“内部混乱”了,无法再接待新的客户。
如何解决?
- 如果客服部坐满了(进程数耗尽): 那就得让一些处理完业务的客服下班( kill 掉一些空闲会话),或者向公司申请扩建客服部,增加更多小隔间(调整系统
ulimit或kernel.pid_max)。 - 如果办公用品用光了(内存耗尽): 赶紧去采购一批新的备忘录和笔(增加交换空间 SWAP),或者让客服们清理一下桌上没用的废纸(释放内存)。
- 如果有客服一起身就晕倒(软件问题): 需要请公司的IT部门来检查一下客服的身体健康(检查
ORACLE_HOME权限,重新链接软件),是不是得了什么病(软件库损坏)。
总结一下:
ORA-00115 是一个 “服务器端资源分配失败” 错误。它告诉你:“监听器收到了你的请求,但服务器那边已经挤爆了/出错了,实在没办法给你创建一条专属的连接通道了。” 排查这个错误的关键是登录到数据库服务器上,检查操作系统的资源(进程、内存)使用情况以及监听器的日志。
欢迎关注我的公众号《IT小Chen》
516

被折叠的 条评论
为什么被折叠?



