yum install libnsl是首选方案,因其直接安装Red Hat系官方维护的兼容版libnsl.so.1(如libnsl-2.28-164.el8.x86_64),而非错误寻找已不存在的compat-libnsl;该包被Oracle 19c二进制(含perl、runinstaller)硬依赖,且预安装包oracle-database-preinstall-19c虽声明依赖但不自动修复已卸载状态,必须显式安装并用ldd验证加载。
为什么yum install libnsl是首选方案
oracle 19c二进制(包括runinstaller、perl、oracle主程序)在glibc ≥2.28的系统(如rhel 8/centos 8/oracle linux 8)上硬依赖libnsl.so.1这个soname。而该库自glibc 2.28起已从glibc主体剥离,不再随系统默认安装。直接运行yum install libnsl会拉取官方仓库中提供libnsl.so.1兼容符号的rpm包(例如libnsl-2.28-164.el8.x86_64),它不是“旧版兼容包”,而是red hat系为向后兼容专门维护的独立分发版本。
常见误区是去搜compat-libnsl或libnsl-compat——这些包在RHEL/CentOS 8+官方源中并不存在,属于RHEL 7时代的命名残留,强行找错包反而可能引入冲突。
-
yum install libnsl必须在root权限下执行,普通用户会提示permission denied - 若提示
No package libnsl available,说明yum源未正确配置(如BaseOS/AppStream未启用),需先检查/etc/yum.repos.d/下repo文件中enabled=1是否生效 - 安装后无需手动修改
LD_LIBRARY_PATH,系统动态链接器会自动在/lib64中找到新装的libnsl.so.1
别用ln -s libnsl.so.2.0.0 libnsl.so.1硬链接
虽然/lib64/libnsl.so.2.0.0确实存在,但它是glibc 2.28+中重构后的libnsl.so.2 ABI,导出的符号集(如gethostbyname_r@GLIBC_2.2.5)与Oracle期望的libnsl.so.1 ABI不一致。硬建软链接会导致后续出现symbol lookup error或段错误,尤其在sqlplus连接数据库、lsnrctl start启动监听器时才暴露,比安装失败更难排查。
真实案例中,有用户在Oracle Linux 8.8上用软链接绕过安装,结果数据库实例能启动,但tnsping始终返回TNS-12545,最终定位到libnsl.so.1 → libnsl.so.2.0.0导致NIS解析逻辑异常。
- 验证是否真用了软链接:运行
ls -l /lib64/libnsl.so*,看到libnsl.so.1 -> libnsl.so.2.0.0即为风险状态 - 已误建链接的,应先
rm /lib64/libnsl.so.1,再重装libnsl包 - 某些离线环境没有网络,不能靠yum,此时应从相同OS版本的安装镜像中提取
libnsl-*.rpm,用rpm -ivh --nodeps强制安装(仅限应急)
预安装包oracle-database-preinstall-19c已经包含libnsl
如果你用的是官方推荐的预安装rpm(如oracle-database-preinstall-19c-1.0-2.el8.x86_64.rpm),它内部已声明对libnsl的依赖,并会在安装时自动拉取。但注意:该包本身不会覆盖你已手动删掉的libnsl——如果之前卸载过libnsl,预安装包安装后仍会缺失。
执行rpm -q --requires oracle-database-preinstall-19c | grep nsl可确认依赖项;执行rpm -q libnsl验证是否真已安装。
- 预安装包不解决图形化安装界面乱码问题(那是
libtiff/libjpeg缺失),libnsl只管网络符号链接 - 在银河麒麟v10等非RHEL系系统上,预安装包通常不可用,必须单独处理
libnsl及其它缺失库 - 若用
dnf而非yum(如CentOS Stream 8+),命令完全一致:dnf install libnsl
静默安装前务必验证libnsl.so.1是否就位
很多用户在runInstaller -silent失败后才回头查依赖,其实可在启动安装前用一行命令快速验证:
ldd $ORACLE_HOME/perl/bin/perl | grep libnsl
正常输出应为libnsl.so.1 => /lib64/libnsl.so.1 (0x...);若显示not found,说明libnsl没装好或路径未刷新。注意:不要只检查runinstaller本身,因为它的依赖链更深,perl是安装器实际调用的第一个带libnsl依赖的二进制。
- 执行完
yum install libnsl后,建议立刻运行上述ldd命令,而不是直接开装 - 若
$ORACLE_HOME已部分创建(比如解压完成但未运行安装),可临时改用ldd /u01/app/oracle/product/19.0.0/db_1/perl/bin/perl验证 - Oracle 21c也存在同样问题,验证方法完全一致,不用额外处理
libnsl.so.1被所有Oracle组件(尤其是perl子系统)正确加载。很多故障发生在安装成功但首次运行sqlplus时,因为那时才真正触发数据库核心二进制的动态链接。











