oracle 23c free edition 内存不足的根本原因是其硬性限制为2gb且默认参数未适配低配环境,需通过调整内核参数(vm.overcommit_memory=1)、初始化参数(sga_max_size=1536m等)及手动建库绕过配置脚本内存校验。

Oracle 23c Free Edition 在安装或启动时提示内存不足(如 ORA-04030、ORA-04031,或配置脚本中报 insufficient memory),根本原因不是物理内存真的不够,而是它对可用内存有硬性限制且默认参数未适配低配环境。23c Free 最大只允许使用 2 GB RAM,但若系统总内存低于 4 GB,或内核参数、数据库初始化参数未做收敛,就容易在 configure 阶段失败或实例启动后立即 OOM。
检查 /proc/meminfo 与实际可用内存
先确认真实内存状况,避免误判:
- 运行
free -h和cat /proc/meminfo | grep MemAvailable,重点看MemAvailable值(不是MemTotal)——它反映真正可分配给进程的内存 - 如果
MemAvailable ,即使总内存标称 4G,也大概率触发内存校验失败;23c configure 脚本内部会预留缓冲,要求至少 2.5G 可用才继续 - 常见干扰项:swap 未启用、systemd-journald 占用过高、其他服务(如 docker、nginx)常驻吃内存
调整内核参数防止 overcommit 拒绝分配
Oracle 进程启动时大量申请虚拟内存,Linux 默认策略(vm.overcommit_memory=2)可能直接拒绝,表现为 ORA-27102: out of memory:
- 临时生效:
echo 1 > /proc/sys/vm/overcommit_memory(仅限当前 session) - 永久生效:在
/etc/sysctl.conf中添加vm.overcommit_memory = 1,然后运行sysctl -p - 同时建议设
vm.swappiness = 10(降低 swap 倾向,但保留兜底能力) - 注意:不要设为 0,否则 Oracle 后台进程(如 DBWn)可能因无法分配页而 hang 住
修改数据库初始化参数降低内存占用
configure 完成后,若实例能启动但连接即报错,说明 SGA/PGA 分配超限。需手动编辑 $ORACLE_HOME/dbs/initFREE.ora(或 SPFILE):
- 强制限定 SGA 总大小:
sga_max_size=1536M、sga_target=1536M(不能超过 1.5G,留 512M 给 PGA 和 OS) - 关闭自动内存管理:
memory_target=0、memory_max_target=0(23c Free 不支持 AMM,设了反而报错) - 调低共享池和 Java pool:
shared_pool_size=384M、java_pool_size=64M(默认值在低内存下极易溢出) - 确认
db_cache_size不高于1024M;若仍不稳定,可进一步压到768M
最关键的绕过点:跳过 configure 的内存自检
如果你已确认系统内存满足最低要求(≥4G 物理内存 + swap ≥2G),但 /etc/init.d/oracle-free-23c configure 仍卡在“checking available memory”阶段,本质是脚本里硬编码了保守阈值:
- 该脚本实际调用的是
/opt/oracle/product/23c/dbhomeFree/bin/dbca静默模式,其内存检测逻辑不可跳过 - 唯一可靠方式:改用 RPM 安装后,手动建库 —— 先执行
yum install oracle-database-free-23c,再跳过 configure,直接运行:su - oracle -c "dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbname FREE -sid FREE -responseFile NO_VALUE -characterSet AL32UTF8 -sysPassword MyPass123 -systemPassword MyPass123 -dbsnmpPassword MyPass123 -databaseType MULTIPURPOSE -automaticMemoryManagement false -totalMemory 1536" - 注意:
-totalMemory单位是 MB,必须 ≤1536;该参数会覆盖所有 SGA/PGA 自动计算逻辑
真正容易被忽略的是:23c Free 的内存限制是运行时强制 enforce 的,不是建议值。哪怕你调高了 sga_max_size,实例启动后也会被内核 cgroup 或 Oracle 自身 watchdog 杀掉。所以所有参数调整,必须围绕 2 GB 上限做减法,而不是试图突破它。











