
好的,我们来详细解析 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 参数的设置来创建调度进程,但参数中指定的网络协议无法被识别或初始化。这阻止了共享服务器架构的正常启动,可能导致实例启动失败或调度进程无法正常工作。
产生错误的场景与原因
典型场景:
此错误几乎总是在修改数据库的初始化参数文件(PFILE 或 SPFILE)中的 DISPATCHERS 参数之后,重启数据库实例时发生。
具体原因与示例:
-
协议拼写错误或使用废弃协议:
在DISPATCHERS参数中错误地拼写了协议名称,或者使用了当前版本已不再支持的古老协议。错误示例:
-- 在参数文件中: dispatchers="(PROTOCOL=TCPS)" -- 错误拼写,应为 TCP -- 或者使用了可能不支持的协议,如 SPX、DECNET 等 dispatchers="(PROTOCOL=XYZ)" -- XYZ 是一个无效的协议标识符实例启动时,会因无法识别
TCPS或XYZ协议而抛出 ORA-00105。 -
协议未安装或未启用:
指定的协议在操作系统层面未被安装或配置。例如,在未配置 IPC(进程间通信)的系统中指定IPC协议,或者在未正确安装 TCP/IP 协议栈的系统上指定TCP。错误示例:
dispatchers="(PROTOCOL=IPC)(KEY=mysid)"如果操作系统不支持或未配置 IPC,此设置将失败。
-
参数语法错误:
DISPATCHERS参数的字符串格式不正确,导致解析失败,可能被误认为是协议问题。错误示例:
dispatchers="(PROTOCOL=TCP" -- 缺少 closing parenthesis (括号未闭合)
相关原理
- 共享服务器架构 (Shared Server Architecture):一种可选的数据库操作模式。与默认的专有服务器(一个客户端连接对应一个服务器进程)不同,共享服务器使用调度进程(Dispatcher)作为中间层。多个客户端连接共享一个由共享服务器进程(Shared Server Processes)组成的池。调度进程负责接收客户端请求并将其放入一个公共请求队列,空闲的共享服务器进程从队列中取出并处理请求。
- 调度进程 (Dispatcher Process -
Dnnn):共享服务器架构的核心组件。它就像一个接线员,监听一个或多个网络地址/端口,等待客户端连接。每个调度进程都绑定到一个特定的网络协议(如 TCP/IP)。 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 时(通常在启动实例的警报日志中看到),诊断过程如下:
-
检查警报日志 (Alert Log):
这是首要步骤。警报日志会记录实例启动过程的详细信息,包括解析DISPATCHERS参数失败和抛出 ORA-00105 错误的具体行。# 连接到服务器,查看警报日志尾部 tail -100f $ORACLE_BASE/diag/rdbms/<dbname>/<instance name>/trace/alert_<instance name>.log -
审查
DISPATCHERS参数:
从当前使用的参数文件(SPFILE或PFILE)中获取DISPATCHERS参数的当前设置。-- 如果实例能启动到nomount状态,可以查询 SQL> SHOW PARAMETER dispatchers; -- 或者直接查看spfile或pfile内容 -
验证协议名称:
核对PROTOCOL=后面跟的值。对于绝大多数现代系统,TCP是唯一需要使用的协议。确保拼写完全正确。 -
检查操作系统协议支持:
确保指定的协议在操作系统层面已安装且可用。例如,对于TCP,基本的网络功能必须是正常的。
解决方案与步骤
解决此错误的流程是:修正 DISPATCHERS 参数 -> 重启实例。
步骤与示例:
方案 1: 修正协议名称(最常见解决方案)
-
连接到实例(如果可能):如果实例因为此错误而无法启动,你需要先使用一个基本的 PFILE 启动到 nomount 状态,或者修改 SPFILE。
SQL> STARTUP NOMOUNT PFILE='/tmp/init_temp.ora'; -- 使用一个简单的pfile先启动 -
修正
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参数。
- 如果使用 SPFILE:
-
使用标准 TCP 协议:
将参数设置为最通用和可靠的值。通常不需要指定复杂的地址,除非有特殊需求。ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)' SCOPE=SPFILE;或者,如果你想配置多个调度进程或更多属性:
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=2)' SCOPE=SPFILE;
方案 2: 完全禁用共享服务器(临时方案)
如果问题无法立即解决,并且你需要快速启动实例,可以临时禁用共享服务器。
-
将
SHARED_SERVERS参数设置为 0:-- 如果实例能启动到nomount状态 ALTER SYSTEM SET shared_servers=0 SCOPE=SPFILE;这将 effectively 使
DISPATCHERS参数失效,因为如果没有共享服务器,就不需要调度进程。 -
重启实例:
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 初始化参数中指定了一个无效或不受支持的网络协议。
解决此错误的关键在于:
- 检查警报日志:定位错误的准确来源。
- 审查参数:仔细检查
DISPATCHERS参数的语法和PROTOCOL属性的值。 - 使用标准协议:确保协议名称拼写正确(绝大多数情况下应使用
TCP)。 - 重启实例:修正参数后,必须重启数据库实例才能使更改生效。
对于DBA而言,这是一个重要的提醒:在修改关键初始化参数(尤其是与内存和进程架构相关的参数)时,必须谨慎并确保语法和值的正确性,最好在测试环境中进行验证后再应用到生产系统。
欢迎关注我的公众号《IT小Chen》
6570

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



