Oracle ASM Diskgroup 扩容操作
·
Oracle ASM Diskgroup 扩容操作
文档概述
本文档描述如何通过 grid 用户 + sqlplus + sysasm 的方式对 ASM diskgroup 进行扩容操作。
两种扩容方式
- 向现有 Diskgroup 添加磁盘 - 适用于现有diskgroup空间不足的场景
- 创建新的 Diskgroup - 适用于需要隔离存储、不同性能要求或新业务场景
一、环境准备与检查
1.1 切换到 grid 用户并连接 ASM 实例
su - grid
sqlplus / as sysasm
1.2 检查当前 ASM 实例状态
-- 查看ASM实例状态
SELECT instance_name, status, version FROM v$instance;
-- 查看所有diskgroup状态
SELECT name, state, type, total_mb, free_mb,
ROUND((total_mb-free_mb)/total_mb*100, 2) as used_pct
FROM v$asm_diskgroup;
-- 查看diskgroup详细信息(包括冗余级别)
SELECT group_number, name, allocation_unit_size, state, type,
total_mb, free_mb, required_mirror_free_mb, usable_file_mb
FROM v$asm_diskgroup;
-- 查看现有磁盘分布
SELECT group_number, disk_number, name, path, total_mb, free_mb,
header_status, mode_status, state
FROM v$asm_disk
ORDER BY group_number, disk_number;
1.3 检查磁盘发现路径
-- 查看当前磁盘发现字符串
SELECT value FROM v$parameter WHERE name = 'asm_diskstring';
-- 查看可被ASM发现的磁盘(包括未使用的)
SELECT path, header_status, mode_status, state
FROM v$asm_disk
WHERE header_status IN ('CANDIDATE', 'FORMER', 'MEMBER');
header_status 说明:
CANDIDATE- 可以被添加到diskgroup的磁盘MEMBER- 已经是某个diskgroup成员的磁盘FORMER- 曾经是diskgroup成员但已被删除的磁盘
二、方案一:向现有 Diskgroup 添加磁盘
2.1 前置准备
2.1.1 在操作系统层准备新磁盘
方式1:使用 ASMLib(如果已配置)
# 以root用户执行
oracleasm createdisk DISK5 /dev/sdc1
oracleasm createdisk DISK6 /dev/sdd1
# 扫描新磁盘
oracleasm scandisks
oracleasm listdisks
方式2:使用 UDEV(推荐用于Oracle 12c及以上)
# 以root用户执行
# 编辑 /etc/udev/rules.d/99-oracle-asmdevices.rules
# 添加规则,例如:
KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="<SCSI_ID>", OWNER="grid", GROUP="asmadmin", MODE="0660"
# 重新加载udev规则
udevadm control --reload-rules
udevadm trigger
2.1.2 验证磁盘可被 ASM 发现
# 以grid用户执行
sqlplus / as sysasm
-- 查看新磁盘是否可被发现
SELECT path, header_status
FROM v$asm_disk
WHERE header_status = 'CANDIDATE';
2.2 添加磁盘到现有 Diskgroup
2.2.1 添加单个磁盘
-- 基本语法
ALTER DISKGROUP <diskgroup_name> ADD DISK '<disk_path>';
-- 示例:向DATA diskgroup添加一个磁盘
ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5';
-- 指定磁盘名称(可选)
ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5' NAME DISK5;
-- 指定磁盘大小(可选,单位:MB、GB、TB)
ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5' SIZE 100G;
2.2.2 添加多个磁盘
-- 同时添加多个磁盘
ALTER DISKGROUP DATA ADD DISK
'/dev/oracleasm/disks/DISK5' NAME DISK5,
'/dev/oracleasm/disks/DISK6' NAME DISK6,
'/dev/oracleasm/disks/DISK7' NAME DISK7;
-- 使用通配符批量添加(需要确保只匹配预期磁盘)
ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK*';
2.2.3 控制 Rebalance 行为
-- 添加磁盘但不立即rebalance
ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5' NOCHECK;
-- 稍后手动触发rebalance
ALTER DISKGROUP DATA REBALANCE;
-- 指定rebalance power(1-11,默认值由asm_power_limit参数控制)
ALTER DISKGROUP DATA ADD DISK '/dev/oracleasm/disks/DISK5' REBALANCE POWER 5;
-- 修改默认rebalance power
ALTER SYSTEM SET asm_power_limit = 8;
2.3 监控 Rebalance 进度
-- 查看正在进行的rebalance操作
SELECT group_number, operation, state, power,
actual, sofar, est_work, est_rate, est_minutes
FROM v$asm_operation;
-- 详细的rebalance进度
SELECT group_number, operation, state, power, actual, sofar, est_work,
ROUND(sofar/est_work*100, 2) as pct_done,
est_minutes as est_min_remaining
FROM v$asm_operation
WHERE operation = 'REBAL';
-- 持续监控(每10秒刷新一次)
SELECT TO_CHAR(SYSDATE, 'HH24:MI:SS') as time,
group_number, operation, state, power,
ROUND(sofar/est_work*100, 2) as pct_done,
est_minutes
FROM v$asm_operation
WHERE operation = 'REBAL';
-- 执行后等待10秒,重复执行查看进度
2.4 验证磁盘添加成功
-- 检查新磁盘状态
SELECT group_number, name, path, total_mb, free_mb, state, mode_status
FROM v$asm_disk
WHERE name IN ('DISK5', 'DISK6', 'DISK7');
-- 检查diskgroup总容量变化
SELECT name, state, total_mb, free_mb,
ROUND(free_mb/total_mb*100, 2) as free_pct
FROM v$asm_diskgroup
WHERE name = 'DATA';
-- 检查磁盘均衡性(各磁盘使用率应该接近)
SELECT d.name as diskgroup, dk.name as disk,
dk.total_mb, dk.free_mb,
ROUND((dk.total_mb-dk.free_mb)/dk.total_mb*100, 2) as used_pct
FROM v$asm_diskgroup d, v$asm_disk dk
WHERE d.group_number = dk.group_number
AND d.name = 'DATA'
ORDER BY d.name, dk.name;
三、方案二:创建新的 Diskgroup
3.1 前置准备
参考 2.1 节准备新磁盘,确保磁盘状态为 CANDIDATE。
3.2 创建 Diskgroup
3.2.1 基本语法
CREATE DISKGROUP <diskgroup_name>
[EXTERNAL | NORMAL | HIGH] REDUNDANCY
DISK '<disk_path1>' [NAME <disk_name1>] [SIZE <size>],
'<disk_path2>' [NAME <disk_name2>] [SIZE <size>],
...
[ATTRIBUTE '<attribute_name>' = '<value>'];
冗余级别说明:
EXTERNAL- 外部冗余(不做镜像,依赖存储设备自身冗余),至少需要1个磁盘NORMAL- 正常冗余(双向镜像),至少需要2个failure groupHIGH- 高冗余(三向镜像),至少需要3个failure group
3.2.2 创建 EXTERNAL 冗余 Diskgroup
-- 示例:创建名为FRA的外部冗余diskgroup
CREATE DISKGROUP FRA EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/FRA1' NAME FRA1,
'/dev/oracleasm/disks/FRA2' NAME FRA2,
'/dev/oracleasm/disks/FRA3' NAME FRA3;
-- 使用通配符
CREATE DISKGROUP FRA EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/FRA*';
3.2.3 创建 NORMAL 冗余 Diskgroup(推荐)
-- 不指定failure group(ASM自动分配)
CREATE DISKGROUP DATA NORMAL REDUNDANCY
DISK '/dev/oracleasm/disks/DATA1' NAME DATA1,
'/dev/oracleasm/disks/DATA2' NAME DATA2,
'/dev/oracleasm/disks/DATA3' NAME DATA3,
'/dev/oracleasm/disks/DATA4' NAME DATA4;
-- 手动指定failure group(推荐,用于跨存储控制器或机柜)
CREATE DISKGROUP DATA NORMAL REDUNDANCY
FAILGROUP FG1 DISK
'/dev/oracleasm/disks/DATA1' NAME DATA1,
'/dev/oracleasm/disks/DATA2' NAME DATA2
FAILGROUP FG2 DISK
'/dev/oracleasm/disks/DATA3' NAME DATA3,
'/dev/oracleasm/disks/DATA4' NAME DATA4;
3.2.4 创建 HIGH 冗余 Diskgroup
-- 至少需要3个failure group
CREATE DISKGROUP CRITICAL HIGH REDUNDANCY
FAILGROUP FG1 DISK
'/dev/oracleasm/disks/CRIT1' NAME CRIT1,
'/dev/oracleasm/disks/CRIT2' NAME CRIT2
FAILGROUP FG2 DISK
'/dev/oracleasm/disks/CRIT3' NAME CRIT3,
'/dev/oracleasm/disks/CRIT4' NAME CRIT4
FAILGROUP FG3 DISK
'/dev/oracleasm/disks/CRIT5' NAME CRIT5,
'/dev/oracleasm/disks/CRIT6' NAME CRIT6;
3.2.5 设置 Diskgroup 属性
-- 创建时指定属性
CREATE DISKGROUP DATA NORMAL REDUNDANCY
DISK '/dev/oracleasm/disks/DATA*'
ATTRIBUTE 'compatible.asm' = '12.1.0.0',
'compatible.rdbms' = '12.1.0.0',
'au_size' = '4M';
-- 创建后修改属性
ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.asm' = '12.2.0.0';
ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.rdbms' = '12.2.0.0';
常用属性:
au_size- Allocation Unit大小(1M、2M、4M、8M、16M、32M、64M),创建后不可修改compatible.asm- ASM兼容性版本compatible.rdbms- 数据库兼容性版本disk_repair_time- 磁盘离线后自动drop前的等待时间(默认3.6小时)
3.3 挂载和卸载 Diskgroup
-- 挂载diskgroup
ALTER DISKGROUP FRA MOUNT;
-- 卸载diskgroup
ALTER DISKGROUP FRA DISMOUNT;
-- 强制卸载(有文件打开时使用,慎用)
ALTER DISKGROUP FRA DISMOUNT FORCE;
-- 查看diskgroup挂载状态
SELECT name, state, type FROM v$asm_diskgroup;
3.4 验证 Diskgroup 创建成功
-- 查看新diskgroup信息
SELECT name, state, type, total_mb, free_mb, usable_file_mb,
offline_disks, required_mirror_free_mb
FROM v$asm_diskgroup
WHERE name = 'FRA';
-- 查看diskgroup中的磁盘
SELECT group_number, disk_number, name, path,
failgroup, total_mb, free_mb, state
FROM v$asm_disk
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'FRA')
ORDER BY failgroup, disk_number;
-- 查看diskgroup属性
SELECT group_number, name, value
FROM v$asm_attribute
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'FRA')
ORDER BY name;
四、完整操作示例
示例1:向现有 DATA diskgroup 添加2个磁盘
# 1. 以root用户准备磁盘(使用ASMLib)
su - root
oracleasm createdisk NEWDISK1 /dev/sde1
oracleasm createdisk NEWDISK2 /dev/sdf1
oracleasm scandisks
# 2. 切换到grid用户
su - grid
# 3. 连接ASM实例
sqlplus / as sysasm
-- 4. 检查磁盘可被发现
SELECT path, header_status FROM v$asm_disk WHERE header_status = 'CANDIDATE';
-- 5. 查看当前diskgroup状态
SELECT name, total_mb, free_mb FROM v$asm_diskgroup WHERE name = 'DATA';
-- 6. 添加磁盘(使用较低的rebalance power避免影响性能)
ALTER DISKGROUP DATA ADD DISK
'/dev/oracleasm/disks/NEWDISK1' NAME NEWDISK1,
'/dev/oracleasm/disks/NEWDISK2' NAME NEWDISK2
REBALANCE POWER 3;
-- 7. 监控rebalance进度
SELECT operation, state, power, ROUND(sofar/est_work*100, 2) as pct_done, est_minutes
FROM v$asm_operation;
-- 8. 等待rebalance完成(state变为空,表示已完成)
-- 重复执行上面的查询,直到没有返回行
-- 9. 验证磁盘添加成功
SELECT name, total_mb, free_mb FROM v$asm_diskgroup WHERE name = 'DATA';
SELECT name, path, total_mb, state FROM v$asm_disk
WHERE name IN ('NEWDISK1', 'NEWDISK2');
示例2:创建新的 FRA diskgroup(EXTERNAL冗余)
# 1. 以root用户准备磁盘
su - root
oracleasm createdisk FRA1 /dev/sdg1
oracleasm createdisk FRA2 /dev/sdh1
oracleasm createdisk FRA3 /dev/sdi1
oracleasm scandisks
# 2. 切换到grid用户
su - grid
sqlplus / as sysasm
-- 3. 检查磁盘可被发现
SELECT path, header_status FROM v$asm_disk WHERE header_status = 'CANDIDATE';
-- 4. 创建diskgroup
CREATE DISKGROUP FRA EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/FRA1' NAME FRA1,
'/dev/oracleasm/disks/FRA2' NAME FRA2,
'/dev/oracleasm/disks/FRA3' NAME FRA3
ATTRIBUTE 'compatible.asm' = '12.1.0.0',
'compatible.rdbms' = '12.1.0.0';
-- 5. 验证创建成功
SELECT name, state, type, total_mb, free_mb FROM v$asm_diskgroup WHERE name = 'FRA';
-- 6. 查看磁盘分布
SELECT name, path, total_mb, free_mb, state FROM v$asm_disk
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'FRA');
示例3:创建 NORMAL 冗余的 DATADG diskgroup(指定failure group)
# 1. 准备磁盘(假设已完成)
su - grid
sqlplus / as sysasm
-- 2. 创建带failure group的diskgroup
CREATE DISKGROUP DATADG NORMAL REDUNDANCY
FAILGROUP CONTROLLER1 DISK
'/dev/oracleasm/disks/DATADG1' NAME DATADG1 SIZE 200G,
'/dev/oracleasm/disks/DATADG2' NAME DATADG2 SIZE 200G
FAILGROUP CONTROLLER2 DISK
'/dev/oracleasm/disks/DATADG3' NAME DATADG3 SIZE 200G,
'/dev/oracleasm/disks/DATADG4' NAME DATADG4 SIZE 200G
ATTRIBUTE 'compatible.asm' = '12.2.0.0',
'compatible.rdbms' = '12.2.0.0',
'au_size' = '4M';
-- 3. 验证failure group配置
SELECT d.name as diskgroup, dk.failgroup, dk.name as disk, dk.total_mb
FROM v$asm_diskgroup d, v$asm_disk dk
WHERE d.group_number = dk.group_number
AND d.name = 'DATADG'
ORDER BY dk.failgroup, dk.name;
五、常见管理操作
5.1 删除磁盘
-- 从diskgroup中删除磁盘(会触发rebalance)
ALTER DISKGROUP DATA DROP DISK DISK5;
-- 删除多个磁盘
ALTER DISKGROUP DATA DROP DISK DISK5, DISK6;
-- 强制删除(慎用)
ALTER DISKGROUP DATA DROP DISK DISK5 FORCE;
5.2 调整 Rebalance Power
-- 查看当前rebalance power
SHOW PARAMETER asm_power_limit;
-- 动态调整正在进行的rebalance的power
ALTER DISKGROUP DATA REBALANCE POWER 8;
-- 修改系统默认值
ALTER SYSTEM SET asm_power_limit = 6;
5.3 删除 Diskgroup
-- 删除diskgroup(必须先卸载)
ALTER DISKGROUP FRA DISMOUNT;
DROP DISKGROUP FRA;
-- 删除diskgroup及其所有文件(慎用!)
DROP DISKGROUP FRA INCLUDING CONTENTS;
-- 强制删除(即使有文件也删除,极度危险!)
DROP DISKGROUP FRA FORCE INCLUDING CONTENTS;
5.4 检查和修复
-- 检查diskgroup一致性
ALTER DISKGROUP DATA CHECK ALL;
-- 检查特定磁盘
ALTER DISKGROUP DATA CHECK DISK DISK5;
-- 修复diskgroup(通常在检查发现问题后执行)
ALTER DISKGROUP DATA MOUNT FORCE;
六、监控和诊断SQL
6.1 容量监控
-- 各diskgroup容量概览
SELECT name, state, type,
ROUND(total_mb/1024, 2) as total_gb,
ROUND(free_mb/1024, 2) as free_gb,
ROUND((total_mb-free_mb)/total_mb*100, 2) as used_pct,
ROUND(usable_file_mb/1024, 2) as usable_gb
FROM v$asm_diskgroup
ORDER BY name;
-- 磁盘级别容量分布
SELECT dg.name as diskgroup, d.name as disk, d.path,
ROUND(d.total_mb/1024, 2) as total_gb,
ROUND(d.free_mb/1024, 2) as free_gb,
ROUND((d.total_mb-d.free_mb)/d.total_mb*100, 2) as used_pct
FROM v$asm_diskgroup dg, v$asm_disk d
WHERE dg.group_number = d.group_number
ORDER BY dg.name, d.name;
6.2 性能监控
-- 磁盘I/O统计
SELECT dg.name as diskgroup, d.name as disk,
d.reads, d.writes,
ROUND(d.read_time/d.reads, 2) as avg_read_ms,
ROUND(d.write_time/d.writes, 2) as avg_write_ms
FROM v$asm_diskgroup dg, v$asm_disk_stat d
WHERE dg.group_number = d.group_number
AND d.reads > 0
ORDER BY dg.name, d.name;
-- 当前操作统计
SELECT group_number, operation, state, power, sofar, est_work,
ROUND(sofar/est_work*100, 2) as pct_done
FROM v$asm_operation;
6.3 健康检查
-- 检查磁盘状态(应该全部为NORMAL)
SELECT dg.name as diskgroup, d.name as disk, d.path,
d.mode_status, d.state, d.header_status
FROM v$asm_diskgroup dg, v$asm_disk d
WHERE dg.group_number = d.group_number
AND d.state != 'NORMAL';
-- 检查diskgroup状态(应该全部为MOUNTED)
SELECT name, state, type, offline_disks
FROM v$asm_diskgroup
WHERE state != 'MOUNTED' OR offline_disks > 0;
七、注意事项和最佳实践
7.1 容量规划
- NORMAL冗余:可用空间约为总空间的 50%(双向镜像)
- HIGH冗余:可用空间约为总空间的 33%(三向镜像)
- EXTERNAL冗余:可用空间约为总空间的 100%(无镜像)
- 建议diskgroup使用率不超过 80%,预留空间用于rebalance和故障恢复
7.2 Rebalance 性能
- asm_power_limit 参数范围:0-11(0表示禁用自动rebalance)
- 生产环境建议值:2-5(避免影响业务性能)
- 维护窗口建议值:8-11(快速完成rebalance)
- Rebalance期间可能会增加I/O负载和CPU使用率
7.3 磁盘准备
- 确保磁盘权限正确:
chown grid:asmadmin,权限0660 - 推荐使用 UDEV 而非 ASMLib(Oracle 12c及以上)
- 磁盘路径应该是原始设备(raw device)或块设备,不要使用文件系统
7.4 Failure Group 规划
- NORMAL冗余:至少2个failure group,建议将不同failure group的磁盘放在不同存储控制器上
- HIGH冗余:至少3个failure group
- Failure group应该基于物理故障域(存储控制器、机柜、电源)
7.5 兼容性设置
compatible.asm和compatible.rdbms一旦提升,不可降级- 提升兼容性前务必确认所有节点版本一致
- 建议保持与当前ASM版本一致,除非需要使用新特性
7.6 备份建议
-
扩容前备份当前配置:
SELECT * FROM v$asm_diskgroup; SELECT * FROM v$asm_disk; SELECT * FROM v$asm_attribute; -
对于生产环境,建议在维护窗口执行扩容操作
-
确保有数据库备份(RMAN备份)
八、回滚方案
8.1 添加磁盘失败回滚
-- 如果添加磁盘命令失败,ASM会自动回滚
-- 可以查看alert log确认:
-- 路径:$ORACLE_BASE/diag/asm/+asm/<instance_name>/trace/alert_<instance_name>.log
-- 如果磁盘已添加但需要移除
ALTER DISKGROUP DATA DROP DISK <disk_name>;
8.2 创建Diskgroup失败回滚
-- 创建失败通常会自动清理,如果diskgroup处于异常状态
ALTER DISKGROUP <diskgroup_name> DISMOUNT FORCE;
DROP DISKGROUP <diskgroup_name> FORCE INCLUDING CONTENTS;
-- 清理磁盘头信息(使用dd命令,慎用!)
-- 在Linux上以root用户执行:
-- dd if=/dev/zero of=/dev/sdx bs=1M count=100
8.3 Rebalance 中断处理
-- 检查rebalance状态
SELECT * FROM v$asm_operation;
-- 如果需要停止rebalance(会在下次操作时自动继续)
-- ASM不支持直接取消rebalance,但可以降低power减少影响
ALTER DISKGROUP DATA REBALANCE POWER 1;
-- 如果ASM实例重启,rebalance会自动恢复
九、故障处理
9.1 磁盘添加失败
可能原因:
- 磁盘未被ASM发现(检查asm_diskstring参数)
- 磁盘权限不正确
- 磁盘已被其他diskgroup使用
- 磁盘有文件系统或分区表
诊断步骤:
-- 检查磁盘是否可被发现
SELECT path, header_status FROM v$asm_disk WHERE path LIKE '%磁盘路径%';
-- 检查ASM alert log
-- $ORACLE_BASE/diag/asm/+asm/<instance_name>/trace/alert_<instance_name>.log
9.2 Rebalance 长时间未完成
可能原因:
- Power设置过低
- 系统I/O负载高
- 磁盘性能问题
解决方法:
-- 提高rebalance power
ALTER DISKGROUP DATA REBALANCE POWER 8;
-- 检查I/O瓶颈
SELECT * FROM v$asm_disk_stat WHERE reads > 0;
9.3 Diskgroup 空间不足
-- 检查空间使用情况
SELECT name, total_mb, free_mb, usable_file_mb,
ROUND(free_mb/total_mb*100, 2) as free_pct
FROM v$asm_diskgroup;
-- 临时解决:删除旧备份或归档日志
-- 长期解决:添加更多磁盘
十、参考信息
10.1 相关视图
v$asm_diskgroup- Diskgroup信息v$asm_disk- 磁盘信息v$asm_disk_stat- 磁盘性能统计v$asm_operation- 当前操作(rebalance等)v$asm_attribute- Diskgroup属性v$asm_client- 使用ASM的数据库实例v$asm_file- ASM文件信息v$asm_template- ASM模板
10.2 重要参数
asm_diskstring- 磁盘发现路径asm_power_limit- Rebalance默认power(1-11)asm_diskgroups- 实例启动时自动挂载的diskgroup列表
10.3 常用命令速查
-- 查看所有diskgroup
SELECT name, state, total_mb, free_mb FROM v$asm_diskgroup;
-- 查看所有磁盘
SELECT name, path, total_mb, state FROM v$asm_disk WHERE header_status = 'MEMBER';
-- 添加磁盘
ALTER DISKGROUP <dg> ADD DISK '<path>' NAME <name>;
-- 删除磁盘
ALTER DISKGROUP <dg> DROP DISK <disk_name>;
-- 挂载/卸载
ALTER DISKGROUP <dg> MOUNT;
ALTER DISKGROUP <dg> DISMOUNT;
-- 监控rebalance
SELECT operation, state, ROUND(sofar/est_work*100,2) as pct FROM v$asm_operation;
文档版本
- 版本:1.0
- 创建日期:2026-03-11
- 适用版本:Oracle Database 11g及以上
- 最后更新:2026-03-11
更多推荐



所有评论(0)