oracle安装失败卡在“检查系统要求”阶段的根本原因是oracle用户资源限制未生效:su或sudo不会触发pam加载limits.conf,必须ssh重新登录;systemd服务需额外配置limitnofile等参数,且须用ps -eo rlimit验证进程真实限制。

Oracle安装失败常卡在“检查系统要求”阶段,根本原因往往是oracle用户资源限制没调到位——不是配错了,是没生效。
为什么ulimit -a显示的值和/etc/security/limits.conf不一致
Linux下PAM(Pluggable Authentication Modules)只对**通过login、sshd等PAM-aware服务启动的会话**加载limits.conf。直接su - oracle或sudo -u oracle bash不会触发PAM limits模块,所以ulimit仍沿用父进程限制。
- 必须用
ssh oracle@localhost或完全退出再重新登录,才能让新限制生效 - 检查是否生效:登录后立即运行
ulimit -n(文件数)和ulimit -u(进程数),确认输出为65536和16384 - 若仍不对,检查
/etc/pam.d/sshd或/etc/pam.d/system-auth是否含session required pam_limits.so;CentOS 7+默认已启用,但某些最小化安装可能缺失
nofile和nproc设多少才够用
Oracle官方基线值(soft nofile 1024/hard nofile 65536)仅适用于小负载测试环境。生产部署需按实际SGA大小和并发连接数上调:
-
nofile:每个数据库连接至少占用2–3个文件描述符;若预计最大连接数为1000,建议hard nofile≥1000 × 3 + 1024(预留日志、trace等),即≥4096;高并发场景直接设65536更稳妥 -
nproc:Oracle后台进程(PMON、SMON、DBWn、LGWR等)+ 每个连接对应一个服务器进程(或共享服务器模式下的调度进程),hard nproc应 ≥后台进程数(通常10+)+ 最大并发连接数;设16384可覆盖绝大多数场景 - 别漏掉
stack:Oracle 19c+要求hard stack≥32768(KB),否则安装时可能报ORA-27123: unable to attach to shared memory segment
systemd服务或容器里Oracle不认limits.conf
如果Oracle以systemctl start oracle.service方式启动,或跑在Docker/Kubernetes中,/etc/security/limits.conf完全无效——systemd有自己的资源控制机制。
- 编辑
/etc/systemd/system/oracle.service,在[Service]段添加:LimitNOFILE=65536 LimitNPROC=16384 LimitSTACK=32768
- 重载配置:
systemctl daemon-reload,再重启服务 - 容器场景:Docker需加
--ulimit nofile=65536:65536 --ulimit nproc=16384:16384;Kubernetes则在Pod spec中用securityContext.ulimits - 验证方式:
systemctl show oracle.service | grep LimitNOFILE,确认输出为65536
临时提升限制救急但有硬约束
安装中途发现ulimit不够,可手动调高,但受hard上限制约:
- 当前会话内执行:
ulimit -n 65536 -u 16384 -s 32768 - 若提示
Operation not permitted,说明当前hard值低于目标值,必须先改/etc/security/limits.conf并重新登录 - 注意:
ulimit -n修改后,已打开的文件描述符不受影响,但新打开的会遵守新限制;数据库启动时会批量打开大量文件,所以必须在启动前设置好
最容易被忽略的是:改完limits.conf后没重新登录,或systemd服务没加Limit*配置,导致Oracle进程实际运行时仍卡在默认限制(通常是1024文件数)。务必用ps -eo pid,user,comm,rlimit | grep oracle查进程真实的资源上限。











