Ubuntu 22.04 上安装 Oracle 19c 客户端可行且简单,只需正确下载 Instant Client(Basic+SDK)、解压、配置 ORACLE_HOME 和 LD_LIBRARY_PATH,并解决 libnsl.so.1 等动态库依赖(如 apt install libnsl1),最后用 sqlplus 或 oracledb 验证连接。

Ubuntu 22.04 上安装 Oracle 19c 客户端是可行的,且比服务端安装简单得多——它不涉及内核参数、用户组、DISPLAY 或编译问题,只需正确下载、解压、配置环境变量并解决动态库依赖。
为什么 sqlplus 报错 DPI-1047 或 libclntsh.so: cannot open shared object file
这是最常见现象,本质是系统找不到 Oracle 客户端核心库 libclntsh.so。Ubuntu 不自带该库,也**不会通过 apt install 自动装上**;即使你用 dpkg -i 装了第三方 .deb 包,也可能因版本错配或路径未注册而失效。
-
ldd /opt/oracle/instantclient_19_8/libclntsh.so会暴露缺失的底层依赖(如libaio.so.1、libnsl.so.1) - Ubuntu 22.04 默认不含
libnsl.so.1(被libnsl.so.2取代),必须手动软链或装兼容包:sudo apt install libnsl1 -
libaio1是必需的,但仅装libaio1不够,某些场景需libaio1:i386(尤其连接 32 位应用时)
instantclient-basic-linux.x64-19.22.0.0.0.zip 解压后怎么设环境变量才生效
Oracle Instant Client 是纯解压即用型,但环境变量必须对所有调用它的进程可见——尤其是你用 Python 的 cx_Oracle 或 oracledb 时,shell 环境变量不会自动透传给子进程,除非显式继承。
- 把解压路径(如
/opt/oracle/instantclient_19_22)加入~/.bashrc:export ORACLE_HOME=/opt/oracle/instantclient_19_22export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH - 运行
source ~/.bashrc后,立即验证:echo $LD_LIBRARY_PATH必须含该路径 - 若用 systemd 服务或 crontab 调用,需在对应 unit 文件或脚本中重复导出,不能只靠用户 shell 配置
- Python 程序里可强制加载:
import os; os.environ["LD_LIBRARY_PATH"] = "/opt/oracle/instantclient_19_22"(仅限开发调试,生产应统一环境变量)
如何验证客户端是否真正可用
别只跑 sqlplus -version,那只是检查二进制是否存在;真正能用,得连得上数据库并执行基础命令。
- 先确保网络可达:
tnsping your_db_host:1521(需提前配好tnsnames.ora或用 Easy Connect 格式) - 用最小连接串测试:
sqlplus username/password@//host:1521/SERVICE_NAME - 成功后立刻执行:
SELECT * FROM v$version WHERE rownum=1;—— 若报ORA-12154是网络/别名问题;报ORA-01017是认证问题;只有静默返回版本号才算客户端链路闭环 - 若用 Python,务必确认
oracledb(推荐)或cx_Oracle版本与 Instant Client 主版本一致(如 19.22 客户端不要配 21.x 的oracledb)
最容易被忽略的是:Ubuntu 22.04 的 glibc 版本(2.35)虽高于 Oracle 19c 客户端要求(≥2.17),但部分老版本 Instant Client(如 19.3)在链接 libnsl 时仍会失败——直接换用 Oracle 官网最新发布的 19.22 或 21.11 客户端包,比降级系统或打补丁更省事。


















