报错指向的“虚拟内存”通常不是加一根内存条就能解决
虚拟机安装Oracle时报“无法创建虚拟内存”,多数情况下是Linux的swap、/dev/shm不足,或Windows页面文件被限制,而不是物理内存真的坏了。 先把Oracle安装程序说的“虚拟内存”翻译成操作系统里的具体对象,再按平台补足,问题往往在十几分钟内就能定位。
报错本质:Oracle要的不是“虚拟内存”四个字
Oracle安装程序在预检查阶段会调用CVU检查内存、交换空间、共享内存和内核参数,它报“无法创建虚拟内存”时,实际上可能在说三件不同的事。
- Linux的swap不够:安装程序需要一块可扩展的交换空间来满足最低要求。
- /dev/shm太小:Oracle用共享内存跑实例,/dev/shm默认常是物理内存的一半,装库时容易被卡住。
- Windows页面文件被关闭或设得太小:系统无法为大块内存分配提供后备存储。
所以先别急着重装虚拟机,打开终端或系统属性,看清楚缺的是哪一项。
Linux下先看swap和/dev/shm
登录虚拟机,依次执行:
free -h df -h /dev/shm swapon --show
如果Swap一行全是0,说明swap没启用,如果/dev/shm只有几百MB,而你要装的Oracle版本建议共享内存至少1GB以上,就要扩容,再看内核共享内存参数:
sysctl kernel.shmmax kernel.shmall ulimit -l
kernel.shmmax小于SGA目标值时,Oracle启动和安装都可能报内存相关错误。ulimit -l太小也会影响大页和锁内存。
Windows下先看页面文件
在Windows虚拟机里,右键“此电脑”→属性→高级系统设置→性能设置→高级→更改虚拟内存,若勾选了“无分页文件”,或自定义大小只有几百MB,Oracle安装程序很容易在创建实例阶段失败,把它改到系统盘或数据盘,初始值和最大值设为物理内存的1到1.5倍,重启后再装。
Linux虚拟机安装Oracle提示无法创建虚拟内存怎么解决
这个场景在CentOS、RHEL、Ubuntu上最常见,解决顺序建议是:先补swap,再扩/dev/shm,最后调内核参数,别一上来就改shmmax,那通常不是第一道门槛。
用三条命令定位缺口
free -m df -h /dev/shm cat /proc/sys/kernel/shmmax
把结果和Oracle安装文档的最低要求对一下,以Oracle 19c为例,图形化安装建议物理内存不低于4GB,swap按物理内存规模配置,物理内存偏小时,swap给到与内存相当或略高更稳妥,业内专家指出,虚拟机的内存规划要留出宿主机和数据库后台进程的余量,不能按物理机满打满算。
swap扩容实操
以新增8GB swap文件为例:
dd if=/dev/zero of=/swapfile bs=1M count=8192 chmod 600 /swapfile mkswap /swapfile swapon /swapfile
然后写入/etc/fstab,避免重启后失效:
/swapfile swap swap defaults 0 0
执行swapon --show确认已生效,如果虚拟机磁盘空间紧张,先清理旧快照和日志,再创建swap文件。swap文件所在分区要有足够连续空间,否则dd阶段就会失败。
/dev/shm与内核参数调整
临时扩容:
mount -o remount,size=4G /dev/shm
永久生效则修改/etc/fstab,加入:
tmpfs /dev/shm tmpfs defaults,size=4G 0 0
再按SGA目标值设置共享内存参数,常见做法是让kernel.shmmax不小于单个共享内存段的最大值,kernel.shmall按页数换算,修改后执行sysctl -p,注意改完要重启Oracle安装程序,不要在原会话里硬扛。
先决条件检查脚本别跳过
Oracle安装介质里带有预检查能力,图形安装时可以先跑“检查先决条件”,命令行可用:
./runInstaller -executePrereqs
它会把内存、swap、内核参数、包依赖逐项列出来。先让检查脚本把问题列全,再一次性修,比装到一半报错再回头补效率高得多。
Windows虚拟机装Oracle报“无法创建虚拟内存”怎么处理
Windows下的“虚拟内存”就是页面文件,Oracle在创建实例、分配SGA时会向系统申请大块内存,页面文件被关闭或所在磁盘满额时,就会抛出创建虚拟内存失败。
页面文件设置路径
按前面说的路径进入“虚拟内存”窗口,取消“自动管理所有驱动器的分页文件大小”,选择系统盘,点“自定义大小”,初始大小和最大值可以设为物理内存的1倍到1.5倍,若虚拟机磁盘是动态扩展的VHD,先确认宿主机磁盘有足够剩余空间,否则页面文件写不进去。
设置完成后重启虚拟机,再检查:
wmic pagefile list brief
确认页面文件已分配。不要只改最大值不改初始值,有些安装程序在早期阶段就会申请固定大小的后备内存。
虚拟机内存预留与动态内存
如果Windows虚拟机启用了动态内存,安装Oracle时内存被宿主回收,也会表现为“无法创建虚拟内存”,在VMware或Hyper-V里给这台虚拟机设置内存预留,或者安装期间临时关闭动态内存,行业共识认为,数据库虚拟机的内存宜采用预留模式,避免宿主机内存压力传导到客户机。
VMware虚拟机安装Oracle 19c报错无法创建虚拟内存的虚拟机层排查
客户机里swap和页面文件都正常,仍然报错,就要往虚拟机配置上看。
内存超分与气球驱动
宿主机内存不够,VMware会用气球驱动回收客户机内存,Oracle安装程序申请大块内存时被拒绝,报错信息就会指向虚拟内存,处理方式很直接:在虚拟机设置里勾选“预留所有客户机内存”,或把宿主机上其他虚拟机关掉,给这台机器腾出真实内存。
快照与磁盘空间
swap文件和页面文件都要落盘,虚拟机快照链太长、数据存储剩余空间不足时,创建大文件会失败,检查数据存储剩余容量,合并或删除旧快照,再重试。虚拟内存问题有时是磁盘问题穿了件内存的外衣。
云服务器安装Oracle报错无法创建虚拟内存:规格、计费与地域怎么权衡
在云主机上装Oracle,报错逻辑和本地虚拟机一致,但多了一层规格限制,突发性能实例的CPU积分耗尽后整体性能下降,内存规格偏小的入门型实例即使有swap,安装阶段也会吃紧,扩容实例规格后,按量计费实例的费用会按新规格小时单价结算,包年包月实例则涉及补差价,操作前先看清计费规则。
北京上海IDC与本地机房的差异
在北京、上海等IDC托管场景里,物理机内存可以一次性配足,虚拟化层的内存超分比例由运维自己控制,云服务器则受实例规格族限制,内存和CPU配比固定,若只是临时装库做迁移验证,选内存型规格并按量计费更划算;长期跑生产库,包年包月加内存预留更稳。地域选择影响的是网络时延和带宽成本,不影响虚拟内存报错本身,别把排查方向带偏。
一张表看清三种“虚拟内存”的取舍
| 对象 | 所在平台 | 检查命令/路径 | 典型修复动作 |
|---|---|---|---|
| swap | Linux | swapon --show |
创建swap文件并写入fstab |
| /dev/shm | Linux | df -h /dev/shm |
remount扩容或改fstab |
| 页面文件 | Windows | 系统属性→高级→性能 | 自定义大小并重启 |
三种对象都可能被Oracle安装程序统称为“虚拟内存”,先确认平台,再对症处理,比盲目加内存有效。
修复流程清单
- 记录完整报错原文,确认是安装预检查阶段还是建库阶段。
- Linux执行
free -h、df -h /dev/shm、sysctl kernel.shmmax。 - Windows检查页面文件是否启用、所在磁盘是否满额。
- 虚拟机层确认内存预留、快照和存储剩余空间。
- 补完swap或页面文件后重启,再跑一次先决条件检查。
- 安装期间关闭动态内存,装完再按需恢复。
Q&A:虚拟机安装Oracle报错无法创建虚拟内存常见问题
虚拟机安装Oracle报错无法创建虚拟内存,加物理内存就一定有用吗?
不一定,若报错来自swap未启用或/dev/shm过小,加物理内存并不会自动补上这两项,先按平台检查交换空间和共享内存,再决定是否扩容虚拟机内存。
Linux虚拟机安装Oracle提示无法创建虚拟内存怎么解决,swap给多大合适?
物理内存较小时,swap给到与内存相当或略高;内存较大时可适当降低比例,具体以Oracle对应版本的安装文档为准(据Oracle 19c数据库安装文档),同时保证swap文件所在分区有足够空间。
VMware虚拟机安装Oracle 19c报错无法创建虚拟内存,客户机里参数都正常怎么办?
检查虚拟机是否启用了内存预留、宿主机是否内存超分、快照链是否过长,把“预留所有客户机内存”勾选后重启客户机,再执行安装程序,通常能绕过气球驱动导致的内存回收问题。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/771308.html

