应执行sysctl -p或sysctl --system使/etc/sysctl.conf或/etc/sysctl.d/99-oracle.conf配置生效,并用sysctl kernel.shmmax、ipcs -lm、ulimit -a等命令验证运行时值是否符合Oracle 19c要求,而非仅检查配置文件。
Oracle安装报错“Kernel parameters check failed”怎么办
直接改 /etc/sysctl.conf 是对的,但 oracle 安装程序校验的是当前生效的内核参数值,不是配置文件里写了就算数。很多人写完就跑安装脚本,结果还是失败——因为没让新配置真正加载进内核。
常见错误现象:ERROR: Kernel parameters check failed for ... shmmax, shmall, sem, etc.;即使 cat /etc/sysctl.conf 看起来都配对了,sysctl -p 也返回成功,但 ipcs -l 或 sysctl -a | grep shm 显示的值仍是旧的。
- 必须执行
sysctl -p生效,且确认无报错(比如某行语法错会导致后续全跳过) - 某些参数如
kernel.shmmax在某些内核版本下有硬上限(如不能超过物理内存),设太大反而被静默截断 - RHEL/CentOS 7+ 默认启用
systemd-sysctl,它会覆盖/etc/sysctl.conf,应优先检查/etc/sysctl.d/99-oracle.conf这类独立文件
哪些参数必须配、值怎么定才不踩坑
Oracle 19c 及以后版本对共享内存和信号量要求更严,光抄老教程的固定数值容易翻车。关键不是“填满推荐值”,而是匹配你的实际内存和实例规模。
典型场景:单实例、64GB 内存、SGA 目标 24GB。此时:
-
kernel.shmmax至少设为25769803776(24GB 字节),但不要超过phys_mem * 0.8,否则ipcs可能显示异常 -
kernel.shmall按页计算:shmmax / 4096向上取整(x86_64 默认页大小),例如25769803776 / 4096 = 6291456 -
kernel.sem四元组中第三个数(semmsl)建议 ≥ 最大并发连接数 × 2,第四个(semmni)≥ 128,避免 ORA-00845 -
fs.file-max建议 ≥512 * processes(Oracle 参数processes值)
为什么 sysctl -p 看似成功却没生效
根本原因:sysctl -p 默认只读 /etc/sysctl.conf,而现代 Linux 发行版(尤其是 systemd 系统)会额外加载 /etc/sysctl.d/*.conf 下的文件,且按字母序覆盖。如果 /etc/sysctl.d/99-sysctl.conf 里有同名参数,它会把你在 /etc/sysctl.conf 里写的顶掉。
- 查实际生效值用:
sysctl kernel.shmmax,不是grep shmmax /etc/sysctl.conf - 查加载顺序:
systemctl list-dependencies sysctl.service或直接看systemd-sysctl日志:journalctl -u systemd-sysctl -n 20 - 稳妥做法:把 Oracle 相关参数单独写到
/etc/sysctl.d/99-oracle.conf,然后sysctl --system(等价于重载全部)
安装前必须验证的三个命令
别信配置文件,只信运行时输出。Oracle 安装程序内部调用的就是这些检查逻辑,你提前跑一遍,基本就知道会不会卡在校验环节。
- 共享内存:
ipcs -lm | grep -E "(max|total)"—— 对照kernel.shmmax和kernel.shmall - 信号量:
ipcs -ls | head -5—— 确认semmsl,semmni等字段匹配kernel.sem输出 - 资源限制:
ulimit -a | grep -E "(memlock|nofile|nproc)"—— 注意memlock必须 ≥ SGA 大小,否则启动实例时报 ORA-27123
复杂点在于:这些值可能受 /etc/security/limits.conf、/etc/systemd/system.conf、甚至 Oracle 用户的 shell profile 多层影响。最省事的办法是用 Oracle 用户登录后,在交互式 shell 里逐条执行验证命令——安装程序跑的正是这个环境。










