kernel.shmmax和kernel.shmall必须配对设置:shmmax单位为字节,建议设为4294967295或更高(≤物理内存),shmall单位为页,须≥shmmax/4096(默认页大小),且swap≥RAM,否则内核静默截断导致ORA-27102。

kernel.shmmax 和 kernel.shmall 必须按字节和页换算配对
这两个参数决定 Oracle 能否成功分配 SGA。设错一个,实例直接起不来,报 ORA-27102: out of memory 或 ORA-27123: unable to attach to shared memory segment。
-
kernel.shmmax单位是字节,不是 MB/GB 字符串;19c 常见 SGA > 4GB,建议设为4294967295(≈4GB)或更高,但不能超过物理内存 -
kernel.shmall单位是“页”,不是字节;必须 ≥shmmax / getconf PAGESIZE;x86_64 默认页大小 4096,所以shmmax=4294967295对应shmall=1048576 - swap 容量必须 ≥ RAM,否则内核会静默截断
shmall值,导致 Oracle 启动失败;用free -h确认 - 验证是否生效:运行
sysctl kernel.shmmax和sysctl kernel.shmall,输出值必须与配置一致,不是 0 或旧值
kernel.sem 的四个值顺序不能错,SEMMNS 容易低估
Oracle 每个进程(包括后台进程、前台连接)都消耗信号量,SEMMNS 是全系统信号量总数上限。设低了会报 cannot create semaphore set: No space left on device,和磁盘空间无关。
- 四个值顺序固定:
SEMMSL SEMMNS SEMOPM SEMMNI;常见错误是把SEMMNS值填在第二个位置却误用了SEMMSL的值 -
SEMMNS ≥ (PROCESSES + 20) × 实例数;例如单实例PROCESSES=1000,至少设SEMMNS=10200 - 检查当前值:运行
cat /proc/sys/kernel/sem,输出类似250 32000 32 128,第二列就是实际生效的SEMMNS - 别只改配置文件就以为完事——改完必须
sysctl --system加载,且确认输出值已更新
透明大页(THP)必须禁用,临时命令不等于永久生效
THP 和 Oracle 内存管理机制冲突,会导致 SGA 分配卡顿、AWR 中出现大量 direct path read temp 或 latch: shared pool 等异常等待。
- 检查状态:
cat /sys/kernel/mm/transparent_hugepage/enabled,输出含[always]表示启用 - 临时禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled(部分 RHEL/CentOS 路径为/sys/kernel/mm/redhat_transparent_hugepage/enabled) - 永久禁用:在
/etc/default/grub的GRUB_CMDLINE_LINUX行末尾加transparent_hugepage=never,再执行grub2-mkconfig -o /boot/grub2/grub.cfg && reboot - 只改
enabled文件不改内核启动参数,重启后 THP 会恢复启用
参数必须写进 /etc/sysctl.d/,sysctl -p 不加载该目录
CentOS 7/RHEL 7+ 默认启用 sysctl.d 机制,/etc/sysctl.conf 优先级低于 /etc/sysctl.d/*.conf。混写容易被覆盖或忽略。
- 推荐创建独立文件:
/etc/sysctl.d/97-oracle-database-sysctl.conf - 每行格式严格为
key = value,等号前后可有空格,但不能有中文、制表符、行尾注释(#后内容整行失效) - 加载方式必须是
sysctl --system,它按顺序加载/run/sysctl.d/ → /etc/sysctl.d/ → /etc/sysctl.conf - 验证某项是否真生效,不要只看配置文件内容,要跑
sysctl kernel.sem这类命令看运行时值
getconf PAGESIZE 就硬套换算公式,或改完参数没执行 sysctl --system 就去启库。这些操作看似琐碎,但任一遗漏都会让 Oracle 在启动阶段直接失败,而不是运行中慢慢出问题。


















