问题:
Oracle RAC 集群的共享存储需要换盘 (替换旧盘/故障盘)或扩容(增加可用空间),要求在尽量不影响集群与业务的前提下,安全完成共享磁盘的替换与容量扩展。
方案:
前置准备(换盘与扩容通用)
- 备份先行 :对数据库做完整备份;OCR 用
ocrconfig -export <文件名>导出;表决盘用dd if=<voting_disk> of=<备份文件>备份。 - 存储侧规划:在新存储上划分与旧盘同等(或更大)的 LUN;扩容时额外预留空间用于 rebalance(重平衡期间需要同时容纳新旧副本数据)。
- 多路径与权限 :确认所有 RAC 节点都能看到新盘,且设备名、属主/属组、权限在全部节点保持一致(ASM 盘一般属主 grid、属组 asmadmin/asmdisk、权限 660;表决盘属主 oracle、属组 dba、权限 644)。
- 发现磁盘 :使用 ASMLIB 时执行
oracleasm scandisks、oracleasm listdisks;使用裸设备/多路径时确认lsblk、multipath -ll在所有节点 均能识别同一批设备。必要时调整asm_diskstring。 - 清空新盘 :新盘加入前先清零盘头,避免残留元数据干扰,例如
dd if=/dev/zero of=<设备> bs=4096 count=1(⚠️ 高危,务必确认设备路径,误清会破坏 ASM 元数据)。
场景一:ASM 磁盘组扩容(加盘)
适用于数据/归档等 ASM 磁盘组空间不足,需要在线增加容量。
-
查看当前磁盘组容量与状态:
sqlselect name, state, type, total_mb, free_mb, offline_disks from v$asm_diskgroup;也可用
asmcmd lsdg查看 Total_MB / Free_MB / Usable_file_MB。 -
向磁盘组添加新盘(在线操作,无需停库):
sqlalter diskgroup DATA add disk '/dev/asm-diskN';也可带 rebalance 力度:
... add disk '...' rebalance power 4; -
监控重平衡进度:
sqlselect * from v$asm_operation;通过
asm_power_limit调整重平衡力度(力度越大越快,但对业务 I/O 影响越大)。 -
验证:再次查询
v$asm_diskgroup,确认free_mb已增加、state为 MOUNTED。 -
扩容后必做检查 :若采用「新建磁盘组」方式扩容,须同步更新
db_create_file_dest参数或表空间的 default storage 属性,否则新数据文件仍会落在旧磁盘组上,新增空间无法被利用。
场景二:ASM 磁盘组换盘(替换旧盘 / 故障盘)
(1)计划内换盘(旧盘仍在线,推荐)------在线迁移法
思路:先加新盘 → 触发重平衡把数据搬过去 → 再删除旧盘 → 再次重平衡。全程在线。
-
添加新盘到目标磁盘组:
sqlalter diskgroup DATA add disk '/dev/newdisk'; -
等待重平衡完成(
v$asm_operation无记录、v$asm_diskgroup中各盘使用均衡)。 -
删除旧盘(按磁盘名删除,ASM 自动再次重平衡):
sqlalter diskgroup DATA drop disk DATA_000N;查看盘名与状态:
sqlselect group_number, disk_number, name, path, state, mode_status, mount_status from v$asm_disk; -
等待删除完成、重平衡结束,确认旧盘状态为 dropped 后即可在存储侧下线旧盘。
-
切勿中断加盘/删盘操作 :加盘过程中断(如 Ctrl+C 或连接中断)可能导致磁盘组被强制 dismount、控制文件写入报错,严重时需用
kfed修复 PST 与 disk directory 元数据,风险很高。
(2)故障盘替换(磁盘已掉线/损坏)
- 确认冗余级别:
v$asm_diskgroup.type(NORMAL/HIGH 有多副本,EXTERNAL 为单副本)。-
NORMAL/HIGH:冗余副本仍可用,直接删除坏盘再补新盘:
sqlalter diskgroup DATA drop disk DATA_000N; alter diskgroup DATA add disk '/dev/newdisk'; -
EXTERNAL:单副本,坏盘数据无冗余,需从备份恢复(RMAN restore/recover),不能仅靠加盘恢复。
-
- 用
kfed read <设备>检查盘头状态(如kfdhdb.hdrsts),辅助判断盘是否可用、是否仍属某磁盘组。 - 若盘被强制离线(state 显示 FORCING / mode_status 为 offline,或出现
_dropped前缀盘),应先确认磁盘组剩余冗余与表决盘(voting disk)状态是否正常,避免集群因冗余不足而驱逐节点。
场景三:OCR 与 Voting Disk 换盘 / 迁移
当承载 OCR 和表决盘的 LUN 需要更换时,须用集群专用命令(不能用 cp/dd 直接搬运行中的文件)。
OCR(须以 root 执行,CRS 保持运行)
-
检查并备份:
ocrcheck、ocrconfig -showbackup、ocrconfig -export <导出文件>。 -
替换/迁移 OCR 主副本(须已存在 ocrmirror,否则报 PROT-16/PROT-1):
ocrconfig -replace ocr <OCR新位置> -
替换/迁移 OCR 镜像:
ocrconfig -replace ocrmirror <OCR镜像新位置> -
在所有节点 执行
ocrcheck校验,再用crsctl check crs、crs_stat -t确认集群资源正常。
Voting Disk(须停止 CRS,以 root 执行)
-
备份:
ocrconfig -export <导出文件>,dd if=<voting_disk> of=<备份文件>。 -
所有节点停止集群:
crsctl stop crs。 -
查看当前表决盘位置:
crsctl query css votedisk。 -
添加新表决盘(CRS 停止时用
-force):crsctl add css votedisk <新位置> -force -
删除旧表决盘:
crsctl delete css votedisk <旧位置> -force -
所有节点启动集群:
crsctl start crs。 -
验证:
crsctl query css votedisk、crsctl check crs、crs_stat -t。
⚠️ 风险提示:不得在 CRS 运行时增删表决盘,否则可能造成 OCR 损坏;换盘前务必确认备份可用。
风险提示汇总
- ⚠️ 重平衡(rebalance)期间 I/O 明显上升,大磁盘组可能持续数天,务必避开业务高峰;必要时可下调
asm_power_limit或暂缓。 - ⚠️ 超大磁盘组、大量新盘加入时,ASM 实例共享池可能不足,出现 ORA-04031 导致实例 hang,需评估 ASM 内存配置。
- ⚠️ 加盘/删盘命令一旦执行不要中断,避免元数据残留需 kfed 修复。
- ⚠️ 所有节点设备名与权限必须一致,多路径未就绪会导致部分节点识别不到盘。
- ⚠️ EXTERNAL 冗余磁盘组换盘无副本保护,须走备份恢复流程。