OCI.dll未加载是Navicat 17连Oracle 21c失败的主因,需手动指定与Navicat位数一致的Instant Client根路径,并确保含oci.dll等必要文件,重启后才生效。
OCI.dll没加载成功是主因
navicat 17 连 oracle 21c 失败,90% 情况下不是配置错,而是 oci.dll 根本没加载进来。它不读系统 path,也不自动扫描安装目录,必须手动指定 instant client 根路径。
- 先确认 Navicat 17 是 32-bit 还是 64-bit:Help → About,看标题栏末尾;必须和 Oracle Instant Client 位数严格一致
- 去 Oracle 官网 下载对应位数的
instantclient-basic-windows.x64-21.12.0.0.0dbru.zip(Oracle 21c 推荐用 21.12 版本) - 解压后路径里必须直接包含
oci.dll、oraocci21.dll、msvcr120.dll(或对应 VC 运行时),缺一个就可能报ORA-12154或闪退 - Navicat 中设置:工具 → 选项 → 环境 → OCI → 点“…”选到 Instant Client 解压后的**根目录**(例如
C:\oracle\instantclient_21_12),不是子文件夹,更不是oci.dll文件本身 - 改完必须彻底退出 Navicat(包括托盘进程),再重启,设置不热生效
tnsnames.ora 路径和内容常被忽略
Navicat 不走系统级 TNS_ADMIN,也不默认读取 Oracle 安装目录下的 tnsnames.ora,它只认自己配置的 OCI 路径下的 network\admin\tnsnames.ora。
- 在你指定的 Instant Client 根目录下,手动建
network\admin子目录(路径必须是instantclient_21_12\network\admin\tnsnames.ora) -
tnsnames.ora里服务名要和 Oracle 实际一致:查SELECT value FROM v$parameter WHERE name = 'service_names';,别填 IP 或域名;12c+ 默认区分大小写,ORCLPDB1和orclpdb1是两个东西 - Navicat 连接窗口中“服务名”字段填的就是这个文件里定义的 alias(比如
ORCLPDB1),不是 SID,也不是监听地址 - 如果只想连本地单实例且不想配 tns,可跳过
tnsnames.ora,直接在 Navicat 连接界面填 host/port/service name,但前提是 OCI 已正确加载
ORA-12170 超时?先确认监听真在跑
报 ORA-12170: TNS:connect timeout occurred,别急着调 Navicat,先上 Oracle 服务器敲命令:
- 执行
lsnrctl status:返回 “The listener is not currently running” 就直接lsnrctl start - 查监听端口:看
$ORACLE_HOME/network/admin/listener.ora里PORT值,默认是 1521,但可能被改成 1522 或其他 - 查端口是否真 LISTENING:
netstat -ano | findstr :1521(Windows)或netstat -an | grep 1521(Linux),确认绑定的是0.0.0.0:1521或具体 IP,不是127.0.0.1:1521(后者远程连不上) - Navicat 的 host 字段必须填数据库服务器对外可访问的真实 IP(如
192.168.5.100),不能填localhost或127.0.0.1 - 云服务器务必检查安全组,本地 Windows 防火墙也要放行对应端口;用
telnet 192.168.5.100 1521测试通不通,不通就卡在网络层
Navicat 17 和 Oracle 21c 的兼容性陷阱
Navicat 17 对 Oracle 21c 支持没问题,但容易栽在两个隐性细节上:
- Oracle 21c 默认启用可插拔数据库(PDB),新用户若建在 PDB 里(比如
ORCLPDB1),连接时必须指定 PDB 的 service_name,不能连 CDB root(CDB$ROOT)的服务名 - 密码策略更严:Oracle 21c 默认要求密码含大小写字母+数字+特殊字符,且长度 ≥8;用
ALTER USER username IDENTIFIED BY "MyPass123!"显式设密码,避免触发复杂度校验失败 - 如果 Navicat 启动时弹出 “Oracle library is not loaded”,说明 OCI 路径设置无效或 dll 缺失——此时
tnsnames.ora再对也没用,得倒回去重检第一步











