Skip to content

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_lsdsk

ASMLib

在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 19cOracle 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 新特性

  1. 简化的磁盘组创建

    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');
  2. 增强的ASMFD

    • 更好的故障检测和修复能力
    • 支持更多类型的存储设备
    • 简化的磁盘管理命令
  3. 优化的重新平衡算法

    • 更快的重新平衡速度
    • 更少的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.asmcompatible.rdbms属性设置正确,避免兼容性问题

常见问题(FAQ)

如何处理ASM磁盘组中的磁盘故障?

当ASM磁盘故障时,ASM会自动检测并将其标记为故障状态。根据磁盘组的冗余级别,ASM会从其他磁盘恢复数据。处理步骤:

  1. 查看故障磁盘:SELECT path, status, repair_timer FROM v$asm_disk WHERE group_number = <group_number> AND status != 'NORMAL';
  2. 如果磁盘可以修复,修复硬件问题后,ASM会自动恢复
  3. 如果磁盘无法修复,替换磁盘并添加到磁盘组:
    sql
    ALTER DISKGROUP data DROP DISK <failed_disk> FORCE;
    ALTER DISKGROUP data ADD DISK '/dev/oracleasm/disks/NEW_DISK';

如何提高ASM磁盘组的性能?

提高ASM磁盘组性能的方法:

  1. 使用多个磁盘,确保I/O负载均匀分布
  2. 选择合适的条带大小:大文件使用粗粒度条带化,小文件使用细粒度条带化
  3. 设置合适的重新平衡功率(1-11,默认5),在系统负载低时进行重新平衡
  4. 确保磁盘组的冗余级别与业务需求匹配,避免过度冗余影响性能
  5. 定期监控磁盘I/O性能,及时替换性能不佳的磁盘
  6. 保持磁盘使用率在70-80%以下,预留足够的空间用于重新平衡和突发增长

如何迁移ASM磁盘组到新的存储?

迁移ASM磁盘组到新存储的步骤:

  1. 向磁盘组添加新存储的磁盘
  2. 等待ASM完成重新平衡(监控v$asm_operation
  3. 从磁盘组中删除旧存储的磁盘
  4. 等待ASM完成重新平衡
  5. 验证所有数据已迁移到新存储

ASM磁盘组的AU_SIZE应该如何选择?

AU_SIZE(分配单元大小)的选择取决于存储设备和数据库文件大小:

  • 对于传统存储,4MB或8MB是常用选择
  • 对于闪存存储,1MB或2MB可能更合适,减少空间浪费
  • 对于大文件(如数据仓库),8MB或16MB可以提高性能,减少分配单元数量
  • AU_SIZE一旦设置,无法修改,因此需要根据业务需求仔细选择

如何监控ASM磁盘组的空间使用情况?

可以使用以下方法监控ASM磁盘组空间:

  1. SQL查询:SELECT name, total_mb, free_mb, usable_file_mb FROM v$asm_diskgroup;
  2. ASMCMD命令:asmcmd lsdg
  3. OEM或其他监控工具,如Prometheus+Grafana
  4. 设置空间告警,当可用空间低于20%时触发告警
  5. 定期生成空间使用报告,预测未来空间需求

如何处理ASM磁盘组空间不足的问题?

处理ASM磁盘组空间不足的步骤:

  1. 检查磁盘组空间使用情况:SELECT name, total_mb, free_mb, usable_file_mb FROM v$asm_diskgroup;
  2. 清理不必要的文件,如旧的备份、归档日志等
  3. 向磁盘组添加新磁盘,扩展存储空间
  4. 扩容现有磁盘,提高磁盘空间利用率
  5. 考虑迁移部分数据到其他磁盘组或存储设备
  6. 调整数据库的存储策略,如压缩表空间,减少空间占用

如何配置ASM实例的高可用?

配置ASM实例高可用的方法:

  1. 使用Oracle Grid Infrastructure部署ASM实例,提供自动故障转移
  2. 配置ASM实例的自动启动和故障转移,确保ASM实例的可用性
  3. 确保ASM实例的参数文件和密码文件的高可用,如使用共享存储
  4. 定期测试ASM实例的故障转移,确保故障转移流程有效

如何优化ASM重新平衡的性能?

优化ASM重新平衡性能的方法:

  1. 设置合适的重新平衡功率:ALTER SYSTEM SET asm_power_limit=8 SCOPE=BOTH;,功率越高,重新平衡速度越快,但会占用更多的I/O资源
  2. 在系统负载较低时进行重新平衡操作,如夜间或周末
  3. 避免同时添加或删除多个磁盘,减少重新平衡的工作量
  4. 确保存储设备有足够的I/O带宽,避免存储成为瓶颈
  5. 使用Oracle 21c的优化重新平衡算法,提高重新平衡效率

如何处理ASM磁盘组挂载失败?

处理ASM磁盘组挂载失败的步骤:

  1. 查看ASM实例日志,了解挂载失败的原因,日志文件通常位于$ASM_HOME/log/<hostname>/asm/alert_<instance_name>.log
  2. 检查磁盘设备是否可用:asmcmd lsdsk -p
  3. 检查磁盘权限是否正确,确保ASM用户(如grid)有读写权限
  4. 尝试强制挂载:ALTER DISKGROUP data MOUNT FORCE;
  5. 如果是元数据损坏,尝试从备份恢复:ALTER DISKGROUP data MOUNT RECOVER;

如何备份ASM磁盘组中的数据库文件?

备份ASM磁盘组中数据库文件的方法:

  1. 使用RMAN进行数据库备份,RMAN可以直接访问ASM磁盘组中的文件
  2. 配置RMAN备份到ASM磁盘组或其他存储设备
  3. 定期将备份复制到外部存储,如磁带或云存储,确保数据安全
  4. 使用Oracle Data Guard进行灾难恢复,提供数据冗余和故障转移能力

总结

ASM磁盘组管理是Oracle数据库存储管理的核心内容,通过合理规划、创建、监控和维护ASM磁盘组,可以提高数据库存储的可靠性、性能和可管理性。在实际生产环境中,DBA需要根据业务需求和存储设备特点,选择合适的ASM磁盘组配置,并定期进行维护和优化。

Oracle 21c增强了ASM的功能和性能,提供了更好的故障检测和修复能力,简化了磁盘管理,DBA可以考虑升级到新版本以获得更好的ASM支持。

通过遵循最佳实践,DBA可以确保ASM磁盘组的稳定运行,为数据库提供可靠的存储基础,保障业务的连续性和数据的安全性。