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() 系统调用失败。常见出现场景:
修改
sga_target / sga_max_size后重启数据库新建数据库实例
主机刚重启,内核参数未持久化
# /etc/sysctl.conf kernel.shmmax # 单个共享内存段最大大小(字节) kernel.shmmni # 系统最大共享内存段数量 kernel.shmall # 系统所有共享内存总页数(PAGE_SIZE一般4K)
shmmax ≥ SGA_MAX_SIZE(单位:字节)
8G = 8 * 1024 * 1024 * 1024 = 8589934592
shmall:系统共享内存总页数一页默认 4096 字节
shmall >= SGA_MAX_SIZE / 40968G →
>= 2097152
shmmni 建议至少
4096
sysctl kernel.shmmax kernel.shmall kernel.shmmni # 查看系统页大小(一般4096) getconf PAGE_SIZE

# 示例:适配8G SGA sysctl -w kernel.shmmax=8589934592 sysctl -w kernel.shmall=2097152 sysctl -w kernel.shmmni=4096
vi /etc/sysctl.conf kernel.shmmax = 8589934592 kernel.shmall = 2097152 kernel.shmmni = 4096
sysctl -p
如果你 SGA 设置为 12G:shmmax = 12884901888shmall = 3221225472 / 4096 = 3145728
很多人直接写
8G,内核参数
只识别字节数字,不能带单位。
❌
kernel.shmmax=8G
✅
kernel.shmmax=8589934592
比如两台库,每台 SGA 8G,总 SGA 需求 16G
此时:
shmmax >= 单实例最大SGA
shmall >= 所有实例SGA总和 / 4096
shmmax=8589934592 shmall=4194304
oracle 用户最大进程、内存限制su - oracle ulimit -a
/etc/security/limits.conforacle soft memlock unlimited oracle hard memlock unlimited oracle soft nofile 65536 oracle hard nofile 65536
memlock限制可锁定内存大小;使用 AMM/ASMM 建议 unlimited。
/dev/shm 挂载大小!df -h /dev/shm
⚠️ 如果你启用 AMM,ORA-27104 也有可能伴随 /dev/shm 不足;Downstream 挖掘库很多开启 AMM,重点核查!
2. ASMM(sga_target,不使用 memory_target)
只依赖上面
shmmax/shmall/shmmni,和 /dev/shm 无关。
确认数据库参数:
show parameter sga_max_size; show parameter memory_max_target;
计算所需 shmmax、shmall;
修改
/etc/sysctl.conf →
sysctl -p;
若启用 AMM:检查
/dev/shm 容量;
检查 oracle 用户 limits.conf memlock;
重启数据库。
kernel.shmmax(大于等于单实例 SGA 上限)、
kernel.shmall(总共享内存页数)。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12798004/viewspace-3176894/ ,如需转载,请注明出处,否则将追究法律责任。