Oracle 23c要求内核参数shmmax≥4294967296、shmall≥1073741824(页)、sem=250 32000 100 128,且需配置limits.conf中oracle用户nofile/nproc/memlock等限制,并通过sysctl --system和新登录会话生效验证。
oracle 23c(注意:oracle 官方未发布 “23ai” 版本,当前最新正式版为 oracle database 23c free developer release,代号 23c,部分文档/安装包中可能误标为 23ai;配置时请以实际下载的 rpm 包或 oracle-database-free-23c 为准)对 linux 内核参数和系统资源限制有明确要求。不满足会导致 dbca 创建数据库失败、实例启动报 ora-27102: out of memory 或共享内存分配异常。
检查当前内核参数是否达标
Oracle 23c 要求最低:shmmax ≥ 4GB(即 4294967296),shmall ≥ 1073741824(按页计算,假设 PAGE_SIZE=4KB),sem 至少为 250 32000 100 128。
执行以下命令快速比对:
sysctl kernel.shmmax sysctl kernel.shmall sysctl kernel.sem cat /proc/sys/fs/file-max
若输出值低于上述下限,必须修改;特别注意 shmall 单位是“页数”,不是字节 —— 容易误用 echo 4G > /proc/sys/kernel/shmall 导致写入失败或数值溢出。
永久生效的修改方式(非临时 echo)
临时用 sysctl -w 只影响当前会话,重启后丢失,且 Oracle 安装脚本(如 runInstaller)通常在 root 权限下读取 /etc/sysctl.conf 或 /etc/sysctl.d/*.conf 判断环境合规性。
推荐做法:
- 新建配置文件:
/etc/sysctl.d/98-oracle-23c.conf(优先级高于sysctl.conf,避免污染主配置) - 写入以下内容(按实际内存调整,但不得低于最小值):
kernel.shmmax = 4294967296 kernel.shmall = 1073741824 kernel.sem = 250 32000 100 128 fs.file-max = 6815744 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_max = 4194304
- 加载生效:
sysctl --system(该命令会重载所有/etc/sysctl.d/和/etc/sysctl.conf)
⚠️ 不要直接改 /etc/sysctl.conf —— 后续系统升级可能覆盖,且与 systemd-sysctl 冲突。
用户级资源限制(limits.conf)必须同步配
Oracle 安装用户(如 oracle)需在登录时自动获得足够资源,否则 sqlplus 或 lsnrctl 可能因打开文件数不足崩溃。
编辑 /etc/security/limits.d/oracle-23c.conf:
oracle soft nofile 10240 oracle hard nofile 65536 oracle soft nproc 16384 oracle hard nproc 16384 oracle soft stack 10240 oracle hard stack 32768 oracle soft memlock 134217728 oracle hard memlock 134217728
关键点:
-
memlock必须设(单位字节),否则 Oracle AMM(自动内存管理)启用时会因无法锁定 SGA 报ORA-27102 - 修改后需新登录 shell 才生效 —— 切勿在已运行的
su - oracle会话中测试 - 确认 SELinux 不拦截:若启用了
enforcing模式,setsebool -P oracle_can_lock_memory on(RHEL/CentOS 8+)
验证是否真正生效(常被跳过的一步)
很多用户改完就跑 dbca,结果仍失败 —— 因为 sysctl --system 成功不代表所有参数被内核接受(例如 shmall 超过物理内存页总数会被静默截断)。
验证方法:
- 重新登录
oracle用户,运行:ulimit -a | grep -E "(memlock|nofile|nproc|stack)" - 检查内核参数是否未被截断:
cat /proc/sys/kernel/shmall对比你写的值 - 运行 Oracle 自检脚本(如果已解压安装介质):
./runInstaller -executePrereqs,它会输出具体哪项不满足
最隐蔽的问题:某些云主机(如 AWS EC2 t3/t4g)默认 vm.max_map_count 过低,虽 Oracle 23c 文档未强制要求,但若启用 JVM 组件(如 APEX 或 ORDS),建议追加:vm.max_map_count = 262144 到 sysctl.d 配置中。


















