Oracle数据库 ORA-00115 错误分析和解决

在这里插入图片描述

好的,我们来详细解析一下 ORA-00115 错误。这是一个与 Oracle 网络连接和会话中断相关的错误。


一、官方正式说明

1. 错误信息结构组成
  • 错误代码: ORA-00115
  • 错误消息: connection refused; incidentals unavailable
    • 中文翻译: 连接被拒绝;附属信息不可用
2. 错误原因

当客户端进程尝试与 Oracle 数据库服务器建立连接时,连接请求已到达服务器端的网络接收器(如监听器),但在建立会话的最终阶段,由于某种原因,服务器进程无法完成连接的建立。关键点在于“incidentals unavailable”,这表示服务器端缺少了建立会话所必需的某些关键信息或资源,导致连接被拒绝。

3. 发生场景

此错误通常发生在连接建立的最后阶段,可能的原因包括:

  1. 资源耗尽: 服务器操作系统层面的资源耗尽,如进程描述符(process descriptors)、内存或交换空间不足,导致无法 fork 出新的服务器进程(dedicated server)或无法为新的共享服务器进程分配资源。
  2. 内部错误: Oracle 服务器进程在初始化自身时发生内部错误,无法获取或初始化会话所需的“附属”数据结构。
  3. 环境问题: Oracle 软件的家目录 (ORACLE_HOME) 权限错误,或者某些关键的共享库(.so.dll 文件)丢失或损坏,导致新创建的服务器进程无法正常加载和运行。
  4. 极端负载: 数据库服务器正处于极端高负载状态,虽然监听器可以接收请求,但系统已无法承担创建新会话的开销。
4. 相关原理

Oracle 专用服务器(Dedicated Server)连接建立流程:

  1. 客户端联系监听器。
  2. 监听器验证请求并 fork 出一个新的操作系统进程(在Unix/Linux上)或线程(在Windows上)——这就是专用的服务器进程。
  3. 该新进程继承监听器的环境,并执行一系列复杂的初始化操作:加载 Oracle 内核库、分配内存、建立会话数据结构等。
  4. 初始化成功后,监听器将连接移交给这个新进程,客户端与之通信。

ORA-00115 错误的根本原理在于:上述流程在第 23 步失败。监听器成功收到了请求,但在创建或初始化那个专属于客户端的服务器进程时,由于缺乏资源或遇到内部错误,导致进程创建失败或初始化“附属信息”失败。因此,监听器只能向客户端返回一个“连接被拒绝”的消息。

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. 定位原因与分析过程

排查需要从操作系统和数据库两个层面进行:

  1. 检查操作系统资源(在数据库服务器上执行):

    • 内存和交换空间:
      free -h
      
      检查 available 内存和 swap 是否即将用尽。
    • 进程数限制: 检查当前进程数和用户级、系统级限制。
      ps -ef | grep -i oracle | wc -l  # 查看当前Oracle进程数
      ulimit -u                        # 查看当前用户可创建的最大进程数
      cat /proc/sys/kernel/pid_max     # 查看系统全局PID最大值
      
  2. 检查监听器日志: 监听器日志通常包含更详细的错误信息,甚至会记录操作系统的原始错误代码。

    • 定位日志文件:
      lsnrctl status | grep -i "listener log"
      
    • 查看日志尾部的最新错误:
      tail -100f <listener_log_file>
      

    在日志中寻找与 ORA-00115 同时出现的、更具体的错误信息。

  3. 检查数据库警报日志(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 掉一些空闲会话),或者向公司申请扩建客服部,增加更多小隔间(调整系统 ulimitkernel.pid_max)。
  • 如果办公用品用光了(内存耗尽): 赶紧去采购一批新的备忘录和笔(增加交换空间 SWAP),或者让客服们清理一下桌上没用的废纸(释放内存)。
  • 如果有客服一起身就晕倒(软件问题): 需要请公司的IT部门来检查一下客服的身体健康(检查 ORACLE_HOME 权限,重新链接软件),是不是得了什么病(软件库损坏)。

总结一下:
ORA-00115 是一个 “服务器端资源分配失败” 错误。它告诉你:“监听器收到了你的请求,但服务器那边已经挤爆了/出错了,实在没办法给你创建一条专属的连接通道了。” 排查这个错误的关键是登录到数据库服务器上,检查操作系统的资源(进程、内存)使用情况以及监听器的日志

欢迎关注我的公众号《IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值