<p>su - oracle才能真正加载Oracle用户环境变量,因su仅切换UID而不读取.bash_profile;必须正确配置ORACLE_HOME、PATH(含$ORACLE_HOME/bin)和LD_LIBRARY_PATH三者,并source生效后验证which sqlplus等三步。</p>

su oracle 不等于登录 oracle 用户
直接运行 su oracle 只切换了 UID,但不会加载目标用户的 shell 初始化文件(比如 .bash_profile),当前会话的 PATH、ORACLE_HOME 等变量全还是原用户的。所以 echo $ORACLE_HOME 是空的,which sqlplus 找不到,自然报 bash: sqlplus: command not found。
真正等效于“用 oracle 用户登录”的命令是:
-
su - oracle(注意短横线)—— 启动 login shell,读取~oracle/.bash_profile - 或直接 SSH 登录:
ssh oracle@localhost
三个环境变量缺一不可
sqlplus 能跑起来,依赖三个变量严格配对:
-
ORACLE_HOME:必须指向真实安装路径,如/u01/app/oracle/product/19c/dbhome_1;末尾不能带/,大小写敏感 -
PATH:必须包含$ORACLE_HOME/bin,且建议放在最前面,避免被其他同名命令覆盖 -
LD_LIBRARY_PATH:尤其对 Instant Client 或 19c+ 版本关键,否则sqlplus启动时会卡在libclntsh.so: cannot open shared object file
只设 ORACLE_HOME 是不够的——bash 根本不看它,只认 PATH 里有没有可执行文件。
.bash_profile 和 .bashrc 的加载时机差异
Oracle 推荐把变量写进 ~oracle/.bash_profile,不是 .bashrc,原因很实际:
-
.bash_profile只在 login shell(如su - oracle、SSH 登录)时执行一次,适合放一次性初始化变量 -
.bashrc在每次新开非登录 shell(比如终端里再开个 tab)时都执行,容易重复追加PATH导致膨胀 - 如果你写了
.bash_profile却忘了source ~/.bashrc,那里面定义的 alias 或函数就用不了
改完记得 source ~/.bash_profile,否则当前会话还是旧环境。
验证是否真生效,别只信 echo
光看 echo $ORACLE_HOME 成功没用,得走三步确认:
- 运行
which sqlplus—— 输出应为$ORACLE_HOME/bin/sqlplus,不是/usr/bin/sqlplus或空 - 运行
ldd $(which sqlplus) | grep clnt—— 应能定位到libclntsh.so,否则LD_LIBRARY_PATH没起作用 - 运行
sqlplus /nolog—— 能进入 SQL*Plus 提示符SQL>才算真正通了
最容易被跳过的点:用 su oracle 切过去后,以为改了 .bash_profile 就行——其实它根本没被读,连 source 都没机会执行。


















