广告位 · 页头(后台-模块管理-新建模块后替换此区域)

Oracle数据库RAC集群ASM磁盘标签持久化

在 Windows Server 上部署 Oracle RAC 时,ASM 磁盘标签的持久化会直接决定 OCR、投票磁盘和数据磁盘组能否在节点重启后正常挂载。这里说的持久化,并不是把标签保存在注册表某个键值里,而是让 Oracle ASM 实例每次启动时都能通过磁盘头部的 ASM 元数据稳定识别同一块物理磁盘。实际生产环境中,这一故障通常是因为 Windows 在重启后自动给共享 LUN 分配了盘符、写入了新的磁盘签名,导致 asmtool 写入的标签被破坏或无法匹配。理解 ASM 标签与 Windows 磁盘标识之间的关系,是解决这类问题的基础。

Oracle数据库RAC集群ASM磁盘标签持久化

一、Windows 下 ASM 磁盘标签到底存在哪里

ASM 磁盘标签并不是一个注册表值,也不是依赖 Windows 盘符的配置项。Oracle 在 Windows 平台上通过 %ORACLE_HOME%\BIN\asmtool.exe 或 asmtoolg.exe 给磁盘写入标签时,标签会保存在磁盘头部的 ASM 私有元数据区域中。因此,只要物理磁盘没有被重新初始化、没有被 Windows 写入新的签名,标签就不会因为盘符从 E: 变成 F: 而丢失。

需要特别区分 Windows 磁盘签名和 ASM 磁盘标签。Windows 使用磁盘签名来识别基本磁盘,通常位于磁盘主引导记录区域;而 ASM 标签是 Oracle 写入的独立元数据,包含磁盘名、故障组、磁盘组名等信息。两者可以同时存在,但如果在 ASM 使用磁盘期间运行 clean 或重新初始化磁盘,Windows 会重写签名区域,ASM 头也可能遭到破坏。这也是 RAC 共享盘必须关闭自动挂载的原因之一。

查看当前节点已经设置的 ASM 标签,可以执行以下命令:

set ORACLE_HOME=C:\app\oracle\product\19.0.0\dbhome_1
set ORACLE_SID=+ASM1
%ORACLE_HOME%\BIN\asmtool.exe -list

命令输出中会列出可发现的物理磁盘以及对应的 ASM 标签。如果某些共享磁盘没有出现,说明 ASM 发现路径可能被 Windows 脱机策略、多路径软件或磁盘签名问题阻断。

二、准备共享磁盘:关闭自动挂载与设置 SAN 策略

为了保证 ASM 标签持久化,共享磁盘在 Windows 中必须处于受控状态。第一步是关闭自动挂载。以管理员身份启动 C:\Windows\System32\diskpart.exe,执行 automount disable。该设置会写入系统服务参数,重启后仍然有效,而不是只在当前会话生效。关闭后,Windows 不会自动为新增 LUN 分配盘符,避免系统在启动阶段对共享盘进行不必要的写入。

第二步是设置 SAN 策略。对于 RAC 共享存储,建议将新发现的磁盘默认置为脱机或共享脱机状态,防止某个节点独占总线。例如在 diskpart 中执行 san policy=offlineall 或 san policy=offlineshared。具体选择取决于存储多路径软件和集群配置,但核心目标一致:不要让 Windows 把共享 LUN 当作本地盘自动联机并写签名。

diskpart
automount disable
san policy=offlineall
list disk
select disk 2
online disk
attributes disk clear readonly
clean
exit

上面示例中的 clean 会清除分区表和已有签名,仅在确认磁盘未承载有效 ASM 磁盘组时使用。对于已经分配给 ASM 的磁盘,不能随意 clean,否则磁盘头被清空,标签自然无法持久化。准备完成后,可以查看磁盘唯一标识,便于后续核对:

diskpart
select disk 2
uniqueid disk
detail disk
exit

记录下磁盘签名和序列号后,即使后续 Windows 把同一块盘识别为不同的 PhysicalDrive 编号,也能依据硬件信息快速判断是否为原盘。

三、使用 asmtool 写入并验证标签持久化

给磁盘打标签时,需要使用 Oracle 提供的 ASM 工具。命令行工具位于 %ORACLE_HOME%\BIN\asmtool.exe,图形工具为 asmtoolg.exe。无论使用哪种方式,写入动作都发生在物理磁盘层面,不经过盘符映射。常见写法是:

set ORACLE_HOME=C:\app\oracle\product\19.0.0\dbhome_1
set ORACLE_SID=+ASM1
%ORACLE_HOME%\BIN\asmtool.exe -add \\.\PhysicalDrive2 ORCL:DATA01

不同 Oracle 版本和存储厂商对路径格式的要求可能略有差异,例如某些环境使用 \\.\PhysicalDrive2\Partition0 表示分区。因此执行前应先运行 asmtool -list 确认可发现设备,必要时参考对应版本的官方命令帮助。写入标签后,不要只查看盘符或分区状态,而要用 asmtool -list 重新读取一次,确认标签出现在列表中。

验证标签是否真正持久化,至少需要做两类操作:第一,在当前节点反复执行 asmtool -list,确认标签稳定;第二,重启节点后再次执行 asmtool -list,并通过 asmcmd 的 lsdsk 命令查看磁盘组能否正常发现候选盘。asmcmd 位于 %ORACLE_HOME%\BIN\asmcmd.exe,命令如下:

set ORACLE_HOME=C:\app\oracle\product\19.0.0\dbhome_1
set ORACLE_SID=+ASM1
%ORACLE_HOME%\BIN\asmcmd.exe lsdsk --candidate

如果重启后标签仍然可见,说明 Windows 没有在启动阶段破坏 ASM 头,标签持久化策略已经生效。如果标签消失,则应重点检查磁盘是否被重新初始化、是否被其他节点写入签名,以及存储多路径是否改变了物理设备路径。

四、常见标签丢失场景与排查步骤

标签丢失最常见的原因并不是 asmtool 执行失败,而是 Windows 对共享磁盘的处理策略不当。典型表现是:安装阶段打完标签,磁盘组可以正常创建,但重启后 ASM 实例无法挂载磁盘组,日志中出现磁盘头部校验失败或磁盘不可见。此时可以先确认如下注册表项和磁盘服务状态:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mountmgr

可以在对应键值中查看 NoAutoMount 相关参数是否生效。若注册表中没有持久化成功,automount 可能在重启后恢复为自动挂载。遇到这种情况,应重新执行 diskpart 的 automount disable 并重启验证。

另一个高频问题是 MPIO 路径漂移。Windows 会通过磁盘签名和路径标识来枚举 PhysicalDrive,但多路径软件升级、HBA 驱动变化或存储端映射调整后,同一块 LUN 可能被识别为不同的 PhysicalDrive 编号。ASM 标签此时并未丢失,而是发现路径变化导致无法找到原标签。解决思路是使用存储多路径软件固定路径,而不是依赖 Windows 自动排序。可以通过 diskpart 的 detail disk 和存储管理工具核对磁盘序列号,确保 ASM 看到的是同一物理设备。

还有一种情况是管理员在扩容时误执行了 clean 或 convert gpt,导致磁盘头被重写,ASM 标签自然消失。预防措施是在磁盘准备好后用 diskpart uniqueid disk 记录签名,并将磁盘状态、路径、标签写入运维文档。RAC 环境中的所有共享磁盘都不应再由 Windows 磁盘管理器进行初始化、格式化或分配盘符。

广告位 · 文章底部(后台-模块管理替换此区域)