ITPub博客

首页 > 数据库 > Oracle > 第75期 ORA-27104: system-defined limits for shared memory was misconfigured

第75期 ORA-27104: system-defined limits for shared memory was misconfigured

原创 Oracle 作者:pxbibm 时间:2026-07-28 10:37:05 0 删除 编辑

oracle在安装过程或者是修改Oracle 启动实例分配 SGA 时,操作系统内核共享内存参数不满足需求,无法申请足够大小的共享内存段。报如下错误:

ORA-27104: system-defined limits for shared memory was misconfigured
Additional information: 1

一、报错本质含义

Oracle 启动实例分配 SGA 时,操作系统内核共享内存参数不满足需求,无法申请足够大小的共享内存段。

因此报错:

ORA-27104: system-defined limits for shared memory was misconfigured
底层: shmget() 系统调用失败。
常见出现场景:
  1. 修改 sga_target / sga_max_size 后重启数据库

  2. 新建数据库实例

  3. 主机刚重启,内核参数未持久化

二、涉及 Linux 三大核心内核参数(System V 共享内存)

# /etc/sysctl.conf
kernel.shmmax      # 单个共享内存段最大大小(字节)
kernel.shmmni      # 系统最大共享内存段数量
kernel.shmall      # 系统所有共享内存总页数(PAGE_SIZE一般4K)

标准计算公式

假设计划设置 SGA_MAX_SIZE = 8G
  1. shmmax ≥ SGA_MAX_SIZE(单位:字节) 8G = 8 * 1024 * 1024 * 1024 = 8589934592

  2. shmall:系统共享内存总页数一页默认 4096 字节 shmall >= SGA_MAX_SIZE / 40968G → >= 2097152

  3. shmmni 建议至少 4096

三、快速核查当前值

sysctl kernel.shmmax kernel.shmall kernel.shmmni
# 查看系统页大小(一般4096)
getconf PAGE_SIZE

四、修复步骤

1)临时生效(重启主机失效)

# 示例:适配8G SGA
sysctl -w kernel.shmmax=8589934592
sysctl -w kernel.shmall=2097152
sysctl -w kernel.shmmni=4096

2)长期生效(写入配置文件)

vi /etc/sysctl.conf
kernel.shmmax = 8589934592
kernel.shmall = 2097152
kernel.shmmni = 4096
运行加载生效:
sysctl -p
如果你 SGA 设置为 12G:
shmmax = 12884901888
shmall = 3221225472 / 4096 = 3145728

五、极易踩坑的两个高频场景

场景 1:shmmax 单位混淆(最常见错误)

很多人直接写 8G,内核参数 只识别字节数字,不能带单位。

❌ kernel.shmmax=8G

✅ kernel.shmmax=8589934592

场景 2:一台主机多个 Oracle 实例

比如两台库,每台 SGA 8G,总 SGA 需求 16G

此时: shmmax >= 单实例最大SGA

shmall >= 所有实例SGA总和 / 4096

示例:双实例各 8G
shmmax=8589934592
shmall=4194304

六、额外配套检查:oracle 用户资源限制(ulimit)

若共享内存参数修好依旧报错,检查 oracle 用户最大进程、内存限制
su - oracle
ulimit -a
编辑 /etc/security/limits.conf
oracle   soft  memlock  unlimited
oracle   hard  memlock  unlimited
oracle   soft  nofile   65536
oracle   hard  nofile   65536
memlock 限制可锁定内存大小;使用 AMM/ASMM 建议 unlimited。

七、区分 AMM vs ASMM 带来的差异

  1. AMM(memory_target / memory_max_target)Oracle 使用 /dev/shm 临时文件系统,此时除了 shm 内核参数,还要检查 /dev/shm 挂载大小!
df -h /dev/shm
/dev/shm 大小必须 ≥ memory_max_target,否则同样启动失败。
⚠️ 如果你启用 AMM,ORA-27104 也有可能伴随 /dev/shm 不足;
Downstream 挖掘库很多开启 AMM,重点核查!

     2. ASMM(sga_target,不使用 memory_target)

只依赖上面 shmmax/shmall/shmmni,和 /dev/shm 无关。

八、完整排查顺序模板

  1. 确认数据库参数: show parameter sga_max_size; show parameter memory_max_target;

  2. 计算所需 shmmax、shmall;

  3. 修改 /etc/sysctl.conf → sysctl -p;

  4. 若启用 AMM:检查 /dev/shm 容量;

  5. 检查 oracle 用户 limits.conf memlock;

  6. 重启数据库。

九、最简故障总结

ORA-27104 = Linux System V 共享内存内核参数不足以支撑 Oracle 申请的 SGA。优先调整 kernel.shmmax(大于等于单实例 SGA 上限)、 kernel.shmall(总共享内存页数)。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12798004/viewspace-3176894/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE。ACOUG核心成员,Oracle用户组年轻专家。熟悉Oracle的体系结构,擅长Oracle数据库架构规划、SQL优化、OWI方面性能的优化。曾服务于航天、航空、机车、大型制造行业数据库的维护以及系统开发工作,开发过基于Oracle数据库的大型ERP系统。
  • 博文量
    345
  • 访问量
    2477875