绝大多数情况下不用手动执行oracle-database-preinstall-19c,它通过%post脚本在yum安装时自动配置用户、组、内核参数和limits;手动运行无意义且可能引发冲突。
预安装脚本 oracle-database-preinstall-19c 到底要不要手动执行?
绝大多数情况下——不用。这个 rpm 包的作用是“声明式配置”,它本身不运行任何初始化逻辑,而是通过 %post 脚本在安装时自动完成用户、组、内核参数、limits 等设置。你手动去跑它的脚本(比如 /etc/init.d/oracle-database-preinstall-19c)不仅没意义,还可能因重复操作导致 sysctl 冲突或 limits.conf 重复条目。
- 它本质是个“配置包”,不是“安装器”或“启动服务”
- RHEL/CentOS 7/8 上用
yum install oracle-database-preinstall-19c就够了,安装过程会自动触发配置 - 如果系统已存在
oracle用户,该包默认不会覆盖其 UID/GID,但会确保oinstall和dba组存在且正确 - 检查是否生效:运行
sysctl -p | grep sem、ulimit -n(切到oracle用户下)、id oracle
oracle-database-preinstall-19c 在 RHEL 8.6+ 上为什么报依赖错误?
因为它的元信息仍硬编码依赖 kernel-uek(Oracle UEK 内核),而 RHEL 8 默认用 kernel(Red Hat 兼容内核)。这不是 bug,是 Oracle 官方对 RHEL 的支持策略限制:他们只测试并保证在 UEK 下行为一致。
- 典型错误:
package oracle-database-preinstall-19c-19.0.0-1.el8.x86_64 requires kernel-uek >= 4.14.35, but none of the providers can be installed - 绕过方法(仅限开发/测试环境):
yum install --setopt=obsoletes=0 --nogpgcheck oracle-database-preinstall-19c - 更稳妥做法:改用
oraclelinux:8镜像,或在 RHEL 上手动创建/etc/sysctl.d/99-oracle.conf和/etc/security/limits.d/oracle.conf,内容照抄该 RPM 的%post脚本逻辑 - 注意:跳过依赖后,
semmsl/semmni等 IPC 参数仍需手动验证是否写入生效,RHEL 8 默认使用systemd-sysctl,sysctl -p不再自动加载所有文件
执行完预安装后,oracle 用户仍无法登录或 ulimit 不生效?
常见原因是 shell 初始化流程未加载 limits 配置,或用户被创建为 /sbin/nologin。这个包默认把 oracle 用户设为无登录权限——它只服务数据库进程,不是给人直接 ssh 用的。
- 确认用户状态:
getent passwd oracle,若显示/sbin/nologin,说明正常;如需临时登录调试,改用usermod -s /bin/bash oracle -
ulimit -n不生效?检查/etc/security/limits.d/oracle-database-preinstall.conf是否存在,且内容里有oracle soft nofile和oracle hard nofile两行 - 关键细节:RHEL/CentOS 7+ 中,
limits.conf只对 PAM 登录会话生效;systemd 服务(如oracle-rdbms-server-19c-preinstall)需额外在 service 文件中加LimitNOFILE=65536 - 验证方式:用
su - oracle -c 'ulimit -n'(带-才模拟完整登录环境)
能否用 oracle-database-preinstall-19c 替代手动调优?
能覆盖基础项,但不能替代场景化调优。它设的是 Oracle 安装所需的“最小安全值”,比如 vm.swappiness=1、fs.aio-max-nr=1048576,但生产环境往往还需根据内存大小、IO 负载、ASM 使用情况微调。
- 它不会动
/proc/sys/vm/dirty_ratio或net.core.somaxconn,这些对高并发 DB 有影响 - 它设的
kernel.shmall是固定值(如 2097152),实际应按物理内存 * 0.8 / page_size 计算 - 它不处理 SELinux 策略——若启用 SELinux,仍需
semanage fcontext -a -t oracle_exec_t "/u01/app/oracle/product/19c/dbhome_1/bin(/.*)?"类命令 - 最易忽略的一点:它不创建
/u01目录,也不设挂载选项(如noatime,nobarrier),这些必须人工确认










