应扩容Swap至物理内存的1–2倍,优先用fallocate创建4G Swap文件并设高优先级,确保/etc/fstab含sw选项,RAC环境需全节点配置一致且路径相同,最后验证/proc/meminfo并重启实例。
Swap 分区不够时 Oracle 启动报 ORA-27102: out of memory 怎么办
oracle 在 linux 上启动失败,日志里反复出现 ora-27102: out of memory,但 free -h 显示内存还有富余——这大概率是 swap 不足触发了内核的 vm.swappiness 保守策略,或 oracle 的 sga_max_size 超过了可用虚拟内存上限。oracle 官方文档明确要求:swap 空间至少为物理内存的 1–2 倍(具体看版本和 sga 配置),不是“可有可无”。
- 别急着删旧 Swap;先用
swapon --show和cat /proc/swaps确认当前启用的 Swap 设备及优先级 - Oracle 实例启动前会做内存预检,检查的是
MemTotal + SwapTotal是否 ≥sga_max_size + pga_aggregate_target * 1.5左右,不是只看空闲内存 - 临时加 Swap 文件比重建分区快,但需确保文件系统支持(ext4/xfs 没问题,btrfs 不推荐)
用 fallocate 快速添加 4G Swap 文件(推荐线上应急)
比 dd if=/dev/zero 快得多,且不触发磁盘写满风险(只要文件系统有足够预留空间)。关键点在于权限、禁用缓存、正确启用。
- 执行前确认根目录或目标挂载点有足够空间:
df -h /或df -h /u01(Oracle 数据文件所在分区) -
fallocate -l 4G /swapfile创建后必须立即chmod 600 /swapfile,否则swapon会拒绝(内核强制校验) - 用
mkswap /swapfile格式化,再swapon -p 10 /swapfile启用并设较高优先级(避免覆盖原有 Swap 分区) - 写入
/etc/fstab时务必加sw选项:/swapfile none swap sw,pri=10 0 0;漏掉sw会导致重启后swapon -a忽略它
swapon: /dev/sdb1: failed to set up swap area: Device or resource busy 错误怎么排
常见于尝试启用已被 LVM 占用、或已挂载为普通分区的设备。不是权限问题,是设备状态冲突。
- 先运行
lsblk和pvs; vgs; lvs,确认目标设备(如/dev/sdb1)没被 PV 使用;若已属于 VG,vgreduce移除后再操作 - 检查是否被其他进程占用:
lsof /dev/sdb1或lsof +D /mnt/oldswap(如果曾挂载过) - 若设备显示 “busy” 但无进程占用,可能是内核残留引用,尝试
partprobe /dev/sdb刷新分区表,再blockdev --rereadpt /dev/sdb - 别用
swapoff -a && swapon -a全局重载——可能把正在用的 Swap 分区也关了,导致 Oracle 瞬间 OOM
Oracle RAC 环境下 Swap 配置的隐藏约束
RAC 节点间 Swap 不能共享,但必须严格一致:大小、优先级、启用状态。否则 OCR 检查或 CRS 启动阶段会静默失败。
- 用
cluvfy comp swap -n all检查所有节点 Swap 是否对齐(需在 Grid Infrastructure 环境下运行) - Swap 文件路径必须完全相同(比如都用
/swapfile),不能一个用/u01/swapfile另一个用/swapfile——CRS 会认为配置漂移 - 修改后必须逐节点执行
crsctl stop crs && crsctl start crs,不能只 reload CRS,因为 Swap 状态在ohasd初始化阶段就被固化 - Oracle 19c+ 对
vm.overcommit_memory=2更敏感,若启用了该参数,Swap 不足时直接拒绝分配大页,比ORA-27102还早一步报错
Swap 扩容不是“加完就完”,Oracle 启动时读取的是内核当前可见的总虚拟内存,所以改完必须验证 grep -i "memtotal\|swap" /proc/meminfo,再手动启动一次实例——很多问题出在以为生效了,其实 swapon 失败却没检查返回值。

















