游乐游手机版
首页/数据库/文章详情

虚拟机怎么模拟Oracle RAC共享磁盘_在VMware添加新磁盘并设置多写模式

时间:2026-04-29 10:20
VMware里添加磁盘必须关机,否则多写入器不可选 如果你直接在运行中的虚拟机上点击“添加硬盘”,会发现共享类型下拉菜单里压根没有“多写入器”这个选项——这不是偶然,而是VMware平台的硬性限制。想要启用这个关键功能,唯一的办法是:先将虚拟机的电源彻底关闭(注意,是关机,不是挂起或休眠)。然后,在

VMware里添加磁盘必须关机,否则多写入器不可选

如果你直接在运行中的虚拟机上点击“添加硬盘”,会发现共享类型下拉菜单里压根没有“多写入器”这个选项——这不是偶然,而是VMware平台的硬性限制。想要启用这个关键功能,唯一的办法是:先将虚拟机的电源彻底关闭(注意,是关机,不是挂起或休眠)。然后,在“编辑虚拟机设置 → 添加 → 硬盘 → 创建新虚拟磁盘”的完整流程里,你才能看到并选中它。

虚拟机怎么模拟Oracle RAC共享磁盘_在VMware添加新磁盘并设置多写模式

日常操作中,常见的错误现象包括:共享类型选项直接灰显、下拉菜单里只有“无”或“可读写”,或者在一台虚拟机里添加后,另一台虚拟机里根本找不到这块盘。要避免这些坑,有几个关键点必须逐一核对:

  • 电源状态是硬门槛:务必确认虚拟机状态是“已关闭”,而不是“客户机已关机”。后者可能只是操作系统退出了,但虚拟机进程仍在运行,这同样不符合条件。
  • 控制器必须独立:这块共享磁盘不能挂在默认的SCSI 0:0控制器上。最佳实践是,为它新建一个专用的SCSI控制器,比如SCSI 1:0
  • 磁盘类型有讲究:创建时必须选择“厚置备立即置零”。“精简置备”或者“厚置备延迟置零”这两种类型,都不支持多写入器模式。
  • 磁盘模式要选对:必须设置为“独立-持久”。如果误选为“独立-非持久”或“从属”,后续Oracle RAC启动时,磁盘校验会直接失败。

两台虚拟机挂载同一块磁盘:路径和配置必须完全一致

Oracle RAC对共享磁盘的一致性要求极为苛刻:所有集群节点看到的设备名、容量、扇区对齐方式、控制器绑定关系必须分毫不差。VMware可不会帮你自动同步这些元数据,全靠手动配置时的一丝不苟。

具体操作时,下面这几个细节决定了成败:

  • 先记路径,再复用:在第一台虚拟机(A)成功添加磁盘后,立刻记下它的完整数据存储路径,例如:[datastore1] rac-cluster/rac1.vmdk。注意,方括号和斜杠都是路径的一部分,并且大小写敏感。
  • 粘贴路径,别浏览:在第二台虚拟机(B)上添加时,务必选择“使用现有虚拟磁盘”,然后手动精确粘贴刚才记下的路径。切忌通过图形界面浏览选择,因为浏览可能会返回一个路径别名,导致两边路径不一致。
  • 配置镜像,如复制:B虚拟机上,SCSI控制器编号、设备节点(如SCSI 1:0)、共享类型磁盘模式这三项配置,必须与A虚拟机保持绝对一致,连一个空格都不能差。
  • 系统层验证:配置完成后,别急着安装。分别在两台虚拟机的Linux系统里执行ls -l /dev/disks/by-id/命令,确认它们识别到了相同的WWN或scsi-xxx设备名。这是RAC安装前必须通过的“一致性检查”。

Linux侧识别不到 /dev/sdX?检查udev规则和multipath

有时候,VMware层面的配置明明正确无误,但到了Linux操作系统里,同一块共享磁盘却被识别成了多个设备路径(比如同时出现在/dev/sdb/dev/sdc),导致后续的ASM(自动存储管理)无法稳定挂载。

这通常不是VMware的错,而是Linux系统多路径(multipath)机制的典型“副作用”。排查思路可以这样走:

  • 先看设备列表:运行fdisk -l | grep “Disk /dev/sd”,检查输出中是否出现了多个容量完全相同的磁盘设备。
  • 排查multipath服务:执行systemctl status multipathd,查看多路径服务是否处于活动状态。如果启用了,它可能会自动聚合这些路径,生成一个/dev/mapper/mpathx设备,而ASM通常会拒绝使用这种聚合后的设备。
  • 屏蔽或禁用:更稳妥的做法是,在/etc/multipath.conf配置文件中,将RAC共享磁盘加入黑名单(通过WWN或厂商/型号匹配),或者直接禁用multipath对这些磁盘的管理。例如,添加一行blacklist { devnode “^sd[b-z]” }(请根据实际设备名范围调整),然后重启multipathd服务。
  • 固定设备名:依赖/dev/sdX这种可能变化的设备名是RAC的大忌。行业共识是,应该通过udev规则,将磁盘固定为/dev/oracleasm这样的持久化名称,或者直接使用基于WWN的稳定软链接,例如/dev/disk/by-id/scsi-36000c29...

