ORA-12545根本原因是客户端无法解析SCAN返回的local_listener中的HOST名(如rac2-vip),而非网络或密码问题;需通过修改LOCAL_LISTENER为IP并执行ALTER SYSTEM REGISTER,或补全客户端hosts文件实现解析。

ORA-12545 不是网络不通,也不是密码错,而是客户端拿到了一个它解析不了的主机名(比如 rac2-vip 或 rac2),然后 DNS 或 /etc/hosts 里没有对应记录 —— 这才是根本原因。
为什么 tnsping 成功但 sqlplus 失败
tnsping 只校验 SCAN 或 VIP 的 IP 和端口是否可达,不关心后续重定向。RAC 实际连接分两步:先连 SCAN 监听器,再由 SCAN 返回某个节点的 local_listener 地址(含 HOST 字段)让客户端二次连接。如果这个 HOST 是短名(如 rac2)或 VIP 主机名(如 rac2-vip),而客户端没配解析,就直接报 ORA-12545。
- 查证方式:在客户端开启 SQL*Net trace(
TRACE_LEVEL_CLIENT=16),看 .trc 文件里nsc2addr返回的是 IP 还是主机名 - 常见现象:连接偶尔成功、偶尔失败,且成功时总连到同一个节点(说明只有一台的主机名被解析了)
- 不要只依赖
tnsping判断连接可用性
改 local_listener 参数(推荐首选)
让每个实例注册给 SCAN 的本地监听地址用 IP 而非主机名,从源头避免解析问题。
- 登录节点 1:
sqlplus / as sysdba,执行:ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.111)(PORT = 1521))' SID='orcl1'; - 登录节点 2:
sqlplus / as sysdba,执行:ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.112)(PORT = 1521))' SID='orcl2'; - 执行
ALTER SYSTEM REGISTER;强制重新注册(不用重启实例) - 验证:
lsnrctl services LISTENER_SCAN1,确认返回的Remote Server地址中 HOST 字段已是 IP
客户端 hosts 文件补全(临时/辅助手段)
仅当无法修改数据库参数时使用,但必须覆盖所有节点的 VIP、SCAN、节点名、私网名 —— 漏一项就可能失败。
- 编辑客户端
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows) - 至少添加:
192.168.2.111 rac1-vip192.168.2.112 rac2-vip192.168.2.200 rac-scan192.168.2.101 rac1192.168.2.102 rac2 - 注意:不能只写 VIP 解析而漏掉节点短名;Windows 下 hosts 修改后需清 DNS 缓存(
ipconfig /flushdns)
检查 remote_listener 和 listener_networks 是否干扰
这两个参数一般不需要动,但如果误配成主机名(尤其短名),也可能导致 SCAN 注册异常。
- 查当前值:
SHOW PARAMETER remote_listener,应为 SCAN 名(如rac-scan:1521)或 IP+端口,**不能是节点短名** -
SHOW PARAMETER listener_networks通常为空,若非空,确保其中 HOST 字段也用 IP - 误配示例:
remote_listener = 'rac2:1521'→ 必须改成'rac-scan:1521'或'192.168.2.200:1521'
最常被忽略的是:改完 local_listener 后忘记执行 ALTER SYSTEM REGISTER;,导致旧注册信息还在 SCAN 中缓存数分钟;另外,多个 RAC 节点必须各自独立设置 SID 对应的值,不能复用同一条命令。


















