应执行sysctl kernel.shmmax等命令查看当前运行值,而非配置文件内容;必须用/etc/sysctl.d/97-oracle-database-sysctl.conf单独管理参数,以sysctl --system加载,并验证shmmax(字节)、shmall(页数换算)及swap≥RAM。

怎么确认当前内核参数是否已生效
别急着改配置文件,先看系统实际跑着的值。执行 sysctl kernel.shmmax 或 sysctl fs.file-max,输出的是内核当前加载的数值,不是你写在配置文件里的“愿望值”。如果改完没生效,大概率是漏了 reload 步骤,或者参数行被注释、格式错误(比如等号前后有制表符、末尾带 # 注释)导致整行被忽略。
为什么必须用 /etc/sysctl.d/ 而不是只改 /etc/sysctl.conf
CentOS 7/RHEL 7+ 和 Oracle Linux 默认启用 sysctl.d 机制,/etc/sysctl.conf 会被读取,但优先级低于 /etc/sysctl.d/*.conf。混写容易被覆盖或冲突。官方推荐单独建文件:
- 创建
/etc/sysctl.d/97-oracle-database-sysctl.conf - 把所有 Oracle 相关参数写进去,例如:
fs.aio-max-nr = 1048576<br>kernel.shmmax = 4294967295<br>net.ipv4.ip_local_port_range = 9000 65500
- 每行必须是
key = value格式,等号前后可有空格,但不能有中文、制表符、多余符号 - 参数行末尾不能加
#注释,否则该行失效
shmmax 和 shmall 单位怎么算才不踩坑
这两个最容易配错,直接导致 ORA-27102: out of memory:
-
kernel.shmmax单位是字节,Oracle 19c 推荐设为4294967295(≈4GB),不是"4G"或4294967295MB -
kernel.shmall单位是“页数”,需换算:运行getconf PAGESIZE确认页大小(通常为 4096),再用shmmax / 4096得到值,常见如1073741824 - 如果
shmall × 4096 > (RAM + swap),内核会静默截断,不报错但 Oracle 启动失败 - 检查 swap 是否足够:运行
free -h,确保swap ≥ RAM(RAM ≤2GB 时需 1.5×RAM;2–16GB 时等量;>16GB 建议固定 16GB)
reload 参数后怎么验证真生效了
sysctl -p 默认只加载 /etc/sysctl.conf,对 sysctl.d 下的文件无效。正确 reload 方式是:
- 运行
sysctl --system:它按顺序加载/run/sysctl.d/*.conf → /etc/sysctl.d/*.conf → /etc/sysctl.conf → /run/sysctl.conf - 验证某项是否生效:比如
sysctl kernel.shmall,输出必须是你配置的数值,不是0或旧值 - 注意:如果某个参数值过大(如
shmmax超过物理内存),sysctl --system会报错并中断后续加载,得逐个检查单位和合理性
真正麻烦的从来不是写几行配置,而是单位换算、swap 容量、加载路径这三处细节——漏掉任意一个,Oracle 就卡在启动阶段,报错还看不出根源。


