CBT(变更块跟踪)和多写入器冲突,必须关闭

还有一个隐藏的“坑”需要警惕:如果虚拟机启用了CBT(变更块跟踪,常用于vSphere备份加速),同时又试图开启磁盘的多写入器模式,VMware会直接报错:Cannot enable CBT on a disk with multi-writer mode enabled,并且虚拟机将无法启动。

背后的原因很直接:CBT机制需要独占磁盘的写入日志来跟踪变化,而多写入器模式允许多个虚拟机并发写入同一块磁盘,两者的底层设计从根本上就是互斥的。

  • 关闭CBT的方法:编辑虚拟机设置 → 找到“选项”页签 → 进入“高级” → 点击“配置参数”。在参数列表中,找到ctkEnabled这个参数,将其值设为false。同时,还需要找到对应具体磁盘的参数,格式如scsi0:0.ctkEnabled(请根据实际的控制器和磁盘编号替换),也将其设为false
  • 彻底重启生效:修改这些参数后,必须将虚拟机关机(不是重启操作系统),然后再开机,更改才会生效。
  • 权衡与替代方案:需要提醒的是,关闭CBT可能会影响后续基于快照的备份效率,但这对于RAC集群本身的运行没有影响。如果在生产环境中既需要CBT加速备份,又必须使用共享磁盘,那么唯一的出路是放弃虚拟磁盘,改用Raw Device Mapping(RDM)直通模式。

说到底,多写入器模式的配置步骤本身并不复杂。真正让工程师们头疼的,往往是路径一致性、Linux设备名飘移,以及CBT这类隐性的开关冲突。尤其是路径拼写差一个字符、控制器编号没对齐、或者忘了关闭CBT,都会导致OCR磁盘初始化失败。而令人无奈的是,错误日志往往只抛出一句笼统的“ASM cannot discover disk”,根本不会告诉你,问题根源其实藏在VMware的哪一层配置里。

来源:https://www.php.cn/faq/2385178.html
上一篇Berkeley DB 开源的文件数据库 下一篇Oracle数据库中怎么查找锁表原因_如何用存储过程快速定位
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis 7.0增量AOF重写RDB前导码配置详解
数据库 · 2026-07-02

Redis 7.0增量AOF重写RDB前导码配置详解

先说一个几乎所有人都踩过的典型误区:很多人把 aof-use-rdb-preamble yes 当作开启“增量重写”的开关。实际上,这个配置只干了一件事——让重写后的 AOF 文件头部带上 RDB 快照。它解决的是加载速度问题,跟“增量重写”本身的概念压根不是一回事。真正的增量重写,依赖的是 Red

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践
数据库 · 2026-07-02

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践

直接在Tornado里用SQLAlchemy同步执行SQL,结果就是阻塞IOLoop,所谓“异步框架里写同步数据库代码”,等于白搭。安全执行的关键不是“怎么写SQL”,而是“怎么不卡住事件循环”。 为什么不能在RequestHandler里直接调用session execute() 因为sessio

利用SQL触发器实现在INSERT数据时自动同步到审计表
数据库 · 2026-07-02

利用SQL触发器实现在INSERT数据时自动同步到审计表

先说结论:可以用触发器把 INSERT 数据同步到审计表,但必须用 AFTER INSERT,并且审计表的字段顺序、类型、字符集得和源表严格一致。否则,轻则写入错位、数据截断,重则直接报错、丢数据。下面把这些坑一个一个掰开说。 能,但必须用 AFTER INSERT,且审计表字段顺序、类型、字符集要

如何用SQL编写按不同工作日统计员工出勤率
数据库 · 2026-07-02

如何用SQL编写按不同工作日统计员工出勤率

在实际业务中,统计不同工作日的出勤率是HR系统里的高频需求。如果直接按日期函数分组,很容易掉进语言环境、索引失效或分母口径的坑里。下面就来拆解具体的实现要点。 必须用 CASE WHEN 将日期映射为固定 weekday 标签(如 Mon )再分组,避免语言环境导致的分组断裂;需过滤 DOW IN

Spring Boot 3动态拼接SQL为何引发严重安全漏洞
数据库 · 2026-07-02

Spring Boot 3动态拼接SQL为何引发严重安全漏洞

SQL注入漏洞的核心成因,本质上是因为用户输入直接参与了SQL语句的字符串拼接,而未采用参数化绑定机制。在MyBatis中使用${}、QueryWrapper中调用apply()与last()、JPA的@Query注解进行拼接等操作,都会绕过PreparedStatement的安全防护。动态字段必须