oracle 19c安装报“内存不足”通常因kernel.shmmax值低于4gb阈值(需设为4294967295字节),预检查脚本直接中断;须写入/etc/sysctl.d/97-oracle-database-sysctl.conf并执行sysctl --system生效,再用sysctl kernel.shmmax验证。
oracle 19c安装时报“内存不足”,通常不是物理内存真不够,而是kernel.shmmax值太小,导致预检查脚本误判共享内存能力——它和实际运行时的sga分配无关,纯属安装阶段的硬性阈值比对。
为什么kernel.shmmax会触发安装失败
Oracle 19c的runinstaller在预检阶段会读取/proc/sys/kernel/shmmax,并与它内置的最低要求(如4GB)比对。即使你机器有64GB内存、swap也达标,只要shmmax低于该阈值,就直接报错中断,不继续检查其他项。
- 常见错误日志片段:
PRVF-0657: Could not retrieve available swap space或PRVF-0401,但根源常是shmmax未达门槛,而非swap本身 -
shmmax单位是字节,不是MB或GB字符串;设成4G会静默失败,必须写成4294967295(≈4GB)或8589934592(8GB) - RHEL/OL 8+ 默认
shmmax可能只有几百MB,远低于Oracle 19c要求的4GB最小值
怎么安全地调大kernel.shmmax
不能只临时改,也不能只写进/etc/sysctl.conf就以为完事——新系统(尤其是RHEL/OL 8+)默认用systemd-sysctl管理,且/etc/sysctl.d/优先级更高。
- 创建独立配置文件:
sudo tee /etc/sysctl.d/97-oracle-database-sysctl.conf,内容为:kernel.shmmax = 4294967295 - 确保等号前后无tab、无中文、行尾无注释(
#会导致整行被忽略) - 执行
sudo sysctl --system加载全部sysctl.d配置(sysctl -p只读/etc/sysctl.conf) - 验证是否生效:
sysctl kernel.shmmax输出应为4294967295,不是旧值或0
调完shmmax还报错?顺手检查这几个点
shmmax只是第一关,它常和另外两个参数联动出问题:
-
kernel.shmall:必须同步调整。若页大小是4096(getconf PAGESIZE),且shmmax=4294967295,则shmall至少设为1048576(4294967295 ÷ 4096 ≈ 1.048M) -
vm.nr_hugepages:虽不影响安装,但若后续建实例报ORA-27102,大概率是这个没配或配少了——shmmax调再大,没hugepages支撑,SGA启动仍失败 - cgroup v2冲突:如果
mount | grep cgroup显示cgroup2,那shmmax调得再大也没用,安装脚本根本读不到/proc/swaps——此时要加cgroup_no_v1=memory内核参数降级
真正卡住安装的,往往不是单个参数,而是shmmax、shmall、cgroup版本三者中任意一个没对齐。别只盯着报错里写的“内存不足”四个字,先看sysctl kernel.shmmax输出是不是你刚设的值——很多问题,就止步于这一步没验证。











