ORA-00845错误根本原因是/dev/shm空间不足,需确保其大小≥MEMORY_TARGET值;解决方法包括临时扩容(mount -o remount,size=12G /dev/shm)和永久配置(/etc/fstab添加tmpfs行),并同步检查内核参数、memlock限制及AMM与HugePages兼容性。

ORA-00845 错误直接暴露 /dev/shm 大小不足
安装 Oracle 11g 时如果遇到 ORA-00845: MEMORY_TARGET is not supported on this system,根本原因不是内存不够,而是 Linux 的 /dev/shm 文件系统空间小于 SGA+PGA 总和。Oracle 11g 启用 AMM(Automatic Memory Management)时强制依赖 /dev/shm 存储共享内存段,而默认挂载大小通常是系统内存的 50%,但可能远低于你配置的 memory_target 值。
- 先查当前大小:
df -h /dev/shm,常见值是 2G 或 4G,对生产环境严重不足 - 临时扩容(重启失效):
sudo mount -o remount,size=12G /dev/shm - 永久生效:编辑
/etc/fstab,找到或添加这一行:tmpfs /dev/shm tmpfs size=12G 0 0 - 改完后执行
sudo mount -o remount /dev/shm立即应用,再确认df -h /dev/shm输出已更新
AMM 与 HugePages 冲突必须二选一
如果你计划启用 HugePages(提升大内存数据库性能),就不能用 AMM —— Oracle 官方明确不兼容。此时必须切换到 ASMM(Automatic Shared Memory Management),并手动设置 sga_target、pga_aggregate_target 等参数,同时禁用 memory_target 和 memory_max_target。
- 检查当前内存模式:
SQL> show parameter memory_target,若返回非零值,说明 AMM 已启用 - 停库后修改
spfile:ALTER SYSTEM SET memory_target=0 SCOPE=SPFILE;,再设sga_target=8G、pga_aggregate_target=4G - HugePages 配置前需计算页数:用
grep MemTotal /proc/meminfo得总内存,减去 OS 预留(如 2G),再除以大页大小(通常 2MB),结果向上取整 - 配置
/etc/sysctl.conf中vm.nr_hugepages = 6144(对应 12G),然后sysctl -p
Linux 内核参数中 shmmax/shmall 必须匹配实际需求
kernel.shmmax 决定单个共享内存段最大字节数,kernel.shmall 是系统级总页数限制。Oracle 启动时若 SGA 超过 shmmax,会降级为多个小段,带来额外开销;若总页数不足,则报 ORA-27123。
- 设
shmmax至少等于最大 SGA(如 12G →12884901888字节),不能只写 "12G",必须是数值 -
shmall单位是页(page),按 4KB 页计算:12G ÷ 4KB = 3145728,建议再加 10% 余量 - 修改后必须运行
sysctl -p,否则重启前不生效 - 验证是否加载:
sysctl kernel.shmmax和ipcs -lm输出应一致
Oracle 用户的 memlock 限制常被忽略
即使 /dev/shm 和内核参数都调大了,Oracle 进程仍可能因 RLIMIT_MEMLOCK 限制无法锁定内存,导致启动失败或运行中被 OOM killer 杀掉。这个限制由 /etc/security/limits.conf 控制,且仅对登录 shell 生效。
- 在
limits.conf中为oracle用户添加两行:oracle soft memlock unlimitedoracle hard memlock unlimited - 确保
/etc/pam.d/login包含session required pam_limits.so,否则限制不加载 - 切记:改完 limits 后必须新开一个 oracle 用户的 shell(比如
su - oracle),再运行ulimit -l查看是否显示unlimited - 静默安装或 systemd 启动服务时,该限制可能不继承,需在 service unit 文件中显式设置
LimitMEMLOCK=infinity
关键点不在“配多少”,而在“配全”——/dev/shm、内核参数、用户限制、内存管理模式四者必须协同,漏掉任意一环都可能让数据库卡在启动阶段或运行不稳定。


















