ora-12528是监听器对未注册服务的正常拒绝,非故障;备库nomount/mount时pmon未注册导致blocked;客户端tnsnames.ora加(ur=a)可绕过限制,或监听端静态注册sid。
ora-12528 根本不是监听“坏了”,而是监听在说:“实例现在只接受受限连接,你没带通行证,不放行。” 尤其在 data guard 备库处于 nomount 或 mount 状态时,这是正常行为——pmon 还没注册服务,动态监听默认拒绝新连接。
为什么备库连不上总报 ORA-12528
Oracle 11g 默认使用动态服务注册:PMON 进程在数据库 MOUNT 后才向监听器广播服务信息。而 DG 备库在 NOMOUNT(如 RMAN DUPLICATE 阶段)或刚启动的 MOUNT 状态下,PMON 未就绪,监听器查不到可用服务,就把所有连接标记为 BLOCKED ——lsnrctl status 里能看到 status BLOCKED。
- 这不是配置错误,是 Oracle 的设计逻辑:防止客户端连到未就绪的实例
- 主库一般不会出现,因为通常已
OPEN,PMON 已注册 -
tnsping成功但sqlplus /nolog连不上,就是典型表现
tnsnames.ora 加 (UR=A) 是最快解法
在客户端使用的连接别名里,显式告诉 Oracle:“我允许连接到尚未完全就绪的实例”。UR=A(UR = Unrestricted)绕过监听器的 BLOCKED 检查,直接尝试连接。
修改 $ORACLE_HOME/network/admin/tnsnames.ora 中对应备库条目:
WQSTBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = scldscan02)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = wqstby)
<font color="red">(UR = A)</font>
)
)
- 必须加在
CONNECT_DATA块内,位置无关,但不能漏括号 - 无需重启监听器或数据库,改完即生效
- 适用于所有客户端工具(SQL*Plus、RMAN、JDBC URL 中加
?UR=A) - 风险极低:只是放宽连接准入,后续权限、角色、语句执行仍受数据库控制
静态注册 listener.ora 是备库专用方案
如果备库长期处于 NOMOUNT/MOUNT(如物理备库维护窗口),或你无法修改所有客户端的 tnsnames.ora,就该在监听端硬编码服务信息。
编辑 $ORACLE_HOME/network/admin/listener.ora,补全 SID_LIST_LISTENER:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = wqstby)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = wqstby)
)
)
- 改完必须执行
lsnrctl reload(或stop+start)才生效 - 注意
SID_NAME必须和备库实际 SID 一致(查SELECT instance_name FROM v$instance;) - 静态注册后
lsnrctl status显示status UNKNOWN,属正常,不代表失败 - 别在主库滥用:主库
OPEN后若监听先于实例启动,会导致服务无法动态更新
别踩这些坑
很多人试了方法还不行,往往卡在细节:
- 改了
tnsnames.ora却没清客户端缓存:Java 应用需重启 JVM;SQL Developer 要重连或刷新连接列表 - 误以为
UR=A是服务端参数:它只在客户端连接串里起作用,监听器本身不识别这个字段 - 在 Windows 上用
net start OracleServiceXXX启动服务,却忘了监听器服务名通常是OracleOraDb11g_home1TNSListener,名称不匹配导致lsnrctl操作无效 - 看到
status BLOCKED就慌着shutdown abort:其实只要实例进程还在,加UR=A就能连上做ALTER DATABASE MOUNT,暴力重启反而延长恢复时间
真正关键的判断点只有一个:确认备库实例进程是否存活(ps -ef | grep ora_ 或 Windows 服务列表),只要进程在,UR=A 就是最轻量、最可靠的通关钥匙。











