ASM磁盘添加前必须确认三件事:一是新磁盘在所有RAC节点OS层可见且权限一致;二是ASM实例已通过SCAN DISKS识别该磁盘;三是目标磁盘组冗余策略支持单盘添加(EXTERNAL/NORMAL),HIGH冗余需成对添加。
ASM磁盘添加前必须确认的三件事
oracle rac环境下在线添加asm磁盘不是“加完就生效”,而是依赖底层存储可见性、asm实例识别能力和磁盘组冗余策略的协同。跳过检查直接执行alter diskgroup ... add disk,大概率会卡在disk_repair_time超时或报ora-15032, ora-15027错误。
- 确认新磁盘已在所有RAC节点的OS层可见且权限一致:用
ls -l /dev/oracleasm/disks/(ASMLib)或ls -l /dev/mapper/xxx(UDEV)核对属主(grid:asmadmin)、权限(brw-rw----)和major/minor号是否跨节点一致 - 确认ASM实例已加载该磁盘路径:在每个节点上运行
sqlplus / as sysasm后执行SELECT path, header_status FROM v$asm_disk WHERE path LIKE '%NEW_DISK%';,返回空说明ASM尚未扫描到——此时需先运行ALTER SYSTEM SCAN DISKS; - 确认目标磁盘组使用的是
EXTERNAL或NORMAL冗余:HIGH冗余下新增磁盘必须成对添加,否则ADD DISK会拒绝执行并报ORA-15036
在线添加磁盘的正确语法与关键参数
添加操作本身是在线的,但实际重平衡(rebalance)过程会持续占用I/O资源,影响业务吞吐。别迷信“不中断”等于“无感知”——尤其当磁盘组已有大量数据时,POWER值设得过高可能引发IO争抢。
- 基础命令:
ALTER DISKGROUP <dg_name> ADD DISK '<disk_path>' NAME <disk_name>;</disk_name></disk_path></dg_name>,其中<disk_path></disk_path>必须与v$asm_disk.path中显示的路径完全一致(区分大小写,含转义符) - 控制重平衡强度:
REBALANCE POWER 3(默认值)适合多数场景;若业务低峰期可设为5加速完成;生产高峰期建议显式指定POWER 1并配合WAIT避免后台任务堆积 - 避免隐式失败:不要省略
NAME子句。未命名磁盘在后续DROP或诊断时会显示为DATA_0001这类编号名,极易混淆
为什么RAC环境容易出现“部分节点看不到新磁盘”?
这不是ASM bug,而是RAC节点间磁盘发现机制存在时间差。常见现象是节点1能查到新磁盘,节点2的v$asm_disk里始终为空,导致ADD DISK只在单节点生效,磁盘组状态异常。
- 根本原因:ASMLib/UDEV规则未在所有节点同步部署,或
oracleasm scandisks未在全部节点执行(ASMLib);UDEV场景下udevadm trigger和udevadm settle缺一不可 - 验证方法:在每个节点分别执行
asmcmd lsdsk -k,输出应完全一致;若有差异,立即检查/etc/udev/rules.d/99-oracle-asmdevices.rules内容及systemctl status oracleasm状态 - 补救措施:不建议直接重启
ohasd,优先用srvctl stop asm -n <node></node>+srvctl start asm -n <node></node>单节点重启ASM实例,比全集群重启风险更低
扩容后必须验证的两个隐藏状态
执行完ADD DISK并等待REBALANCE完成后,很多人以为万事大吉。但ASM磁盘组真正稳定需要确认两个易被忽略的状态:
-
v$asm_operation必须为空:即使STATUS显示SUCCESS,只要该视图还有记录,说明内部元数据同步未彻底完成,此时强制DROP磁盘会触发ORA-15030 -
v$asm_disk.header_status必须全为MEMBER:若存在PROVISIONED或CANDIDATE,说明该磁盘虽已加入但未完成初始化,后续IO可能失败;此时需手工执行ALTER DISKGROUP <dg_name> CHECK DISK <disk_name>;</disk_name></dg_name>
复杂点在于:这些状态在RAC各节点间并非强实时同步,务必在所有节点上逐个验证,不能只看一个节点的结果。










