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

在这里插入图片描述
好的,我们来详细解析 ORA-00105 错误。

📌 ORA-00105 错误详解

错误信息结构组成

标准的 ORA-00105 错误信息格式如下:

ORA-00105: network protocol not supported in dispatcher configuration

其结构可以分解为:

  • ORA-00105: Oracle 数据库错误的唯一标识码。
  • network protocol not supported: 错误的核心描述,表明尝试使用了一个不被支持的(或未配置的)网络协议。
  • in dispatcher configuration: 指明了错误发生的具体上下文,即在调度进程(Dispatcher)的配置中。这直接将错误与 Oracle 的共享服务器(Shared Server)架构相关联。

错误含义与官方解释

官方解释

  • 原因 (Cause): 在配置共享服务器(Shared Server,旧称 MTS - Multi-Threaded Server)环境时,DISPATCHERS 初始化参数中指定了一个当前 Oracle 版本或操作系统平台不支持的协议。调度进程是共享服务器架构的核心组件,负责接收客户端连接并将其请求路由到共享服务器进程。每个调度进程都配置为使用特定的网络协议进行监听。
  • 行动 (Action): 检查 DISPATCHERS 参数的语法,并确保指定的 PROTOCOL 属性是有效的、且被您的系统支持的有效协议(例如,TCP/IP)。

核心要点:这是一个共享服务器配置错误。它发生在数据库实例启动时,系统尝试根据 DISPATCHERS 参数的设置来创建调度进程,但参数中指定的网络协议无法被识别或初始化。这阻止了共享服务器架构的正常启动,可能导致实例启动失败或调度进程无法正常工作。

产生错误的场景与原因

典型场景
此错误几乎总是在修改数据库的初始化参数文件(PFILESPFILE)中的 DISPATCHERS 参数之后,重启数据库实例时发生。

具体原因与示例

  1. 协议拼写错误或使用废弃协议
    DISPATCHERS 参数中错误地拼写了协议名称,或者使用了当前版本已不再支持的古老协议。

    错误示例

    -- 在参数文件中:
    dispatchers="(PROTOCOL=TCPS)" -- 错误拼写,应为 TCP
    -- 或者使用了可能不支持的协议,如 SPX、DECNET 等
    dispatchers="(PROTOCOL=XYZ)" -- XYZ 是一个无效的协议标识符
    

    实例启动时,会因无法识别 TCPSXYZ 协议而抛出 ORA-00105。

  2. 协议未安装或未启用
    指定的协议在操作系统层面未被安装或配置。例如,在未配置 IPC(进程间通信)的系统中指定 IPC 协议,或者在未正确安装 TCP/IP 协议栈的系统上指定 TCP

    错误示例

    dispatchers="(PROTOCOL=IPC)(KEY=mysid)"
    

    如果操作系统不支持或未配置 IPC,此设置将失败。

  3. 参数语法错误
    DISPATCHERS 参数的字符串格式不正确,导致解析失败,可能被误认为是协议问题。

    错误示例

    dispatchers="(PROTOCOL=TCP" -- 缺少 closing parenthesis (括号未闭合)
    

相关原理

  1. 共享服务器架构 (Shared Server Architecture):一种可选的数据库操作模式。与默认的专有服务器(一个客户端连接对应一个服务器进程)不同,共享服务器使用调度进程(Dispatcher)作为中间层。多个客户端连接共享一个由共享服务器进程(Shared Server Processes)组成的池。调度进程负责接收客户端请求并将其放入一个公共请求队列,空闲的共享服务器进程从队列中取出并处理请求。
  2. 调度进程 (Dispatcher Process - Dnnn):共享服务器架构的核心组件。它就像一个接线员,监听一个或多个网络地址/端口,等待客户端连接。每个调度进程都绑定到一个特定的网络协议(如 TCP/IP)。
  3. DISPATCHERS 参数:此参数控制共享服务器环境的配置。它定义了:
    • 要启动的调度进程的数量 (DISPATCHERS="2")
    • 调度进程使用的协议 (PROTOCOL=TCP)
    • 监听地址和端口 (ADDRESS, PORT, LISTENER)
    • 其他属性 (SESSIONS, CONNECTIONS, SERVICE, MULTIPLEX)
      实例启动时,会根据此参数创建指定数量和配置的调度进程。

相关联的其他 ORA 错误

在处理共享服务器配置和网络连接时,您可能会遇到相关错误:

  • ORA-00101: system parameter string is inconsistent: 之前讨论过,与 DB_DOMAIN 配置有关,但有时配置错误也可能间接影响监听。
  • ORA-00102: network protocol cannot use dispatcher in SHARED mode: 与协议和模式不兼容有关,但发生在客户端连接时,而非实例启动时。
  • ORA-00103: invalid character …: 参数值中的无效字符可能导致解析失败。
  • ORA-12541: TNS:no listener: 如果调度进程因配置错误而未能成功启动,客户端将无法连接,可能收到此错误。

问题定位与诊断分析

