外观
Oracle ASM 磁盘组管理最佳实践
ASM(Automatic Storage Management)是Oracle提供的专用存储管理解决方案,用于简化数据库存储管理。ASM磁盘组是ASM存储的基本管理单元,包含多个磁盘设备,并提供冗余、条带化和自动平衡功能。对于DBA而言,掌握ASM磁盘组的管理是保障数据库存储可靠性和性能的关键。
ASM 磁盘组核心特性
ASM磁盘组具有以下核心特性,使其成为Oracle数据库存储的理想选择:
- 自动负载平衡:ASM会自动在磁盘组内的所有磁盘上平衡数据,确保I/O负载均匀分布
- 冗余保护:支持外部冗余、normal冗余和high冗余三种冗余级别
- 条带化:支持粗粒度条带化(1MB)和细粒度条带化(128KB)
- 自动故障检测和修复:能够检测并修复磁盘故障
- 动态扩展:支持在线添加磁盘和扩容
- 简化管理:统一管理数据库存储,减少DBA的存储管理工作量
ASM 磁盘准备
在创建ASM磁盘组之前,需要准备好磁盘设备。以下是几种常见的磁盘准备方式:
ASMFD(ASM Filter Driver)
ASMFD是Oracle 12c及以上版本提供的磁盘管理解决方案,可以简化磁盘管理,防止第三方工具意外修改ASM磁盘:
bash
# 安装ASMFD
asmcmd afd_label DATA1 /dev/sdb1 --init
asmcmd afd_label DATA2 /dev/sdc1 --init
asmcmd afd_label DATA3 /dev/sdd1 --init
# 查看已标记的ASMFD磁盘
asmcmd afd_lsdskASMLib
在Linux系统上,ASMLib是一种常用的ASM磁盘管理方式,提供了简单的磁盘标识和管理界面:
bash
# 创建ASMLib磁盘
oracleasm createdisk DATA1 /dev/sdb1
oracleasm createdisk DATA2 /dev/sdc1
oracleasm createdisk DATA3 /dev/sdd1
# 列出ASMLib磁盘
oracleasm listdisks
# 查看ASMLib磁盘详细信息
oracleasm querydisk -p DATA1裸设备或逻辑卷
对于某些环境,可能需要使用裸设备或逻辑卷,特别是在没有ASMLib或ASMFD的情况下:
bash
# 创建逻辑卷
lvcreate -n lv_data1 -L 100G vg_oracle
lvcreate -n lv_data2 -L 100G vg_oracle
lvcreate -n lv_data3 -L 100G vg_oracle
# 设置权限(必须正确设置,否则ASM无法访问)
chown grid:asmadmin /dev/mapper/vg_oracle-lv_data*
chmod 660 /dev/mapper/vg_oracle-lv_data*ASM 磁盘组创建
前提条件
- ASM实例已安装并运行
- 磁盘设备已准备就绪
- 已配置ASM实例的参数文件
- 已确保磁盘设备的权限正确
创建ASM磁盘组的步骤
检查可用磁盘
在创建磁盘组之前,先检查可用磁盘,确保磁盘处于候选状态:
sql
-- 使用ASMCMD检查可用磁盘
asmcmd lsdsk -p
-- 或使用SQL*Plus查询
SELECT path, header_status, mode_status, state FROM v$asm_disk;创建外部冗余磁盘组
外部冗余依赖于存储硬件提供的冗余保护,适用于具有RAID保护的存储,如SAN或NAS:
sql
-- 创建外部冗余磁盘组
CREATE DISKGROUP data EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/DATA1',
'/dev/oracleasm/disks/DATA2',
'/dev/oracleasm/disks/DATA3'
ATTRIBUTE 'compatible.asm' = '19.0.0.0.0',
'compatible.rdbms' = '19.0.0.0.0',
'au_size' = '4M',
'sector_size' = '512';创建Normal冗余磁盘组
Normal冗余提供双向镜像保护,至少需要2个故障组,适用于对数据安全性要求较高的环境,如核心业务系统:
sql
-- 创建Normal冗余磁盘组
CREATE DISKGROUP recovery NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/oracleasm/disks/RECO1', '/dev/oracleasm/disks/RECO2'
FAILGROUP fg2 DISK '/dev/oracleasm/disks/RECO3', '/dev/oracleasm/disks/RECO4'
ATTRIBUTE 'compatible.asm' = '19.0.0.0.0',
'compatible.rdbms' = '19.0.0.0.0',
'au_size' = '4M',
'disk_repair_time' = '4h';创建High冗余磁盘组
High冗余提供三向镜像保护,至少需要3个故障组,适用于对数据安全性要求极高的环境,如金融核心系统:
sql
-- 创建High冗余磁盘组
CREATE DISKGROUP redo HIGH REDUNDANCY
FAILGROUP fg1 DISK '/dev/oracleasm/disks/REDO1', '/dev/oracleasm/disks/REDO2'
FAILGROUP fg2 DISK '/dev/oracleasm/disks/REDO3', '/dev/oracleasm/disks/REDO4'
FAILGROUP fg3 DISK '/dev/oracleasm/disks/REDO5', '/dev/oracleasm/disks/REDO6'
ATTRIBUTE 'compatible.asm' = '19.0.0.0.0',
'compatible.rdbms' = '19.0.0.0.0',
'au_size' = '4M';ASM 磁盘组扩容
在线添加磁盘
当ASM磁盘组空间不足时,可以在线添加新磁盘,无需停机:
sql
-- 向磁盘组添加单个磁盘
ALTER DISKGROUP data ADD DISK '/dev/oracleasm/disks/DATA4';
-- 向磁盘组添加多个磁盘并指定故障组
ALTER DISKGROUP recovery ADD
FAILGROUP fg1 DISK '/dev/oracleasm/disks/RECO5'
FAILGROUP fg2 DISK '/dev/oracleasm/disks/RECO6';
-- 使用通配符添加多个磁盘
ALTER DISKGROUP data ADD DISK '/dev/oracleasm/disks/DATA*'
EXCLUDE '/dev/oracleasm/disks/DATA1';扩容现有磁盘
对于使用ASMFD或逻辑卷的磁盘,可以在线扩容,提高磁盘空间利用率:
sql
-- 扩容单个磁盘
ALTER DISKGROUP data RESIZE DISK DATA1 SIZE 200G;
-- 扩容磁盘组中的所有磁盘
ALTER DISKGROUP data RESIZE ALL SIZE 200G;
-- 扩容特定故障组中的磁盘
ALTER DISKGROUP recovery RESIZE DISKS IN FAILGROUP fg1 SIZE 150G;ASM 磁盘组收缩
删除磁盘
当需要移除磁盘或替换故障磁盘时,可以从磁盘组中删除磁盘,ASM会自动重新平衡数据:
sql
-- 从磁盘组中删除磁盘(自动重新平衡)
ALTER DISKGROUP data DROP DISK DATA4;
-- 删除多个磁盘
ALTER DISKGROUP recovery DROP
DISK RECO5, RECO6;
-- 删除特定故障组中的所有磁盘
ALTER DISKGROUP recovery DROP DISKS IN FAILGROUP fg1;
-- 强制删除故障磁盘
ALTER DISKGROUP data DROP DISK DATA_FAILED FORCE;缩小磁盘大小
在某些情况下,可能需要缩小磁盘大小,例如存储资源紧张时:
sql
-- 缩小磁盘大小(确保磁盘上有足够的空闲空间)
ALTER DISKGROUP data RESIZE DISK DATA1 SIZE 100G;ASM 磁盘组监控
磁盘组状态监控
定期监控ASM磁盘组的状态是DBA的重要职责,及时发现并处理问题:
sql
-- 查看磁盘组状态
SELECT name, state, type, total_mb, free_mb, usable_file_mb, offline_disks
FROM v$asm_diskgroup;
-- 查看磁盘详细信息
SELECT dg.name AS diskgroup_name, d.path, d.name AS disk_name,
d.state, d.total_mb, d.free_mb, d.failgroup, d.repair_timer
FROM v$asm_diskgroup dg, v$asm_disk d
WHERE dg.group_number = d.group_number;
-- 查看磁盘I/O统计
SELECT * FROM v$asm_disk_iostat;ASMCMD 监控命令
ASMCMD提供了丰富的监控命令,方便DBA快速查看磁盘组状态:
bash
# 查看磁盘组使用情况
asmcmd lsdg
# 查看磁盘详细信息
asmcmd lsdsk -g data -p
# 查看ASM文件
asmcmd ls -l +data
# 查看磁盘I/O统计
asmcmd iostat -G data
# 查看ASM实例状态
asmcmd status
# 查看ASM文件大小
asmcmd du -h +data重新平衡监控
当添加或删除磁盘时,ASM会自动进行重新平衡,需要监控重新平衡的进度:
sql
-- 查看重新平衡进度
SELECT group_number, operation, state, power, actual, sofar, est_work, est_rate, est_minutes FROM v$asm_operation;
-- 查看重新平衡统计信息
SELECT name, value FROM v$asm_statistics WHERE group_number > 0;ASM 磁盘组维护
磁盘组挂载与卸载
在某些维护场景下,可能需要挂载或卸载磁盘组:
sql
-- 挂载磁盘组
ALTER DISKGROUP data MOUNT;
-- 卸载磁盘组
ALTER DISKGROUP data DISMOUNT;
-- 强制卸载磁盘组
ALTER DISKGROUP data DISMOUNT FORCE;
-- 挂载所有磁盘组
ALTER DISKGROUP ALL MOUNT;磁盘组修复
当磁盘组出现问题时,可以使用修复命令进行修复:
sql
-- 修复磁盘组中的故障磁盘
ALTER DISKGROUP data REPAIR DISKS;
-- 检查并修复磁盘组
ALTER DISKGROUP data CHECK ALL;ASM 磁盘组属性修改
可以修改ASM磁盘组的属性来调整其行为,适应不同的业务需求:
sql
-- 修改磁盘修复时间
ALTER DISKGROUP data SET ATTRIBUTE 'disk_repair_time' = '4h';
-- 设置ASM快速重新平衡
ALTER DISKGROUP data SET ATTRIBUTE 'fast_rebalance' = 'TRUE';
-- 修改兼容性属性(注意:兼容性属性只能提高,不能降低)
ALTER DISKGROUP data SET ATTRIBUTE 'compatible.asm' = '21.0.0.0.0';
ALTER DISKGROUP data SET ATTRIBUTE 'compatible.rdbms' = '21.0.0.0.0';ASM 磁盘组备份与恢复
磁盘组元数据备份
ASM元数据包含了磁盘组的所有配置信息,定期备份ASM元数据是非常重要的:
sql
-- 备份ASM元数据
ALTER DISKGROUP data BACKUP REPOSITORY;
-- 查看元数据备份
SELECT * FROM v$asm_backup_repo_summary;从元数据备份恢复
当ASM元数据损坏时,可以从备份中恢复,确保数据的可用性:
sql
-- 从元数据备份恢复磁盘组
ALTER DISKGROUP data RESTORE DISKS ALL
FROM '/path/to/backup';Oracle 19c与21c ASM 差异
核心差异对比
| 特性 | Oracle 19c | Oracle 21c |
|---|---|---|
| ASM 兼容性 | 最高支持19.0.0.0.0 | 最高支持21.0.0.0.0 |
| ASMFD 增强 | 基础功能 | 增强了ASMFD的故障检测和修复能力 |
| 快速重新平衡 | 支持 | 优化了重新平衡算法,速度更快 |
| 新的ASM属性 | 有限 | 新增cell.smart_scan_capable等属性 |
| ASM 实例管理 | 基础支持 | 增强了ASM实例的自动管理功能 |
| 磁盘组创建 | 基础语法 | 新增简化的磁盘组创建语法 |
| 性能优化 | 基础优化 | 增强了ASM的I/O性能和资源管理 |
Oracle 21c 新特性
简化的磁盘组创建
sql-- Oracle 21c简化语法 CREATE DISKGROUP data EXTERNAL REDUNDANCY DISK '/dev/oracleasm/disks/DATA*' DEFAULT ATTRIBUTES (compatible.asm = '21.0.0.0.0', compatible.rdbms = '21.0.0.0.0');增强的ASMFD
- 更好的故障检测和修复能力
- 支持更多类型的存储设备
- 简化的磁盘管理命令
优化的重新平衡算法
- 更快的重新平衡速度
- 更少的I/O开销
- 更好的资源利用率
生产环境最佳实践
规划与设计
- 磁盘组规划:根据数据类型和用途创建多个磁盘组,如数据、恢复、归档、redo等,便于管理和优化
- 冗余级别选择:
- 外部冗余:适用于有RAID保护的存储,如SAN或NAS
- Normal冗余:适用于大多数生产环境,提供双向镜像保护
- High冗余:适用于对数据安全性要求极高的环境,如金融核心系统
- AU_SIZE选择:
- 传统存储:4MB或8MB
- 闪存存储:1MB或2MB
- 大文件(如数据仓库):8MB或16MB
- 故障组设计:确保故障组分布在不同的存储设备或控制器上,避免单点故障
性能优化
- 使用多个磁盘:确保I/O负载均匀分布,提高整体性能
- 条带大小选择:大文件使用粗粒度条带化,小文件使用细粒度条带化
- 合理设置重新平衡功率:根据系统负载调整
asm_power_limit参数,建议在系统负载低时进行重新平衡 - 避免过度使用磁盘:保持磁盘使用率在70-80%以下,预留足够的空间用于重新平衡和突发增长
- 定期监控I/O性能:使用
v$asm_disk_iostat或ASMCMD的iostat命令,及时发现和解决性能瓶颈
可用性保障
- 定期备份ASM元数据:防止元数据损坏导致数据丢失,建议每周至少备份一次
- 设置合理的磁盘修复时间:根据业务需求调整
disk_repair_time属性,建议设置为4-24小时 - 测试故障恢复流程:定期模拟磁盘故障,测试ASM的恢复能力,确保故障处理流程有效
- 保持ASM实例高可用:配置ASM实例的高可用,如使用Oracle Grid Infrastructure
日常维护
- 定期监控磁盘组状态:每周至少检查一次磁盘组状态,包括空间使用情况、磁盘状态等
- 监控磁盘空间使用情况:设置告警,当可用空间低于20%时触发告警,及时扩容
- 定期检查磁盘I/O性能:关注磁盘I/O等待时间和吞吐量,及时替换性能不佳的磁盘
- 及时处理故障磁盘:当磁盘故障时,及时替换或修复,避免影响数据库性能和可用性
- 保持ASM实例和数据库的兼容性:确保
compatible.asm和compatible.rdbms属性设置正确,避免兼容性问题
常见问题(FAQ)
如何处理ASM磁盘组中的磁盘故障?
当ASM磁盘故障时,ASM会自动检测并将其标记为故障状态。根据磁盘组的冗余级别,ASM会从其他磁盘恢复数据。处理步骤:
- 查看故障磁盘:
SELECT path, status, repair_timer FROM v$asm_disk WHERE group_number = <group_number> AND status != 'NORMAL'; - 如果磁盘可以修复,修复硬件问题后,ASM会自动恢复
- 如果磁盘无法修复,替换磁盘并添加到磁盘组:sql
ALTER DISKGROUP data DROP DISK <failed_disk> FORCE; ALTER DISKGROUP data ADD DISK '/dev/oracleasm/disks/NEW_DISK';
如何提高ASM磁盘组的性能?
提高ASM磁盘组性能的方法:
- 使用多个磁盘,确保I/O负载均匀分布
- 选择合适的条带大小:大文件使用粗粒度条带化,小文件使用细粒度条带化
- 设置合适的重新平衡功率(1-11,默认5),在系统负载低时进行重新平衡
- 确保磁盘组的冗余级别与业务需求匹配,避免过度冗余影响性能
- 定期监控磁盘I/O性能,及时替换性能不佳的磁盘
- 保持磁盘使用率在70-80%以下,预留足够的空间用于重新平衡和突发增长
如何迁移ASM磁盘组到新的存储?
迁移ASM磁盘组到新存储的步骤:
- 向磁盘组添加新存储的磁盘
- 等待ASM完成重新平衡(监控
v$asm_operation) - 从磁盘组中删除旧存储的磁盘
- 等待ASM完成重新平衡
- 验证所有数据已迁移到新存储
ASM磁盘组的AU_SIZE应该如何选择?
AU_SIZE(分配单元大小)的选择取决于存储设备和数据库文件大小:
- 对于传统存储,4MB或8MB是常用选择
- 对于闪存存储,1MB或2MB可能更合适,减少空间浪费
- 对于大文件(如数据仓库),8MB或16MB可以提高性能,减少分配单元数量
- AU_SIZE一旦设置,无法修改,因此需要根据业务需求仔细选择
如何监控ASM磁盘组的空间使用情况?
可以使用以下方法监控ASM磁盘组空间:
- SQL查询:
SELECT name, total_mb, free_mb, usable_file_mb FROM v$asm_diskgroup; - ASMCMD命令:
asmcmd lsdg - OEM或其他监控工具,如Prometheus+Grafana
- 设置空间告警,当可用空间低于20%时触发告警
- 定期生成空间使用报告,预测未来空间需求
如何处理ASM磁盘组空间不足的问题?
处理ASM磁盘组空间不足的步骤:
- 检查磁盘组空间使用情况:
SELECT name, total_mb, free_mb, usable_file_mb FROM v$asm_diskgroup; - 清理不必要的文件,如旧的备份、归档日志等
- 向磁盘组添加新磁盘,扩展存储空间
- 扩容现有磁盘,提高磁盘空间利用率
- 考虑迁移部分数据到其他磁盘组或存储设备
- 调整数据库的存储策略,如压缩表空间,减少空间占用
如何配置ASM实例的高可用?
配置ASM实例高可用的方法:
- 使用Oracle Grid Infrastructure部署ASM实例,提供自动故障转移
- 配置ASM实例的自动启动和故障转移,确保ASM实例的可用性
- 确保ASM实例的参数文件和密码文件的高可用,如使用共享存储
- 定期测试ASM实例的故障转移,确保故障转移流程有效
如何优化ASM重新平衡的性能?
优化ASM重新平衡性能的方法:
- 设置合适的重新平衡功率:
ALTER SYSTEM SET asm_power_limit=8 SCOPE=BOTH;,功率越高,重新平衡速度越快,但会占用更多的I/O资源 - 在系统负载较低时进行重新平衡操作,如夜间或周末
- 避免同时添加或删除多个磁盘,减少重新平衡的工作量
- 确保存储设备有足够的I/O带宽,避免存储成为瓶颈
- 使用Oracle 21c的优化重新平衡算法,提高重新平衡效率
如何处理ASM磁盘组挂载失败?
处理ASM磁盘组挂载失败的步骤:
- 查看ASM实例日志,了解挂载失败的原因,日志文件通常位于
$ASM_HOME/log/<hostname>/asm/alert_<instance_name>.log - 检查磁盘设备是否可用:
asmcmd lsdsk -p - 检查磁盘权限是否正确,确保ASM用户(如grid)有读写权限
- 尝试强制挂载:
ALTER DISKGROUP data MOUNT FORCE; - 如果是元数据损坏,尝试从备份恢复:
ALTER DISKGROUP data MOUNT RECOVER;
如何备份ASM磁盘组中的数据库文件?
备份ASM磁盘组中数据库文件的方法:
- 使用RMAN进行数据库备份,RMAN可以直接访问ASM磁盘组中的文件
- 配置RMAN备份到ASM磁盘组或其他存储设备
- 定期将备份复制到外部存储,如磁带或云存储,确保数据安全
- 使用Oracle Data Guard进行灾难恢复,提供数据冗余和故障转移能力
总结
ASM磁盘组管理是Oracle数据库存储管理的核心内容,通过合理规划、创建、监控和维护ASM磁盘组,可以提高数据库存储的可靠性、性能和可管理性。在实际生产环境中,DBA需要根据业务需求和存储设备特点,选择合适的ASM磁盘组配置,并定期进行维护和优化。
Oracle 21c增强了ASM的功能和性能,提供了更好的故障检测和修复能力,简化了磁盘管理,DBA可以考虑升级到新版本以获得更好的ASM支持。
通过遵循最佳实践,DBA可以确保ASM磁盘组的稳定运行,为数据库提供可靠的存储基础,保障业务的连续性和数据的安全性。
