应将Oracle内核参数写入/etc/sysctl.d/97-oracle-database-sysctl.conf,用sysctl --system加载并用sysctl key验证生效;shmmax单位为字节,shmall需按页大小换算,且swap容量须≥RAM。
怎么确认当前内核参数是否已加载
别急着改 /etc/sysctl.conf,先看系统实际生效的值。执行 sysctl -a | grep shmmax 或 sysctl fs.file-max,输出的是当前运行时的值,不是配置文件里的“愿望值”。如果改完没生效,八成是漏了 sysctl -p 这步,或者参数写错位置(比如混进了注释行后面)。
必须写进 /etc/sysctl.d/ 而不是只改 /etc/sysctl.conf
CentOS 7/RHEL 7 及更新系统默认启用 sysctl.d 机制,/etc/sysctl.conf 会被读取,但优先级低于 /etc/sysctl.d/*.conf。Oracle 官方文档和多数生产部署实践都推荐单独建文件,避免和系统默认配置冲突:
- 创建
/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格式,等号前后可有空格,但不能有中文、制表符或多余符号 - 不要在参数行末尾加注释(
#),否则该行会被忽略
改完后必须 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 或旧值 - 注意:某些参数如
kernel.shmmax值过大(超过物理内存)会导致sysctl --system报错并中断后续加载,得逐个检查单位(字节)是否合理
常见坑:shmmax 和 shmall 单位混淆、swap 不足触发限制
这两个共享内存参数最容易出错:
-
kernel.shmmax是单个共享内存段最大字节数,Oracle 19c 推荐设为4294967295(≈4GB),不是 MB 或 GB 字符串 -
kernel.shmall是系统能使用的总共享内存页数,需换算:若页大小是 4KB(getconf PAGESIZE输出 4096),则shmall = shmmax / 4096,常用值如1073741824 - 如果物理内存只有 4GB 但 swap 只有 2GB,而
shmall × 4096 > (RAM + swap),内核会静默截断,导致 Oracle 启动时报ORA-27102: out of memory - 检查 swap 是否足够:运行
free -h,确保 swap ≥ RAM(≤2GB RAM 时需 1.5×RAM;2–16GB RAM 时需等量 swap)
sysctl.d)、用对命令(sysctl --system)、验对结果(sysctl key)。尤其 shmmax 和 shmall 的数值关系与 swap 实际容量,是安装阶段最常卡住的地方。