当遇到 ORA-00105 时(通常在启动实例的警报日志中看到),诊断过程如下:

  1. 检查警报日志 (Alert Log)
    这是首要步骤。警报日志会记录实例启动过程的详细信息,包括解析 DISPATCHERS 参数失败和抛出 ORA-00105 错误的具体行。

    # 连接到服务器,查看警报日志尾部
    tail -100f $ORACLE_BASE/diag/rdbms/<dbname>/<instance name>/trace/alert_<instance name>.log
    
  2. 审查 DISPATCHERS 参数
    从当前使用的参数文件(SPFILEPFILE)中获取 DISPATCHERS 参数的当前设置。

    -- 如果实例能启动到nomount状态,可以查询
    SQL> SHOW PARAMETER dispatchers;
    
    -- 或者直接查看spfile或pfile内容
    
  3. 验证协议名称
    核对 PROTOCOL= 后面跟的值。对于绝大多数现代系统,TCP 是唯一需要使用的协议。确保拼写完全正确。

  4. 检查操作系统协议支持
    确保指定的协议在操作系统层面已安装且可用。例如,对于 TCP,基本的网络功能必须是正常的。

解决方案与步骤

解决此错误的流程是:修正 DISPATCHERS 参数 -> 重启实例

步骤与示例

方案 1: 修正协议名称(最常见解决方案)

  1. 连接到实例(如果可能):如果实例因为此错误而无法启动,你需要先使用一个基本的 PFILE 启动到 nomount 状态,或者修改 SPFILE。

    SQL> STARTUP NOMOUNT PFILE='/tmp/init_temp.ora'; -- 使用一个简单的pfile先启动
    
  2. 修正 DISPATCHERS 参数

    • 如果使用 SPFILE
      -- 先创建一个PFILE来自SPFILE以便编辑
      SQL> CREATE PFILE='/tmp/pfile_from_spfile.ora' FROM SPFILE;
      -- 退出SQL*Plus,编辑 /tmp/pfile_from_spfile.ora 文件
      -- 找到 DISPATCHERS 参数行,将其修正为最通用可靠的设置:
      dispatchers="(PROTOCOL=TCP)"
      -- 然后从修正后的PFILE重新创建SPFILE
      SQL> CREATE SPFILE FROM PFILE='/tmp/pfile_from_spfile.ora';
      -- 关闭实例并重新启动
      SQL> SHUTDOWN IMMEDIATE;
      SQL> STARTUP;
      
    • 如果使用 PFILE:直接编辑 PFILE 文件,修正 DISPATCHERS 参数。
  3. 使用标准 TCP 协议
    将参数设置为最通用和可靠的值。通常不需要指定复杂的地址,除非有特殊需求。

    ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)' SCOPE=SPFILE;
    

    或者,如果你想配置多个调度进程或更多属性:

    ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=2)' SCOPE=SPFILE;
    

方案 2: 完全禁用共享服务器(临时方案)

如果问题无法立即解决,并且你需要快速启动实例,可以临时禁用共享服务器。

  1. SHARED_SERVERS 参数设置为 0

    -- 如果实例能启动到nomount状态
    ALTER SYSTEM SET shared_servers=0 SCOPE=SPFILE;
    

    这将 effectively 使 DISPATCHERS 参数失效,因为如果没有共享服务器,就不需要调度进程。

  2. 重启实例

    SHUTDOWN IMMEDIATE;
    STARTUP;
    

    实例将以纯专有服务器模式启动。之后你可以再从容地研究和解决 DISPATCHERS 的配置问题。

通俗易懂的解释

想象一下数据库的共享服务器模式是一个大型公司的总机呼叫中心

  • 调度进程 (Dispatcher):就是呼叫中心里的接线员
  • 网络协议 (Protocol):就是接线员可以使用的电话线类型,比如数字线路、模拟线路、IP电话线路等。
  • DISPATCHERS 参数:就是你在给呼叫中心采购设备时的订单。你在订单上写明:“请配备3个使用IP电话协议的接线员”。

ORA-00105 错误的发生就相当于:
公司的IT部门收到你的订单后,发现你订购的是一种叫做 “量子超光速通信协议” 的电话线。
IT部门懵了,他们回复说:“错误!(ORA-00105) 您配置的‘量子超光速协议’在我们的呼叫中心系统里根本不支持!

要么是你把协议名写错了(把 TCP 错写成 TCPS),要么是你异想天开指定了一个公司根本没采购过的技术。

解决办法就是:
修改你的设备订单(修改 DISPATCHERS 参数),把电话线类型改成公司确实拥有且支持的、最标准的 “IP电话协议”(即 TCP 协议)。
然后让呼叫中心根据新订单重新配置(重启数据库实例)。

如果呼叫中心急着开业,你可以临时决定:“先别管呼叫中心了,让所有客户都直接打销售员的手机吧”。这就是通过设置 shared_servers=0暂时禁用共享服务器,让所有连接都走专有服务器模式。

总结

ORA-00105 是一个数据库实例启动时的配置错误,特指在配置共享服务器(Shared Server)架构时,在 DISPATCHERS 初始化参数中指定了一个无效或不受支持的网络协议。

解决此错误的关键在于:

  1. 检查警报日志:定位错误的准确来源。
  2. 审查参数:仔细检查 DISPATCHERS 参数的语法和 PROTOCOL 属性的值。
  3. 使用标准协议:确保协议名称拼写正确(绝大多数情况下应使用 TCP)。
  4. 重启实例:修正参数后,必须重启数据库实例才能使更改生效。

对于DBA而言,这是一个重要的提醒:在修改关键初始化参数(尤其是与内存和进程架构相关的参数)时,必须谨慎并确保语法和值的正确性,最好在测试环境中进行验证后再应用到生产系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值