ORA-12154根本原因是Navicat 17不读取系统TNS_ADMIN环境变量,必须手动指定Instant Client根目录路径,使其自动定位network\admin\tnsnames.ora文件,且服务名须严格匹配该文件中等号左侧的大小写敏感别名。

Navicat 17 默认不读取系统级 TNS_ADMIN 下的 tnsnames.ora,必须手动指定 OCI 路径并确保该路径下存在有效 TNS 文件,否则 TNS 连接方式直接失效。
为什么 Navicat 17 的 TNS 连接总是报 ORA-12154
根本原因不是数据库没起来,也不是服务名写错,而是 Navicat 没找到 tnsnames.ora —— 它压根不看系统环境变量 TNS_ADMIN。哪怕你已配置 TNS_ADMIN=C:\oracle\network\admin,Navicat 17 也不会自动加载那个目录下的文件。
常见错误现象:
- 在 Navicat 新建连接时选择
TNS类型,下拉列表为空 - 手动输入服务名后点击测试,报
ORA-12154: TNS:could not resolve the connect identifier specified - 用 SQL*Plus 命令行能连通同一服务名,但 Navicat 不行
解决思路:把 tnsnames.ora 放到 Navicat 明确会扫描的路径里,并通过 OCI 配置指向它。
必须把 tnsnames.ora 放进 Instant Client 目录
Navicat 17 只会在你指定的 OCI 库所在目录(或其同级 network\admin 子目录)里找 tnsnames.ora。不能靠环境变量“引导”,必须物理路径对得上。
实操步骤:
- 下载 Oracle Instant Client Basic(版本需匹配远程 Oracle 12c,推荐
12.1.0.2.0或12.2.0.1.0) - 解压到无中文、无空格路径,例如
C:\oracle\instantclient_12_1 - 在该目录下新建子目录
network\admin - 把你的
tnsnames.ora文件复制进去(注意:不是放系统级%ORACLE_HOME%\network\admin) - 确认文件内容格式正确,尤其注意括号嵌套和换行,例如集群服务名应类似:
ORCL_RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = scan.example.com)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
(FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5))
)
)
其中 scan.example.com 是 RAC 的 SCAN 地址,SERVICE_NAME 必须与远程集群实际注册的服务名一致(可用 srvctl config service -d orcl 在数据库服务器上确认)。
OCI 配置必须指向 Instant Client 根目录,且版本严格匹配
Navicat 17 的 OCI 设置位置是:工具 → 选项 → 环境 → OCI。这里填的不是 oci.dll 全路径,而是 Instant Client 的根目录路径(不含 oci.dll 文件名)。
关键细节:
-
OCI library输入框填的是目录,例如C:\oracle\instantclient_12_1(结尾不加反斜杠) - Navicat 会自动在该路径下找
oci.dll和network\admin\tnsnames.ora - 如果远程是 Oracle 12.1.0.x,就别用 19c 的 Instant Client;版本错配会导致
Cannot create oci environment或静默失败 - 64 位 Navicat 必须配 64 位 Instant Client,混用必报
Access violation
填完必须重启 Navicat,否则设置不生效。
连接时选 TNS 类型,服务名必须与 tnsnames.ora 顶层别名完全一致
不是 SERVICE_NAME 值,而是 tnsnames.ora 中等号左边那个名字。比如上面示例中,Navicat 连接窗口的 TNS Service Name 字段必须填 ORCL_RAC,而不是 orcl。
容易被忽略的点:
- RAC 集群通常有多个监听地址,
tnsnames.ora中的HOST应填 SCAN 地址(如scan.example.com),而非单个节点 IP - 如果集群启用了透明应用故障转移(TAF),
FAILOVER_MODE参数要显式配置,否则 Navicat 在节点宕机时不会自动重连 - 防火墙必须放行 SCAN 地址的 1521 端口,且云服务器安全组规则要同步开通
配置完成后,测试连接前先用命令行验证:tnsping ORCL_RAC(在 Instant Client 目录下执行)。通了再进 Navicat,不然问题一定出在本地解析环节,跟 Navicat 本身无关。


















