ORA-12545错误本质是客户端无法解析tnsnames.ora中HOST值对应的主机名,首要排查hosts文件是否漏配目标服务器IP与主机名映射,确保其与tnsnames.ora及listener.ora中的HOST字段完全一致,并建议优先使用IP直连以规避解析风险。
Navicat连Oracle报ORA-12545,先查hosts文件是否漏配
ora-12545不是网络不通,而是客户端根本“找不到主机名”——它尝试用dns解析tnsnames.ora里写的host值,但失败了。这时候hosts文件就是第一道补救防线。
Windows路径是C:\WINDOWS\system32\drivers\etc\hosts,Linux/macOS是/etc/hosts。打开后检查有没有把数据库服务器的IP和主机名对上:
- 如果
tnsnames.ora里写的是HOST = oradb-srv,那hosts里必须有类似192.168.1.100 oradb-srv这一行 - 如果数据库用了VIP或RAC节点名(比如
oradb1-vip、oradb2),这些名字也得一一列在hosts里,不能只写主节点名 - 别忘了检查换行符:Windows下用CRLF,Linux/macOS用LF;混用可能导致某一行被忽略
- 改完保存后,不需要重启Navicat,但建议清掉本地DNS缓存:
ipconfig /flushdns(Windows)或sudo dscacheutil -flushcache(macOS)
tnsnames.ora和listener.ora里的HOST值不一致会直接触发ORA-12545
这两个文件的HOST字段必须指向同一个可解析的标识——要么全是IP,要么全是能被hosts或DNS解析的主机名。常见错法:
-
listener.ora写HOST = mypc,而tnsnames.ora写HOST = mypc.local,系统不认为这是同一个主机 - 重命名过电脑后,
listener.ora还留着旧主机名(如OLD-PC),但tnsnames.ora已更新为NEW-PC,监听器启动时绑定失败,客户端连过去就报ORA-12545 - 用IP更稳妥,但注意:如果服务器有多网卡,
HOST = 0.0.0.0或HOST = 127.0.0.1会导致监听只绑本地回环,外部客户端连不上
验证方式:在服务端执行lsnrctl status,看输出里Listening Endpoints Summary...下面列出的地址,是否和tnsnames.ora里写的完全一致(包括大小写和域名后缀)。
Navicat连接串绕过tnsnames.ora时,HOST字段仍受hosts约束
很多人以为Navicat里直接填IP就万事大吉,其实不然。如果你在Navicat连接配置中选择“Basic”模式并手动输入Host/Port/Service Name,那HOST字段填的是主机名(比如oradb)而不是IP,此时依然会走hosts或DNS解析——填错或没配,照样ORA-12545。
- 最保险的做法:Host栏直接填IP(如
192.168.1.100),Service Name填对(如ORCL),Port保持1521 - 如果必须用主机名,确认该主机名在Navicat所在机器上能
ping通且nslookup返回正确IP - 注意Navicat版本差异:老版本(如12.x)对空格、特殊字符更敏感,
tnsnames.ora路径含中文或空格可能导致加载失败,间接让连接退化成纯主机名解析逻辑
监听服务起来了,但tnsping通不过,大概率是hosts没生效或监听没真正监听那个地址
tnsping是验证客户端到监听器通路最轻量的方式。如果tnsping ORCL报ORA-12545,说明问题出在客户端解析或网络层,而非数据库实例本身。
- 运行
tnsping ORCL后,第一行会显示“Attempting to contact...”,后面跟一个地址,例如(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=ORCL))(ADDRESS=(PROTOCOL=TCP)(HOST=oradb)(PORT=1521)))——这个HOST=oradb就是你要去hosts里核对的目标 - 如果
tnsping显示的是HOST=127.0.0.1,但你的Navicat连的是远程服务器,说明tnsnames.ora被Navicat读错了位置,或者Navicat用了内置TNS配置而非你预期的那个 - 监听器日志(
$ORACLE_HOME/network/log/listener.log)里若出现TNS-12545或no address associated with hostname,基本坐实是主机名解析失败,不是端口或防火墙问题
复杂点在于:同一台机器上可能装了多个Oracle Home,Navicat默认读取的是环境变量TNS_ADMIN指向的目录,而不是你印象中那个product/11.2.0/db_1下的tnsnames.ora。改了文件却没效果,八成是改错了地方。











