alien转换Oracle 21c RPM包失败,因其硬编码RHEL路径(如/usr/lib64)且依赖libaio.so.1、libnsl.so.1等Ubuntu不原生提供的库;正确做法是使用Oracle官方提供的.deb包,或手动创建/usr/lib64软链、安装libnsl2/libtirpc3、配置ld.so.conf并运行ldconfig,最后用实际连接验证sqlplus可用性。
不能直接用 alien 装 oracle 21c 客户端 rpm 包——它依赖的库、路径和启动脚本在 ubuntu 上会立即报错,sqlplus 启动失败是大概率事件。
为什么 alien 转换后的 oracle-instantclient-basic-21c.deb 无法运行
Oracle 官方提供的 oracle-instantclient-basic-21c-21.12.0.0.0-1.x86_64.rpm 是为 RHEL/OL 编译的,硬编码了 /usr/lib64、/etc/ld.so.conf.d/oracle-instantclient.conf 等路径,而 Ubuntu 22.04 默认不创建 /usr/lib64,且 libaio.so.1 实际位于 /usr/lib/x86_64-linux-gnu/libaio.so.1t64(不是 .so.1)。
常见错误现象包括:
sqlplus: error while loading shared libraries: libaio.so.1: cannot open shared object filesqlplus: error while loading shared libraries: libnsl.so.1: cannot open shared object file- 执行
ldd $(which sqlplus)显示大量not found
正确做法:跳过 alien,改用官方预编译的 DEB 包或手动软链
Oracle 官方其实已为 Ubuntu 22.04 提供了 .deb 格式客户端(见 instantclient-basic-21.12.0.0.0-1.amd64.deb),无需转换。若你手头只有 RPM,必须补全以下三步才能让 sqlplus 正常工作:
- 创建
/usr/lib64并软链关键库:sudo mkdir -p /usr/lib64 sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib64/libaio.so.1 sudo ln -sf /usr/lib/x86_64-linux-gnu/libnsl.so.2 /usr/lib64/libnsl.so.1 sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib64/libstdc++.so.6
- 安装缺失的兼容库:
sudo apt install libnsl2 libtirpc3(libnsl.so.1的提供者) - 设置运行时库路径:
echo "/usr/lib/oracle/21/client64/lib" | sudo tee /etc/ld.so.conf.d/oracle-instantclient.conf sudo ldconfig
安装后验证 sqlplus 是否真正可用
别只跑 sqlplus -version —— 它可能显示版本但实际连不上。必须实测连接行为:
- 用最小参数连接本地监听器(假设已运行 Oracle DB):
sqlplus username/password@localhost:1521/XE - 若报
ORA-12154: TNS:could not resolve the connect identifier specified,说明TNS_ADMIN或tnsnames.ora路径未设;临时绕过方式:sqlplus username/password@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))" - 若报
ORA-12547: TNS:lost contact,基本是libaio或libnsl链接仍不完整,回看上一步的ldd输出
最容易被忽略的是:Ubuntu 22.04 的 libaio.so.1t64 和 libnsl.so.2 不会自动响应 .so.1 请求,软链必须精确到文件名,且 ldconfig 必须重载——漏掉任意一环,sqlplus 就只是个“能打印版本号的假二进制”。


















