ORA-27104是Oracle实例启动或建库时因SGA内存需求超出操作系统共享内存限制(如Linux的shmmax/shmall或Windows的锁定内存权限)而触发的系统级错误。

ORA-27104 是什么,为什么建库时突然报这个错
ORA-27104 表示 Oracle 实例启动或建库时无法满足 SGA 内存分配要求,本质是操作系统级限制被触发。它不是数据库配置写错了,而是 sga_max_size 或 sga_target 设的值超过了内核允许的最大共享内存(shmmax)或总共享内存页数(shmall)。Windows 上对应的是 Lock Pages in Memory 权限缺失或 boot.ini / BCD 中未启用 AWE;Linux 上则几乎全是 /proc/sys/kernel/shmmax 和 /proc/sys/kernel/shmall 配置偏低导致。
Linux 下修复 ORA-27104 的三步实操
建库失败后别急着删 response 文件,先确认当前限制和目标 SGA 值:
- 查当前 SGA 设置:
grep -i "sga_" /path/to/response/file.rsp(静默建库用的 response 文件) - 查系统限制:
cat /proc/sys/kernel/shmmax和cat /proc/sys/kernel/shmall - 算是否够用:若
sga_max_size=4G,则shmmax至少要 ≥ 4294967296(字节),shmall至少要 ≥sga_max_size / page_size(通常 page_size=4096,即 4G ÷ 4K ≈ 1048576)
临时生效(验证用):sudo sysctl -w kernel.shmmax=4294967296、sudo sysctl -w kernel.shmall=1048576;永久生效需写入 /etc/sysctl.conf 并执行 sysctl -p。
Windows 上遇到 ORA-27104 怎么办
Oracle 12c for Windows 不再依赖 AWE,但依然会检查锁定内存权限和页面文件设置:
- 必须给 Oracle 服务账户(如
ORACLE$<sid></sid>)授予Lock pages in memory权限,否则即使物理内存充足也会报 ORA-27104 - 确认页面文件(pagefile.sys)大小 ≥
sga_max_size+pga_aggregate_target,且不在系统盘以外的卷上被禁用 - 若使用静默建库(DBCA),response 文件中
MEMORY_PERCENTAGE不建议设过高(如 >80),改用显式SGA_SIZE和PGA_SIZE更可控
权限设置路径:本地组策略编辑器 → 计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权利指派 → “锁定内存页” → 添加 Oracle 服务账户。
建库前绕过 ORA-27104 的应急方案
如果环境受限无法调系统参数(比如云主机没 root 权限),又必须完成建库,可用以下降级策略:
- 在 response 文件中把
SGA_SIZE改为显式小值,例如1024(单位 MB),而非依赖MEMORY_PERCENTAGE - 建库完成后立刻用
sqlplus / as sysdba连入,执行alter system set sga_target=2G scope=spfile;,再重启 —— 此时只要 OS 限制已满足,就能生效 - 避免在建库阶段就压满内存:
dbca -silent -createDatabase ... -initParams "sga_target=1G,pga_aggregate_target=512M"比用 response 文件更易调试
注意:ORA-27104 的根因永远在 OS 层,不是 Oracle 参数本身有问题。很多人反复改 spfile 却忽略 shmmax,结果重装数据库也一样失败。


















