oracle 19c 在 rhel 8 上无需 compat-libpthread,因其已被 glibc 彻底移除;必须安装 libnsl、compat-libcap1 和 oracle-database-preinstall-19c(el8 版),并确保 /lib64/libnsl.so.1 存在且可读。
oracle 19c 在 rhel 8 上根本不需要 compat-libpthread,装了也没用,反而可能干扰系统稳定性。
为什么 compat-libpthread 不适用于 RHEL 8
RHEL 8 的 glibc 已完全移除对旧版 LinuxThreads 的兼容层,compat-libpthread 是为 RHEL 4/5 时代设计的过渡包,仅存在于 EL7 及更早仓库中。RHEL 8 的 dnf 默认仓库里根本搜不到这个包:
dnf search compat-libpthread
执行后返回空结果 —— 它不在官方源、EPEL 或 Oracle Linux 兼容源中。强行从 EL7 RPM 手动安装会导致:glibc 版本冲突、ldconfig 缓存污染、甚至 systemd 启动失败。
RHEL 8 上真正要装的是 libnsl 和 compat-libcap1
Oracle 19c 在 RHEL 8 报错最常见的是:
error while loading shared libraries: libnsl.so.1: cannot open shared object file-
./runInstaller: /lib64/libc.so.6: version `GLIBC_2.28' not found(实际是缺compat-libcap1导致 perl 解析失败)
对应必须安装的包是:
-
libnsl:提供libnsl.so.1,解决 OUI 和 perl 运行时依赖 -
compat-libcap1:修复getcap/setcap调用兼容性,否则runInstaller会卡在权限检查 -
oracle-database-preinstall-19c:自动配置内核参数、用户 limits、目录权限,比手动调更可靠
dnf 命令要这样写才生效
别信网上抄来的 EL7 命令。RHEL 8 正确安装顺序是:
sudo dnf install -y libnsl compat-libcap1
然后安装预置包(它内部已声明对 libnsl 的依赖):
sudo dnf install -y oracle-database-preinstall-19c
注意:oracle-database-preinstall-19c 的 RPM 包名末尾是 el8,不是 el7。用错版本会导致 /etc/sysctl.conf 写入无效参数,重启后失效。
静默安装时仍报 libnsl 错误?检查 LD_LIBRARY_PATH
即使装了 libnsl,如果以 oracle 用户运行 runInstaller,而该用户的 shell profile 里清空或覆盖了系统默认库路径,仍会找不到:
- 确认
libnsl.so.1确实存在:ls /lib64/libnsl.so.1 - 检查当前环境:
echo $LD_LIBRARY_PATH,若非空,临时清掉再试:unset LD_LIBRARY_PATH - 不要在
.bash_profile里硬编码LD_LIBRARY_PATH=/lib64—— RHEL 8 默认通过/etc/ld.so.conf.d/管理,手动加反而易出错
最常被忽略的一点:Oracle 19c 的 runInstaller 会启动一个嵌套的 Perl 解释器,而这个 Perl 是自带的二进制,它不读系统 ldconfig 缓存,只认 /lib64 下的裸文件。所以哪怕 ldconfig -p | grep nsl 显示正常,runInstaller 仍可能失败 —— 必须确保 /lib64/libnsl.so.1 存在且可读。











