Skip to content

Oracle ASM 存储优化

ASM 存储结构优化

磁盘组设计

  • 磁盘组规划

    • 根据数据类型和访问模式创建不同的磁盘组
    • 例如:数据磁盘组、重做日志磁盘组、快速恢复区磁盘组
    • 为不同磁盘组选择合适的冗余级别
  • 磁盘组冗余级别

    • EXTERNAL:依赖外部存储冗余(如 RAID)
    • NORMAL:双路镜像,提供高可用性
    • HIGH:三路镜像,提供最高可用性
  • 磁盘选择

    • 使用相同类型和性能的磁盘
    • 避免混合不同转速和容量的磁盘
    • 确保磁盘数量足够以提供良好的条带化效果

ASM 条带化优化

  • 条带大小选择

    • 精细条带:默认 128KB,适合随机 I/O
    • ** coarse条带**:默认 1MB,适合顺序 I/O
  • 条带化配置

sql
-- 创建磁盘组时设置条带大小
CREATE DISKGROUP data_dg 
NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/oracleasm/disks/DISK1', '/dev/oracleasm/disks/DISK2'
FAILGROUP fg2 DISK '/dev/oracleasm/disks/DISK3', '/dev/oracleasm/disks/DISK4'
ATTRIBUTE 
  'compatible.asm' = '19.0.0.0.0',
  'compatible.rdbms' = '19.0.0.0.0',
  'au_size' = '4M',
  'cell.smart_scan_capable' = 'false';

分配单元 (AU) 大小优化

  • AU 大小选择

    • 1MB:默认值,适合大多数场景
    • 2MB:适合大型数据库
    • 4MB:适合数据仓库和大型数据文件
    • 8MB:适合超大型数据库
  • AU 大小影响

    • 更大的 AU 大小提高顺序 I/O 性能
    • 更大的 AU 大小减少元数据开销
    • 更大的 AU 大小增加空间浪费

ASM 实例参数优化

内存参数

  • SGA 大小

    • 根据系统内存大小设置合理的 SGA
    • 对于大型 ASM 环境,建议至少 4GB
    • 使用自动内存管理或手动调整
  • 关键内存参数

sql
-- ASM 实例内存参数设置
ALTER SYSTEM SET sga_target=4G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=SPFILE;
ALTER SYSTEM SET shared_pool_size=1G SCOPE=SPFILE;
ALTER SYSTEM SET large_pool_size=512M SCOPE=SPFILE;

进程参数

  • 进程数量

    • 根据并发操作需求设置
    • 建议值:100-200
  • 会话参数

    • 根据并发会话需求设置
    • 建议值:150-250
  • 参数设置

sql
ALTER SYSTEM SET processes=150 SCOPE=SPFILE;
ALTER SYSTEM SET sessions=200 SCOPE=SPFILE;

性能参数

  • ASM 电源限制

    • 控制 ASM 重平衡操作的资源使用
    • 根据系统负载调整
  • 参数设置

sql
-- 设置 ASM 重平衡电源限制
ALTER DISKGROUP data_dg REBALANCE POWER 5;

-- 设置默认重平衡电源限制
ALTER SYSTEM SET asm_power_limit=5 SCOPE=SPFILE;

ASM 磁盘组优化

磁盘组属性优化

  • 兼容性属性

    • 设置适当的兼容性级别
    • 启用新功能但保持向后兼容
  • 属性设置

sql
-- 修改磁盘组兼容性属性
ALTER DISKGROUP data_dg SET ATTRIBUTE 'compatible.asm' = '19.0.0.0.0';
ALTER DISKGROUP data_dg SET ATTRIBUTE 'compatible.rdbms' = '19.0.0.0.0';

磁盘组空间管理

  • 空间监控

    • 定期检查磁盘组空间使用情况
    • 设置空间使用告警阈值
  • 空间管理策略

    • 预留足够的空闲空间(至少 20%)
    • 定期添加新磁盘以满足增长需求
    • 考虑使用 ASM 磁盘组收缩功能
  • 空间检查

