RHEL 8上Oracle 19c RPM安装必须使用适配el8的preinstall包(如oracle-database-preinstall-19c-1.0-2.el8.x86_64.rpm),否则会缺失fs.aio-max-nr等关键内核参数;libnsl需同时安装x86_64和i686版本,ksh须建pdksh符号链接,且root.sh执行不可跳过,/etc/oratab和listener.ora配置必须严格合规。
oracle-database-ee-19c 的 RPM 安装方式在 RHEL 8 上确实能省掉图形界面和响应文件的麻烦,但“快速”是有前提的——跳过依赖校验或硬塞
compat 包,大概率会在
root.sh 阶段失败,甚至导致数据库无法启动。
preinstall 包必须用对版本
RHEL 8 不认
oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm,强行安装会漏掉关键内核参数(比如
fs.aio-max-nr)和用户资源限制。正确做法是:
- 优先从 Oracle 官方 YUM 源安装适配 RHEL 8 的预装包:
dnf install oracle-database-preinstall-19c-1.0-2.el8.x86_64.rpm
- 若官方源不可用,手动补全缺失项:
echo "fs.aio-max-nr = 1048576" >> /etc/sysctl.conf && sysctl -p
- 检查
/etc/security/limits.d/oracle-database-preinstall-19c.conf 是否存在且生效,重点确认 oracle 用户的 nproc 和 nofile 值不小于 16384
依赖包不能靠 rpm -ivh --force 硬顶
RHEL 8 的
libnsl、
libaio-devel、
ksh 版本与 Oracle 19c 要求存在微妙错位:
-
libnsl 必须同时装 x86_64 和 i686 版本:dnf install libnsl libnsl.i686 -y,否则 sqlplus 启动时报 libnsl.so.1: cannot open shared object file
-
compat-libstdc++-33 和 compat-libcap1 是 RHEL 7 的遗留包,RHEL 8 上需从 EPEL 或 Oracle 提供的兼容仓库获取,不能直接用 el7.rpm 强装
-
ksh 替代 pdksh 后,要建符号链接:ln -sf /usr/bin/ksh /bin/pdksh,否则 dbca 会卡在 shell 检查
RPM 安装后必须立刻运行 root.sh,不能跳过
yum install oracle-database-ee-19c 只是把文件解压到
/opt/oracle/product/19c/dbhome_1,真正初始化环境、设置权限、注册服务全靠
root.sh:
- 必须以 root 身份执行:
/opt/oracle/product/19c/dbhome_1/root.sh
- 执行时会提示输入
ORACLE_HOME(回车默认即可),但若之前设过 CV_ASSUME_DISTID,这里可能卡住——此时需临时清空:unset CV_ASSUME_DISTID
- 脚本末尾会生成
/etc/init.d/oracledb_ORCLCDB-19c,这是后续启停数据库的唯一可靠入口,别自己写 systemd unit
oracledb_* 服务启动前的三个硬性检查
即使
root.sh 成功,
/etc/init.d/oracledb_ORCLCDB-19c start 仍可能静默失败:
- 确认
/etc/oratab 中有对应条目,格式必须为:ORCLCDB:/opt/oracle/product/19c/dbhome_1:N(最后一位是 N 表示不自动启动,但服务脚本需要这行存在)
- 检查
/opt/oracle/product/19c/dbhome_1/network/admin/listener.ora 是否包含有效 HOST 值,不能是 localhost 或未解析的主机名——RHEL 8 默认 hostname -i 可能返回 IPv6 地址,导致监听绑定失败
-
oracle 用户的 LD_LIBRARY_PATH 必须包含 $ORACLE_HOME/lib,否则 lsnrctl start 报 libclntsh.so.19.1: cannot open shared object file
RHEL 8 上 RPM 部署 Oracle 19c 的最大陷阱不在安装命令本身,而在于它把“配置责任”悄悄转移给了系统管理员:
preinstall 包的版本、
root.sh 的执行时机、
oratab 的手工维护,三者缺一不可。漏掉任意一个,都会让数据库停在“看似装好了,实则起不来”的状态。