欢迎光临
我们一直在努力

Oracle ASM存储管理实战:从架构原理到日常运维的完整指南

一、开篇:为什么 Oracle 要发明 ASM?

某 DBA 管理着 20 套 Oracle 数据库,每套数据库有数十个数据文件。每次添加磁盘、迁移数据、做 I/O 负载均衡都需要手动操作,耗时且容易出错。 更糟糕的是,不同数据库的数据文件混在同一块磁盘上,一个数据库的全表扫描就会影响其他数据库的性能。

Oracle ASM(Automatic Storage Management)解决了这个问题。它是 Oracle 自带的卷管理和文件系统,能够自动将数据文件均匀分布到所有磁盘上,实现 I/O 负载均衡。添加或删除磁盘时,ASM 自动重新平衡数据,无需 DBA 手动干预。

本篇文章从 ASM 架构原理、磁盘组管理、文件模板、日常运维到故障处理,全面覆盖 ASM 的知识体系。

二、ASM 架构全景图

#publish-mermaid-1783903804745-0{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#publish-mermaid-1783903804745-0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#publish-mermaid-1783903804745-0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#publish-mermaid-1783903804745-0 .error-icon{fill:#552222;}#publish-mermaid-1783903804745-0 .error-text{fill:#552222;stroke:#552222;}#publish-mermaid-1783903804745-0 .edge-thickness-normal{stroke-width:1px;}#publish-mermaid-1783903804745-0 .edge-thickness-thick{stroke-width:3.5px;}#publish-mermaid-1783903804745-0 .edge-pattern-solid{stroke-dasharray:0;}#publish-mermaid-1783903804745-0 .edge-thickness-invisible{stroke-width:0;fill:none;}#publish-mermaid-1783903804745-0 .edge-pattern-dashed{stroke-dasharray:3;}#publish-mermaid-1783903804745-0 .edge-pattern-dotted{stroke-dasharray:2;}#publish-mermaid-1783903804745-0 .marker{fill:#333333;stroke:#333333;}#publish-mermaid-1783903804745-0 .marker.cross{stroke:#333333;}#publish-mermaid-1783903804745-0 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#publish-mermaid-1783903804745-0 p{margin:0;}#publish-mermaid-1783903804745-0 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#publish-mermaid-1783903804745-0 .cluster-label text{fill:#333;}#publish-mermaid-1783903804745-0 .cluster-label span{color:#333;}#publish-mermaid-1783903804745-0 .cluster-label span p{background-color:transparent;}#publish-mermaid-1783903804745-0 .label text,#publish-mermaid-1783903804745-0 span{fill:#333;color:#333;}#publish-mermaid-1783903804745-0 .node rect,#publish-mermaid-1783903804745-0 .node circle,#publish-mermaid-1783903804745-0 .node ellipse,#publish-mermaid-1783903804745-0 .node polygon,#publish-mermaid-1783903804745-0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#publish-mermaid-1783903804745-0 .rough-node .label text,#publish-mermaid-1783903804745-0 .node .label text,#publish-mermaid-1783903804745-0 .image-shape .label,#publish-mermaid-1783903804745-0 .icon-shape .label{text-anchor:middle;}#publish-mermaid-1783903804745-0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#publish-mermaid-1783903804745-0 .rough-node .label,#publish-mermaid-1783903804745-0 .node .label,#publish-mermaid-1783903804745-0 .image-shape .label,#publish-mermaid-1783903804745-0 .icon-shape .label{text-align:center;}#publish-mermaid-1783903804745-0 .node.clickable{cursor:pointer;}#publish-mermaid-1783903804745-0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#publish-mermaid-1783903804745-0 .arrowheadPath{fill:#333333;}#publish-mermaid-1783903804745-0 .edgePath .path{stroke:#333333;stroke-width:1px;}#publish-mermaid-1783903804745-0 .flowchart-link{stroke:#333333;fill:none;}#publish-mermaid-1783903804745-0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#publish-mermaid-1783903804745-0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#publish-mermaid-1783903804745-0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#publish-mermaid-1783903804745-0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#publish-mermaid-1783903804745-0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#publish-mermaid-1783903804745-0 .cluster text{fill:#333;}#publish-mermaid-1783903804745-0 .cluster span{color:#333;}#publish-mermaid-1783903804745-0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#publish-mermaid-1783903804745-0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#publish-mermaid-1783903804745-0 rect.text{fill:none;stroke-width:0;}#publish-mermaid-1783903804745-0 .icon-shape,#publish-mermaid-1783903804745-0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#publish-mermaid-1783903804745-0 .icon-shape p,#publish-mermaid-1783903804745-0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#publish-mermaid-1783903804745-0 .icon-shape .label rect,#publish-mermaid-1783903804745-0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#publish-mermaid-1783903804745-0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#publish-mermaid-1783903804745-0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#publish-mermaid-1783903804745-0 .node .neo-node{stroke:#9370DB;}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].node rect,#publish-mermaid-1783903804745-0 [data-look=\”neo\”].cluster rect,#publish-mermaid-1783903804745-0 [data-look=\”neo\”].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].swimlane.cluster rect{filter:none;}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].node path{stroke:#9370DB;stroke-width:1px;}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].node .neo-line path{stroke:#9370DB;filter:none;}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].node circle .state-start{fill:#000000;}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#publish-mermaid-1783903804745-0 [data-look=\”neo\”].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#publish-mermaid-1783903804745-0 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}数据库实例磁盘组DiskGroupASM实例

