Oracle安装报“物理内存不足”实为cgroup限制导致MemTotal虚低,应使用./runInstaller -ignorePrereq _IGNORE_PREREQ=TRUE绕过校验,而非仅设环境变量;装后须验证监听状态及alert.log中的ORA-27102/ORA-04031错误。
Oracle安装报“物理内存不足”却实际够用
oracle安装程序在linux下检查/proc/meminfo里的memtotal,但默认阈值很保守(比如11g要求≥1gb,19c要求≥2gb),而现代虚拟机或容器常被cgroup限制,导致memtotal显示值偏低——哪怕宿主机有32gb,容器里可能只报1.8gb,触发error: prvf-0001 : failed to retrieve physical memory这类错误。
这不是内存真不够,是安装器读取方式和环境隔离冲突了。硬调大cgroup limit不现实,更直接的办法是绕过校验,但必须清楚后果:
-
_IGNORE_PREREQ=TRUE只是跳过检查,不解决底层资源约束;如果后续运行时内存真不足,实例会启动失败或频繁OOM - 该参数仅对
runInstaller生效,不影响dbca或补丁安装,后两者仍可能报同类错 - Oracle官方明确不支持生产环境使用该参数,仅限测试或临时验证
怎么加_IGNORE_PREREQ才真正生效
很多人试过export _IGNORE_PREREQ=TRUE再运行./runInstaller,结果没用——因为Oracle安装器启动时会清空部分环境变量,尤其带下划线的变量容易被过滤。
正确做法是把参数直接塞进命令行,且必须放在./runInstaller之前:
./runInstaller -ignorePrereq -J"-Doracle.install.db.installOption=EE" -J"-Doracle.install.db.isCustomInstall=true" _IGNORE_PREREQ=TRUE
注意三点:
-
-ignorePrereq是图形/静默模式都必需的开关,缺它_IGNORE_PREREQ不会触发 -
_IGNORE_PREREQ=TRUE必须写在./runInstaller之后、其他参数之前,顺序错就失效 - 如果用响应文件静默安装,不能只靠环境变量,得在命令中显式带上
_IGNORE_PREREQ=TRUE
比跳过更稳妥的替代方案
跳过检查是权宜之计,真正减少风险的方式是让检查“看到”真实可用内存。有三个可操作点:
- 检查是否启用了
memory.limit_in_bytes:运行cat /sys/fs/cgroup/memory/memory.limit_in_bytes,若返回9223372036854771712(即-1)说明没限制;否则需调整cgroup配置或换用无限制的容器 - 临时关闭NUMA平衡(某些老内核下会影响
MemTotal读取):echo 0 > /proc/sys/kernel/numa_balancing,安装完可恢复 - 修改
/etc/redhat-release或/etc/os-release伪装成低版本系统(如把CentOS 8改成7),部分Oracle版本对旧系统放宽内存要求——但这会影响后续补丁兼容性,慎用
装完立刻要验证的两件事
跳过检查后,Oracle软件能装上,但数据库未必能起来。必须马上确认:
- 启动监听:
lsnrctl start,看lsnrctl status是否显示READY状态,否则可能是共享内存段(shmmax)或信号量(semmsl)没配够 - 建库或启实例时紧盯
alert.log,搜索ORA-27102(out of memory)或ORA-04031(shared pool unable to allocate),这两个错才是内存真实的瓶颈信号
跳过检查只是推开第一道门,门后有没有路,得靠日志和启动行为来答。别急着连应用,先让实例稳稳跑满5分钟。