sql
-- 检查磁盘组空间使用情况
SELECT name, total_mb, free_mb, round((free_mb/total_mb)*100,2) AS free_pct 
FROM v$asm_diskgroup;

-- 检查单个磁盘使用情况
SELECT diskgroup_name, disk_name, total_mb, free_mb, round((free_mb/total_mb)*100,2) AS free_pct 
FROM v$asm_disk;

磁盘组重平衡

  • 重平衡操作

    • 添加或删除磁盘后自动触发
    • 可以手动触发以优化磁盘分布
  • 重平衡优化

    • 选择合适的重平衡电源限制
    • 在系统负载低时执行重平衡
    • 监控重平衡进度
  • 重平衡命令

sql
-- 手动触发重平衡
ALTER DISKGROUP data_dg REBALANCE POWER 3;

-- 监控重平衡进度
SELECT * FROM v$asm_operation;

ASM 性能监控

性能视图

  • ASM 磁盘组视图
sql
-- 磁盘组性能
SELECT name, state, type, total_mb, free_mb 
FROM v$asm_diskgroup;

-- 磁盘性能
SELECT disk_group_name, disk_name, mode_status, state, mount_status 
FROM v$asm_disk;
  • ASM 操作视图
sql
-- ASM 操作状态
SELECT group_number, operation, state, power, est_work, sofar 
FROM v$asm_operation;

-- ASM 等待事件
SELECT event, total_waits, time_waited, avg_wait 
FROM v$asm_wait_stats;

性能诊断

  • ASM 日志分析

    • 检查 ASM 告警日志
    • 分析 ASM 跟踪文件
  • 性能报告

    • 使用 ASM 性能报告工具
    • 分析 ASM 实例的 AWR 报告
  • 常见性能问题

    • 磁盘 I/O 瓶颈
    • 重平衡操作影响
    • ASM 实例资源不足

ASM 维护最佳实践

定期维护任务

  • 磁盘组检查

    • 定期检查磁盘组状态
    • 验证磁盘组冗余完整性
  • 磁盘健康检查

    • 监控磁盘错误和预测性故障
    • 定期检查磁盘 I/O 性能
  • 维护命令

sql
-- 检查磁盘组状态
SELECT name, state, type FROM v$asm_diskgroup;

-- 检查磁盘状态
SELECT disk_name, state, mount_status, mode_status FROM v$asm_disk;

-- 验证磁盘组
ALTER DISKGROUP data_dg CHECK ALL;

备份和恢复

  • ASM 配置备份

    • 备份 ASM 初始化参数文件
    • 记录磁盘组配置
  • ASM 磁盘组备份

    • 使用 RMAN 备份 ASM 中的数据库
    • 考虑使用第三方存储备份解决方案
  • 恢复策略

    • 制定 ASM 故障恢复计划
    • 测试 ASM 恢复流程

安全管理

  • ASM 权限管理

    • 严格控制 ASM 实例的访问权限
    • 使用 ASM 特定的系统权限
  • 安全配置

    • 启用 ASM 密码文件认证
    • 限制 ASM 实例的网络访问
  • 权限设置

sql
-- 授予 ASM 权限
GRANT SYSASM TO asm_admin;

-- 检查 ASM 用户权限
SELECT grantee, privilege FROM v$asm_user;

常见 ASM 问题和解决方案

磁盘组挂载失败

  • 症状:ASM 实例启动后磁盘组无法挂载
  • 原因:磁盘权限问题、磁盘故障、ASM 配置错误
  • 解决方案
    • 检查磁盘权限和所有权
    • 检查磁盘健康状态
    • 验证 ASM 磁盘发现路径
    • 查看 ASM 告警日志获取详细错误信息

ASM 重平衡缓慢

  • 症状:重平衡操作执行时间过长
  • 原因:磁盘数量过多、系统资源不足、I/O 性能差
  • 解决方案
    • 增加重平衡电源限制
    • 确保系统有足够的 CPU 和内存资源
    • 检查存储系统性能
    • 在系统负载低时执行重平衡