ASM Instance

ASM后台进程

RBAL-重新平衡进程

ARBn-重新平衡工作进程

ASMB-ASM桥梁进程

ASM SGA

DATA磁盘组

/dev/sdb1 – 1TB SSD

/dev/sdc1 – 1TB SSD

/dev/sdd1 – 1TB SSD

FRA磁盘组

/dev/sde1 – 2TB HDD

/dev/sdf1 – 2TB HDD

DB Instance

ASM客户端

读取/写入数据文件

关键解读:

  • ASM 实例: 独立的 Oracle 实例,只管理元数据,不存储用户数据。
  • 磁盘组: ASM 管理的磁盘集合,I/O 自动均匀分布。
  • RBAL/ARBn: 负责磁盘组重新平衡的后台进程。

三、ASM 核心概念

1. ASM 的三大组件

| 组件 | 全称 | 功能 |

|——|——|——|

| ASM 实例 | Automatic Storage Management Instance | 管理磁盘组元数据,不直接读写用户数据 |

| 磁盘组 | Disk Group | 一组磁盘的逻辑集合,I/O 自动条纹化和镜像 |

| ASM 文件 | ASM File | 存储在磁盘组中的文件(数据文件、日志文件等) |

2. ASM 磁盘组的三种冗余模式

| 冗余模式 | 镜像级别 | 最小磁盘数 | 磁盘故障容忍 |

|———-|———-|———–|————-|

| EXTERNAL | 无镜像 | 1 块 | ❌ 无容错 |

| NORMAL | 2-way 镜像 | 2 块 | ⚠️ 1 块故障 |

| HIGH | 3-way 镜像 | 3 块 | ✅ 2 块故障 |

— 创建 NORMAL 冗余磁盘组
CREATE DISKGROUP data NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/sdb1' NAME disk1
FAILGROUP fg2 DISK '/dev/sdc1' NAME disk2
FAILGROUP fg3 DISK '/dev/sdd1' NAME disk3;

3. ASM 的条纹化(Striping)

两种条纹化策略:

| 策略 | 大小 | 适用文件类型 |

|——|——|————-|

| 粗粒度(Coarse) | 1MB AU | 数据文件、归档日志 |

| 细粒度(Fine) | 128KB | 联机重做日志、控制文件 |

AU(Allocation Unit): ASM 分配的最小单位,通常为 1MB。

— 查看磁盘组的 AU 大小
SELECT name, allocation_unit_size/1024/1024 AS au_mb FROM v$asm_diskgroup;

四、ASM 磁盘组管理

1. 创建磁盘组

— 查看可用磁盘
SELECT path, name, header_status, os_mb FROM v$asm_disk;

— 创建磁盘组
CREATE DISKGROUP data EXTERNAL REDUNDANCY
DISK '/dev/sdb1' NAME data_disk1;

— 创建磁盘组(指定 AU 大小)
CREATE DISKGROUP data EXTERNAL REDUNDANCY
DISK '/dev/sdb1' NAME data_disk1
ATTRIBUTE 'au_size' = '4M';

2. 添加和删除磁盘

添加磁盘:

ALTER DISKGROUP data ADD DISK '/dev/sde1' NAME data_disk2;

删除磁盘:

ALTER DISKGROUP data DROP DISK data_disk2;

查看重新平衡进度:

SELECT group_number, operation, state, power, est_minutes
FROM v$asm_operation;

3. 重新平衡(Rebalance)

调整重新平衡功率:

— 设置平衡功率(1-1024,默认 4)
ALTER DISKGROUP data REBALANCE POWER 8;

