Oracle 11g express edition报ORA-12505监听错误频繁复发求助
ORA-12505周期性报错排查解决方案
报错原理
ORA-12505本质是TNS监听程序的服务列表中,不存在你连接描述符中填写的SID,无需每次重装数据库,按以下步骤排查即可解决:
第一步:先确认监听服务状态
报错时无需立刻重装,先登录数据库所在服务器,执行监听状态查询命令:lsnrctl status
查看输出的Services Summary区块,确认是否存在你连接使用的SID对应的服务条目:
- 无对应条目:实例未成功向监听注册,走后续排查
- 有对应条目:检查你SQL Developer/ODBC配置的SID、IP、端口是否和监听输出一致,注意大小写敏感

第二步:修复动态注册异常
Oracle默认通过PMON进程自动向监听注册实例信息,注册失败是90%以上偶发ORA-12505的诱因:
- 登录数据库实例,执行命令查看本地监听配置参数:
show parameter local_listener - 如果参数值为空、或填写的监听地址/端口与实际监听配置不符,执行修改命令(替换成你实际的服务器IP、监听端口):
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.xxx.xxx)(PORT=1521))' scope=both; - 手动触发实例注册,无需重启实例:
alter system register;
等待10秒后再次执行lsnrctl status即可看到对应SID的服务条目。
第三步:定位周期性触发根因
每3天复发属于有规律的触发,优先排查以下场景:
- 检查服务器是否有每3天运行的定时任务,涉及重启监听、重启服务器、重置网络配置的操作
- 检查服务器IP是否为DHCP分配,是否每3天续租更换IP,导致
local_listener配置的旧IP失效 - 查看监听运行日志(默认路径
$ORACLE_BASE/diag/tnslsnr/[主机名]/listener/alert/log.xml),确认报错时间点是否有监听异常重启的记录
第四步:配置静态注册兜底
如果动态注册始终不稳定,直接配置静态注册即可彻底解决该问题:
- 打开监听配置文件
$ORACLE_HOME/network/admin/listener.ora,添加静态注册配置:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = 你的全局数据库名,可通过`show parameter db_name`查询) (ORACLE_HOME = 你的ORACLE_HOME绝对路径,例如/u01/app/oracle/product/19.0.0/dbhome_1) (SID_NAME = 你连接使用的SID) ) )
- 重载监听配置使修改生效:
lsnrctl reload
静态注册生效后,只要数据库实例处于启动状态,监听就会始终保留对应SID的服务条目,不会再出现识别不到SID的问题。
验证
配置完成后先在服务器本地测试连接:sqlplus 用户名/密码@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=服务器IP)(PORT=1521))(CONNECT_DATA=(SID=你的SID)))'
本地连接成功后,再更新SQL Developer、ODBC DSN的配置即可正常连接。
内容的提问来源于stack exchange,提问作者Ravi Teja
相关产品推荐
相关产品推荐