ASM 磁盘故障

  • 症状:磁盘状态变为 OFFLINE 或 DROPPING
  • 原因:物理磁盘故障、连接问题、电源故障
  • 解决方案
    • 对于 NORMAL 或 HIGH 冗余,等待自动重建
    • 对于 EXTERNAL 冗余,需要外部存储修复
    • 替换故障磁盘并触发重平衡

ASM 实例性能问题

  • 症状:ASM 实例响应缓慢、数据库访问延迟
  • 原因:ASM 实例内存不足、CPU 资源不足、I/O 瓶颈
  • 解决方案
    • 增加 ASM 实例内存
    • 确保 ASM 实例有足够的 CPU 资源
    • 检查存储 I/O 性能
    • 优化 ASM 实例参数

版本差异

Oracle 11g

  • ASM 功能相对基础
  • 支持基本的磁盘组管理
  • 性能监控功能有限
  • 自动化程度相对较低

Oracle 12c

  • 引入了 Flex ASM
  • 支持 ASM 集群文件系统 (ACFS)
  • 增强了 ASM 性能监控
  • 引入了更多的磁盘组属性
  • 支持 ASM 滚动升级

Oracle 19c/21c

  • 进一步增强了 ASM 性能
  • 支持更多的存储类型
  • 改进了 ASM 故障处理
  • 提供了更详细的性能监控视图
  • 增强了 ASM 自动化管理能力

最佳实践

  • 磁盘组设计

    • 根据数据类型和访问模式创建专用磁盘组
    • 为不同磁盘组选择合适的冗余级别
    • 使用相同类型和性能的磁盘
  • 参数优化

    • 根据系统资源调整 ASM 实例参数
    • 设置合适的重平衡电源限制
    • 优化 AU 大小以适应工作负载
  • 监控策略

    • 建立 ASM 性能监控机制
    • 设置磁盘组空间使用告警
    • 定期分析 ASM 性能数据
  • 维护计划

    • 制定定期的 ASM 维护计划
    • 定期检查磁盘健康状态
    • 测试 ASM 故障恢复流程
  • 安全管理

    • 严格控制 ASM 访问权限
    • 启用 ASM 密码文件认证
    • 限制 ASM 网络访问

常见问题(FAQ)

Q1: 如何选择 ASM 磁盘组的冗余级别?

A1: 冗余级别的选择:

  • EXTERNAL:当外部存储提供 RAID 保护时使用
  • NORMAL:大多数生产环境的推荐选择,提供双路镜像
  • HIGH:对可用性要求极高的环境,提供三路镜像

Q2: 如何优化 ASM 重平衡性能?

A2: ASM 重平衡优化:

  • 选择合适的重平衡电源限制(POWER 1-11)
  • 在系统负载低时执行重平衡
  • 确保有足够的系统资源
  • 监控重平衡进度并调整资源分配

Q3: 如何监控 ASM 磁盘健康状态?

A3: ASM 磁盘健康监控:

sql
-- 检查磁盘状态
SELECT disk_name, state, mount_status, mode_status, header_status 
FROM v$asm_disk;

-- 检查磁盘错误
SELECT disk_name, errors, reads, writes 
FROM v$asm_disk_stat;

Q4: 如何处理 ASM 磁盘故障?

A4: ASM 磁盘故障处理:

  • NORMAL 或 HIGH 冗余

    1. 识别故障磁盘
    2. 确认冗余正在重建
    3. 替换故障磁盘
    4. 触发重平衡
  • EXTERNAL 冗余

    1. 依靠外部存储的 RAID 保护
    2. 修复外部存储故障
    3. 验证 ASM 磁盘状态

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

A5: ASM 磁盘组迁移步骤:

  1. 准备新存储

    • 配置新的存储设备
    • 确保新存储性能满足要求
  2. 添加新磁盘

    • 将新磁盘添加到现有磁盘组
    • 等待重平衡完成
  3. 删除旧磁盘

    • 从磁盘组中删除旧磁盘
    • 等待重平衡完成
  4. 验证迁移

    • 检查磁盘组状态
    • 验证数据完整性
    • 监控性能指标