— 查看重新平衡状态
SELECT * FROM v$asm_operation;

⚠️ 功率越高,平衡越快,但 I/O 开销越大。生产环境建议在业务低谷期进行。

五、ASM 文件管理

1. ASM 文件命名规则

ASM 支持多种文件命名方式:

| 命名方式 | 示例 | 说明 |

|———-|——|——|

| 完全限定名 | +DATA/orcl/datafile/system01.dbf | 完整路径 |

| 别名 | +DATA/mydb/system01.dbf | 用户自定义 |

| 带模板名 | +DATA(orcl/datafile) | 使用模板 |

| OMF 名称 | +DATA/orcl/datafile/system.256.123456789 | 自动生成 |

2. ASM 文件模板

常用文件模板:

| 模板 | 冗余 | 条纹化 | 适用文件 |

|——|——|——–|———-|

| CONTROLFILE | HIGH | FINE | 控制文件 |

| DATAFILE | MIRROR | COARSE | 数据文件 |

| ONLINELOG | MIRROR | FINE | 联机重做日志 |

| ARCHIVELOG | MIRROR | COARSE | 归档日志 |

| TEMPFILE | MIRROR | COARSE | 临时文件 |

— 查看磁盘组模板
SELECT name, redundancy, stripe FROM v$asm_template WHERE group_number = 1;

六、ASM 日常运维

1. 查看 ASM 磁盘组状态

— 查看磁盘组信息
SELECT name, state, type, total_mb/1024 AS total_gb,
free_mb/1024 AS free_gb,
ROUND((total_mb – free_mb)/total_mb*100, 2) AS used_pct
FROM v$asm_diskgroup;

— 查看磁盘状态
SELECT name, path, state, os_mb, failgroup, mode_status
FROM v$asm_disk
ORDER BY group_number, disk_number;

2. ASM 磁盘组空间监控

— 查看磁盘组使用率
SELECT name,
ROUND((total_mb – free_mb)/total_mb*100, 2) AS used_pct,
total_mb/1024 AS total_gb,
free_mb/1024 AS free_gb
FROM v$asm_diskgroup;

❌ 当磁盘组使用率超过 80% 时,需要添加新磁盘或清理无用文件。

3. ASM 文件清理

— 查看 ASM 中的文件
SELECT type, count(*), SUM(bytes)/1024/1024/1024 AS total_gb
FROM v$asm_file
GROUP BY type;

— 删除过期归档日志
ASMCMD> cd FRA/ORCL/ARCHIVELOG
ASMCMD> rm -rf 2026_06_*

七、ASM 故障处理

1. 磁盘故障处理

磁盘 OFFLINE:

— 手动 OFFLINE 磁盘
ALTER DISKGROUP data OFFLINE DISK data_disk2;

— 查看磁盘状态
SELECT name, path, state, mount_status, mode_status
FROM v$asm_disk WHERE name = 'DATA_DISK2';

磁盘 ONLINE:

ALTER DISKGROUP data ONLINE DISK data_disk2;

强制删除故障磁盘:

ALTER DISKGROUP data DROP DISK data_disk2 FORCE;

2. 磁盘组无法挂载

查看磁盘组状态:

SELECT name, state FROM v$asm_diskgroup;
— DISMOUNTED 状态说明磁盘组未挂载

手动挂载磁盘组:

ALTER DISKGROUP data MOUNT;

强制挂载(部分磁盘丢失):

ALTER DISKGROUP data MOUNT FORCE;

八、总结:记住这个“RAID 卡”类比就够了

【ASM 是 Oracle 内置的 RAID 卡 + 卷管理器】

  • 磁盘组: 一组磁盘组成的 RAID 阵列。
  • 冗余模式: RAID 级别(EXTERNAL=RAID0, NORMAL=RAID1, HIGH=RAID1+)。
  • 条纹化: 将数据分散到所有磁盘,实现 I/O 负载均衡。
  • 重新平衡: 添加或删除磁盘时,自动重新分布数据。
  • ASM 实例: RAID 卡的控制器,管理元数据和磁盘状态。

ASM 是 Oracle 存储管理的首选方案。它简化了存储管理、自动实现 I/O 负载均衡、支持在线添加和删除磁盘。对于使用 RAC 的环境,ASM 几乎是必须的选择。

你的生产环境使用了 ASM 吗?使用的哪种冗余模式?欢迎评论区分享你的运维经验。

赞(0)
未经允许不得转载:171主机测评 » Oracle ASM存储管理实战:从架构原理到日常运维的完整指南
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址