oracle 19c在虚拟机中启动慢的首要原因是透明大页(thp)启用,需永久禁用transparent_hugepage=never并重启;其次应调低vm.swappiness至1~5、禁用swap、关闭numa=off,并清理残留共享内存段和进程后重试。

Oracle 19c 在虚拟机中启动慢,大概率不是数据库本身的问题,而是虚拟化层与 Oracle 对底层资源的敏感性冲突导致的——特别是内存分配、CPU 调度和存储 I/O 延迟这三块。
检查透明大页(THP)是否启用
Linux 虚拟机(如 VMware 或 KVM)上默认开启的 transparent_hugepage 是 Oracle 19c 启动卡顿的头号元凶。它会让内核在启动阶段尝试合并内存页,而 Oracle 的 SGA 初始化需要大量连续物理内存,THP 的后台扫描(khugepaged)会阻塞这一过程,表现为 dbca 卡在“Creating and starting Oracle instance”长达数分钟。
- 检查命令:
cat /sys/kernel/mm/transparent_hugepage/enabled,输出含[always]即为启用 - 临时禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled - 永久禁用:在
/etc/default/grub的GRUB_CMDLINE_LINUX中添加transparent_hugepage=never,再运行grub2-mkconfig -o /boot/grub2/grub.cfg并重启 - 注意:CentOS/RHEL 7+ 和 openEuler 都需同样处理;Windows Hyper-V 虚拟机无此问题,但需确认“动态内存”已关闭
验证并调低 vm.swappiness
虚拟机内存紧张时,Linux 内核倾向将匿名页换出到 swap,而 Oracle 进程(尤其是 PMON、DBWn)对 swap 操作极度敏感。哪怕只发生少量 swap-in/out,也会拖慢实例启动和早期 checkpoint。
- 查看当前值:
cat /proc/sys/vm/swappiness,默认常为 60 或 30 - 建议设为
1或5:echo 1 > /proc/sys/vm/swappiness(临时),或写入/etc/sysctl.conf持久化 - 配套检查:
free -h确认虚拟机分配内存 ≥ 4GB(开发环境最低),且未被其他进程大量占用 - 特别注意:若虚拟机启用了 swap 分区(而非 swapfile),应直接禁用:
swapoff -a并注释/etc/fstab中 swap 行
调整 Oracle 启动参数避免争抢 CPU
虚拟机 CPU 资源受限时,Oracle 后台进程(如 LMON、LMS、VKTM)可能因调度延迟无法及时响应,导致启动流程在“等待集群同步”或“初始化共享内存”阶段挂起。
- 确保
_highest_priority_processes包含关键进程,例如:'LMON,LMD*,LMS*,VKTM'(通过show parameter _highest_priority_processes查看) - 若使用 RAC 或 ASM,检查
ps -eo pid,comm,cls,rtprio --sort=-rtprio | grep -E "(LMON|LMS)",确认cls列为ff(SCHED_FIFO)而非ts(SCHED_OTHER) - 给 oracle 用户配置 RT 权限:
oracle soft rtprio 99和oracle hard rtprio 99写入/etc/security/limits.conf - 启动后手动重载调度策略:
kill -SIGUSR2 <lmon_pid></lmon_pid>(仅 19c 需要,否则 RT 不生效)
禁用 NUMA 并校准内核共享内存参数
虚拟机通常不暴露真实 NUMA 拓扑,但 Linux 内核仍可能启用 NUMA 调度逻辑,导致 Oracle 尝试跨节点分配 SGA,引发内存访问延迟和初始化失败。
- 在 GRUB 启动参数中添加
numa=off(与transparent_hugepage=never一并加入) - 检查
kernel.shmall和kernel.shmmax是否足够:若 SGA_TARGET 设为 2GB,则shmmax至少为2147483648,shmall至少为shmall = shmmax / PAGE_SIZE(PAGE_SIZE 通常为 4096) - 运行
ipcs -lm确认最大共享内存段尺寸与设置一致 - 注意:VMware Workstation/Player 默认不模拟 NUMA,但 ESXi 虚拟机若启用了“NUMA 控制器”,需在 VM 设置中关闭
真正容易被忽略的是:这些优化必须在安装前完成。一旦 dbca 已失败过一次,其残留的临时文件(如 $ORACLE_BASE/cfgtoollogs/dbca 下的日志)和未清理的共享内存段(ipcs -m)可能干扰下一次启动。每次调整后,务必执行 ipcs -m | awk '{print $2}' | xargs -I {} ipcrm -m {} 2>/dev/null 清理旧段,并用 ps aux | grep ora_ | grep -v grep | awk '{print $2}' | xargs kill -9 彻底终止残余进程——再重试。











