根本原因是path未包含$oracle_home/bin,导致shell无法定位sqlplus;必须正确设置oracle_home、path和ld_library_path三个变量,并写入.bash_profile后source生效。
为什么 sqlplus 报 command not found
根本原因不是 oracle 没装好,而是 shell 根本没去 sqlplus 所在的目录里找它。bash 只会在 path 环境变量列出的路径中逐个搜索命令,而 oracle 的 bin 目录默认不在其中。
必须设置的三个环境变量
缺一不可,顺序和值都影响后续行为:
-
ORACLE_HOME:必须指向真实安装路径,比如/u01/app/oracle/product/19c/dbhome_1或/opt/oracle/instantclient_21_12;路径末尾不能带斜杠,也不能写错大小写 -
PATH:要把$ORACLE_HOME/bin放到最前面或至少靠前位置,否则系统可能优先用其他同名命令(比如旧版本或冲突工具) -
LD_LIBRARY_PATH:尤其对 Instant Client 或 19c+ 版本关键,否则sqlplus启动时会报libclntsh.so: cannot open shared object file
配置文件选 .bash_profile 还是 .bashrc
如果你用的是普通登录终端(比如 SSH 登录、图形界面打开终端),.bash_profile 是首选;它只在登录 shell 中读取一次,适合放一次性初始化的环境变量。
常见错误包括:
- 把变量写进
.bashrc却用 SSH 登录——此时.bashrc不自动执行 - 写了
.bash_profile但忘了加source ~/.bashrc段落,导致别名或函数失效 - 改完文件后没运行
source ~/.bash_profile,以为重启终端就生效(其实只对新终端有效,当前会话仍无变量)
验证是否真的生效
别只信 echo $ORACLE_HOME,要分步确认:
- 运行
which sqlplus—— 应该输出类似/u01/app/oracle/product/19c/dbhome_1/bin/sqlplus - 运行
ldd $(which sqlplus) | grep clnt—— 应该能定位到libclntsh.so,否则LD_LIBRARY_PATH没起作用 - 运行
sqlplus /nolog—— 成功进入 SQL*Plus 提示符才算真正通了
容易被忽略的一点:如果用 su oracle 切换用户但没加 -(即 su - oracle),则不会加载目标用户的 .bash_profile,变量依然为空。











