必须同时正确设置ORACLE_HOME、TNS_ADMIN、PATH(Windows)或LD_LIBRARY_PATH(Linux),三者缺一不可;ORACLE_HOME须指向Instant Client解压根目录,TNS_ADMIN须精确指向含tnsnames.ora的目录,PATH/LD_LIBRARY_PATH须包含$ORACLE_HOME且路径必须为绝对路径、无空格中文及符号链接。

ORACLE_HOME、TNS_ADMIN、PATH/LD_LIBRARY_PATH 这三个变量必须同时设对,缺一不可,且路径不能含空格或中文
ORACLE_HOME 必须指向解压后的 Instant Client 根目录
这不是数据库服务端的安装路径,而是你下载解压的 instantclient-basic 所在目录。比如 Windows 上解压到 D:\instantclient_23_5,Linux 上是 /u01/instantclient_23_5。PL/SQL Developer、Toad 等 GUI 工具依赖它定位 oci.dll 或 libclntsh.so;不设或设错,直接报 “Unable to load library oci.dll” 或 “cannot open shared object file”。
- Windows:
set ORACLE_HOME=D:\instantclient_23_5(命令行)或系统环境变量中添加 - Linux:
export ORACLE_HOME=/u01/instantclient_23_5,写入~/.bash_profile并source - macOS:
export ORACLE_HOME=/opt/oracle/instantclient_23_5,注意 23.5 尚未发布 macOS 包,当前只能用 23.3
TNS_ADMIN 必须精确指向含 tnsnames.ora 的目录
这个变量决定客户端去哪找连接别名配置。它和 ORACLE_HOME 可以不同,但必须是一个真实存在的、可读的目录,且该目录下必须有名为 tnsnames.ora 的文件(不是 tnsnames.ora.txt,也不能在子目录里)。
- 典型值:
$ORACLE_HOME/network/admin(Linux/macOS)或%ORACLE_HOME%\network\admin(Windows) - sqlplus
user/pass@MYDB报ORA-12154: TNS:could not resolve the connect identifier,90% 是因为TNS_ADMIN没设,或设了但tnsnames.ora不在该路径下 - 如果把
tnsnames.ora放在/etc/tnsnames.ora,就设TNS_ADMIN=/etc,而非/etc/tnsnames.ora
PATH(Windows)或 LD_LIBRARY_PATH(Linux)必须包含 $ORACLE_HOME
这是让系统能找到 OCI 动态库的关键。Windows 查 PATH,Linux 查 LD_LIBRARY_PATH,macOS 查 DYLD_LIBRARY_PATH ——漏掉任一平台对应变量,Python 的 oracledb 或 Java 的 JDBC 都会失败。
- Windows:
set PATH=%ORACLE_HOME%;%PATH%(oci.dll必须在PATH路径中) - Linux:
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH;Debian/Ubuntu 还得装libaio1,否则sqlplus启动即段错误 - macOS:
export DYLD_LIBRARY_PATH=$ORACLE_HOME:$DYLD_LIBRARY_PATH,否则报Library not loaded: libclntsh.dylib.23.1 - 注意:Linux 下不要只设
LD_LIBRARY_PATH而漏了ORACLE_HOME,有些工具(如 sqlplus)仍会因找不到sqlnet.ora报错
最容易被忽略的是:所有路径必须是**绝对路径**,且不能带符号链接(尤其在 Linux 容器或 NFS 挂载场景下)。临时用 echo $ORACLE_HOME 和 ls -l $TNS_ADMIN/tnsnames.ora 验证两步都输出有效结果,再试连接 —— 否则任何报错都只是表象,根子还在环境变量没落进实处。


















