ASM File Extent 与 Mirroring 详解

ASM File Extent 与 Mirroring 详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

ASM 通过 ExtentMirroring 机制管理文件存储和数据冗余[1]:

  • Extent:ASM 文件的逻辑分配单元
  • Mirroring:多副本机制保证数据可用性

2. ASM File 结构

2.1 文件组成

ASM File (如 users.259.1234567890)
├── File Header (1 个 AU)
│     └── 包含文件元数据
├── Data Extents
│     ├── Extent 1: AU 0 (1MB)
│     ├── Extent 2: AU 1
│     ├── Extent 3: AU 2 + AU 3 (变长 Extent, 2MB)
│     └── ...
└── 间接 Extent

2.2 文件命名

+DATA/orcl/datafile/users.259.1234567890
                       │    │
                       │    └── incarnation number
                       └── file number

3. Extent 类型

3.1 固定大小 Extent(10g)

每个 Extent = 1 个 AU
File 大小 = Extent 数 × AU 大小

3.2 变长 Extent(11g+)

Extents 1-7:    1 个 AU
Extents 9-63:   4 个 AU
Extents 64-119: 16 个 AU
Extents 120+:   64 个 AU

→ 大文件用大 Extent,减少元数据

3.3 查看 Extent 信息

-- 在 ASM 实例
SELECT 
  group_number,
  file_number,
  extent_id,
  bytes/1024/1024 AS mb,
  type
FROM v$asm_extent
WHERE file_number = 259;

4. Mirroring 镜像机制

4.1 三种镜像级别

级别副本数最少 Disk适用
Unprotected11外部 RAID
Normal (2-way)22通用
High (3-way)33高可用

4.2 Mirroring 实现

Normal Redundancy (2-way)

File Extent 1:
  Primary copy: Disk 1, AU 100
  Mirror copy:  Disk 2, AU 100

File Extent 2:
  Primary copy: Disk 2, AU 200
  Mirror copy:  Disk 1, AU 200

File Extent 3:
  Primary copy: Disk 3, AU 50
  Mirror copy:  Disk 1, AU 300

特点

  • 主副本和镜像副本分布在不同 Disk
  • ASM 自动选择位置,避免单 Disk 故障
  • 写入时同时写主副本和镜像副本

4.3 Failgroup

Failgroup(故障组):相互独立的磁盘组,单组故障不影响其他组。

Normal Redundancy with 2 Failgroups:

Failgroup 1          Failgroup 2
├── Disk 1            ├── Disk 3
└── Disk 2            └── Disk 4

File Extent:
  Primary copy: Failgroup 1 的某个 Disk
  Mirror copy:  Failgroup 2 的某个 Disk
CREATE DISKGROUP data NORMAL REDUNDANCY
  FAILGROUP fg1 DISK '/dev/asm-disk1', '/dev/asm-disk2'
  FAILGROUP fg2 DISK '/dev/asm-disk3', '/dev/asm-disk4';

4.4 文件级模板

不同文件类型可指定不同镜像级别:

-- 查看默认模板
SELECT * FROM v$asm_template;

-- 自定义模板
ALTER DISKGROUP data ADD TEMPLATE high_important 
  ATTRIBUTES (HIGH FINE);

-- 文件使用特定模板
ALTER DISKGROUP data ADD TEMPLATE high_important 
  ATTRIBUTES (HIGH FINE);

-- 创建表空间时指定
CREATE TABLESPACE important_ts 
  DATAFILE '+DATA(high_important)' SIZE 100M;

5. Partner Disk

5.1 Partner 关系

ASM 自动维护 Disk 之间的 Partner 关系:

  • 每个 Disk 通常有 8-10 个 Partner
  • Partner Disk 存储该 Disk 的镜像副本
  • Disk 故障时,从 Partner 读取数据

5.2 查看 Partner

SELECT 
  disk_number,
  partner_disk,
  partner_status
FROM v$asm_partner
WHERE group_number = 1;

6. ASM Stripe

6.1 条带化

ASM 自动对 Extent 进行条带化:

条带大小适用
COARSE(默认)数据文件、控制文件
FINERedo Log、控制文件(小 I/O)

6.2 配置

-- 模板属性中指定
ALTER DISKGROUP data ADD TEMPLATE redo_template 
  ATTRIBUTES (UNPROTECTED FINE);

-- Redo Log 使用 FINE 条带
ALTER DATABASE ADD LOGFILE '+DATA(redo_template)' SIZE 100M;

7. ASM 文件操作

7.1 创建文件(OMF)

-- 自动创建 ASM 文件
CREATE TABLESPACE ts_asm DATAFILE '+DATA' SIZE 1G;

-- 查看文件
SELECT file_name FROM dba_data_files WHERE tablespace_name='TS_ASM';
-- +DATA/orcl/datafile/ts_asm.259.1234567890

7.2 别名(Alias)

# 创建别名
asmcmd
ASMCMD> mkalias +DATA/orcl/datafile/users.259.1234567890 +DATA/orcl/datafile/users.dbf

# 查看别名
ASMCMD> ls -l +DATA/orcl/datafile/

# 删除别名
ASMCMD> rmalias +DATA/orcl/datafile/users.dbf

7.3 文件迁移

-- 移动数据文件
ALTER DATABASE MOVE DATAFILE '+DATA/users.dbf' TO '+FRA/users.dbf';

8. 相关视图

-- ASM 文件
SELECT 
  group_number,
  file_number,
  incarnation,
  bytes/1024/1024 AS mb,
  type,
  redundancy,
  striped
FROM v$asm_file;

-- ASM Alias
SELECT 
  group_number,
  file_number,
  alias_directory,
  name
FROM v$asm_alias;

-- ASM Template
SELECT 
  group_number,
  name,
  redundancy,
  stripe,
  system
FROM v$asm_template;

-- ASM Extent
SELECT 
  group_number,
  file_number,
  extent_id,
  xnum_kffxp,
  disk_kffxp,
  au_kffxp
FROM x$kffxp
WHERE file_number = 259;

9. 常见坑与排错

9.1 Disk Group 容量不足

现象ORA-15041: diskgroup ... space exhausted

修复

-- 1. 检查 Disk Group 使用情况
SELECT name, total_mb, free_mb, 
  ROUND(free_mb/total_mb*100, 2) AS free_pct
FROM v$asm_diskgroup;

-- 2. 增加 Disk
ALTER DISKGROUP data ADD DISK '/dev/asm-disk5';

-- 3. 或删除旧文件
asmcmd> rm +FRA/orcl/backupset/old_backup.bkp

9.2 Mirroring 不一致

现象ORA-15130: diskgroup ... is dismounted

修复

-- 1. 检查 Disk 状态
SELECT group_number, disk_number, mount_status, header_status, mode_status, state 
FROM v$asm_disk;

-- 2. 强制 mount
ALTER DISKGROUP data MOUNT FORCE;

-- 3. 修复镜像
ALTER DISKGROUP data RESIZE ALL;

9.3 文件不可见

现象:数据库找不到 ASM 文件。

排查

# 在 ASM 中查找
asmcmd> ls -l +DATA/orcl/datafile/

# 在数据库中查找
sqlplus / as sysdba
SELECT file_name FROM dba_data_files;

9.4 AU 分布不均

现象:某些 Disk I/O 高。

修复

-- 触发 rebalance 重新分配
ALTER DISKGROUP data REBALANCE POWER 8;

-- 查看 I/O 分布
SELECT group_number, disk_number, reads, writes 
FROM v$asm_disk_iostat;

10. 最佳实践

  1. Disk Group 用相同大小 Disk:均衡 I/O
  2. Normal Redundancy 用于关键数据:2-way 镜像
  3. High Redundancy 用于关键业务:3-way 镜像
  4. Redo Log 用 FINE 条带:小 I/O 优化
  5. 大文件用 4MB+ AU:减少元数据
  6. 定期监控镜像状态v$asm_disk
  7. 使用 Partner Disk 评估:避免单点故障
  8. 文件模板分类管理:不同重要级别

11. 参考资料

[1] Oracle Automatic Storage Management Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/

[2] Oracle ASM Reference 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/asm-file-templates.html