Oracle ASM 架构与 AU(Allocation Unit)
Oracle ASM 架构与 AU(Allocation Unit)
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
ASM(Automatic Storage Management) 是 Oracle 提供的卷管理器和文件系统[1]:
核心特性:
- 自动 I/O 负载均衡
- 在线存储重配置
- 镜像冗余(无需外部 RAID)
- 集群共享存储
ASM = Volume Manager + File System
2. ASM 架构层次
+--------------------------------+
| Database Instance |
+--------------------------------+
│
▼
+--------------------------------+
| ASM Instance (单独的实例) |
| - SGA (Shared Pool, Large Pool) |
| - ASMB / RBAL 后台进程 |
+--------------------------------+
│
▼
+--------------------------------+
| ASM Disk Group |
| - 由多个 Disk 组成 |
| - 每个 Disk 划分为多个 AU |
+--------------------------------+
│
▼
+--------------------------------+
| ASM Disk (LUN / 物理磁盘) |
+--------------------------------+
3. ASM 实例
3.1 与数据库实例区别
| 维度 | ASM 实例 | 数据库实例 |
|---|---|---|
| 内存 | SGA + PGA(较小) | SGA + PGA(大) |
| 后台进程 | ASMB, RBAL, GMON, MSNN | PMON, SMON, … |
| 是否可查询 | 仅元数据 | 业务数据 |
| 启动方式 | 启动到 NOMOUNT | NOMOUNT/MOUNT/OPEN |
3.2 ASM 实例参数
-- init+ASM.ora 示例
*.asm_diskstring='/dev/asm*'
*.asm_diskgroups='DATA','FRA'
*.memory_target=1G
*.instance_type='asm'
*.remote_login_passwordfile='EXCLUSIVE'
3.3 启动 ASM 实例
# 启动 ASM 实例
sqlplus / as sysasm
SQL> STARTUP;
# 关闭
SQL> SHUTDOWN IMMEDIATE;
3.4 ASM 后台进程
| 进程 | 作用 |
|---|---|
| ASMB | ASM Background,与数据库通信 |
| RBAL | Rebalance Master,协调 rebalance |
| GMON | Disk Group Monitor,监控磁盘状态 |
| MSNN | ASM Rebalance Worker |
| XNNN | ASM I/O Worker |
4. ASM Disk Group
4.1 Disk Group 概念
Disk Group (DATA)
├── Disk 1 (/dev/asm-disk1)
│ ├── AU 0 (1 MB)
│ ├── AU 1
│ ├── AU 2
│ └── ...
├── Disk 2 (/dev/asm-disk2)
│ ├── AU 0
│ ├── AU 1
│ └── ...
└── Disk 3 (/dev/asm-disk3)
├── AU 0
└── ...
4.2 冗余类型
| 类型 | 说明 | 最少 Disk |
|---|---|---|
| EXTERNAL | 外部冗余(依赖 RAID) | 1 |
| NORMAL | 2-way 镜像 | 2+ |
| HIGH | 3-way 镜像 | 3+ |
| FLEX | 灵活冗余(18c+) | 3+ |
4.3 创建 Disk Group
-- 外部冗余
CREATE DISKGROUP data EXTERNAL REDUNDANCY
DISK '/dev/asm-disk1', '/dev/asm-disk2'
ATTRIBUTE 'au_size'='4M';
-- Normal 冗余(2-way)
CREATE DISKGROUP data NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/asm-disk1'
FAILGROUP fg2 DISK '/dev/asm-disk2';
-- High 冗余(3-way)
CREATE DISKGROUP data HIGH REDUNDANCY
FAILGROUP fg1 DISK '/dev/asm-disk1'
FAILGROUP fg2 DISK '/dev/asm-disk2'
FAILGROUP fg3 DISK '/dev/asm-disk3';
5. AU(Allocation Unit)
5.1 AU 是什么
AU 是 ASM 中分配空间的最小单位[1][2]:
ASM Disk:
+----+----+----+----+----+----+----+
| AU | AU | AU | AU | AU | AU | ...|
| 0 | 1 | 2 | 3 | 4 | 5 | |
+----+----+----+----+----+----+----+
每个 AU 大小默认 1MB(可配置 1/2/4/8/16/32/64 MB)
5.2 AU 大小配置
-- 创建时指定
CREATE DISKGROUP data EXTERNAL REDUNDANCY
DISK '/dev/asm-disk1'
ATTRIBUTE 'au_size'='4M';
-- 可选值:1, 2, 4, 8, 16, 32, 64 MB
-- 默认 1MB
5.3 AU 大小选择
| AU 大小 | 适用场景 |
|---|---|
| 1 MB(默认) | 通用 |
| 4 MB | 数据仓库、大数据库 |
| 8 MB | 超大数据库(> 10TB) |
| 16-64 MB | Exadata |
选择原则:
- 大 AU 减少元数据
- 小 AU 更精细控制
- 数据仓库推荐 4MB
5.4 查看 AU 信息
-- Disk Group AU 大小
SELECT
group_number,
name,
allocation_unit_size/1024/1024 AS au_mb,
type
FROM v$asm_diskgroup;
-- Disk 总体
SELECT
group_number,
disk_number,
total_mb,
free_mb,
path
FROM v$asm_disk;
6. ASM File Extent
6.1 Extent 概念
ASM File 由若干 Extent 组成,每个 Extent 是 AU 的集合:
ASM File (datafile)
├── Extent 1 = AU 0 (1MB)
├── Extent 2 = AU 1
├── Extent 3 = AU 2 + AU 3 (2MB,变长 Extent)
└── ...
6.2 Variable Size Extent
11g+ 引入变长 Extent:
Extents 1-8: 1 个 AU
Extents 9-63: 4 个 AU
Extents 64-119: 16 个 AU
Extents 120+: 64 个 AU
→ 减少大文件的 Extent 元数据
6.3 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 101
- Mirror copy: Disk 1, AU 101
7. ASM 文件类型
| 文件类型 | 默认位置 |
|---|---|
| 数据文件 | +DATA/<db_unique_name>/datafile/ |
| 控制文件 | +DATA/<db_unique_name>/controlfile/ |
| 在线 Redo Log | +REDO/<db_unique_name>/onlinelog/ |
| 归档 Redo Log | +FRA/<db_unique_name>/archivelog/ |
| RMAN 备份 | +FRA/<db_unique_name>/backupset/ |
| SPFILE | +DATA/<db_unique_name>/spfile/ |
| 密码文件 | +DATA/<db_unique_name>/orapw |
8. ASMCMD 命令
# 进入 ASMCMD
asmcmd
# 常用命令
asmcmd> ls
asmcmd> ls -l
asmcmd> cd DATA/orcl/datafile
asmcmd> pwd
# 文件操作
asmcmd> cp +DATA/orcl/datafile/users.123.456 /tmp/users.dbf
asmcmd> rm +DATA/orcl/datafile/users.123.456
asmcmd> mkdir +DATA/mydir
# Disk Group 管理
asmcmd> lsdg
asmcmd> lsdsk
asmcmd> iostat
# 文件查询
asmcmd> ls -l +DATA/orcl/datafile/users.*
9. ASM 相关视图
-- 在 ASM 实例中
SELECT group_number, name, state, type, total_mb, free_mb
FROM v$asm_diskgroup;
SELECT group_number, disk_number, mount_status, state, path, total_mb, free_mb
FROM v$asm_disk;
SELECT group_number, file_number, bytes/1024/1024 AS mb, type
FROM v$asm_file;
-- 在数据库实例中
SELECT group_number, name, allocation_unit_size
FROM v$asm_diskgroup;
SELECT name, total_mb, free_mb
FROM v$asm_disk;
10. 常见坑与排错
10.1 ASM Disk 不可见
现象:v$asm_disk 中找不到 disk。
修复:
# 1. 检查 ASM_DISKSTRING
sqlplus / as sysasm
SHOW PARAMETER asm_diskstring;
-- 应为 '/dev/asm*'
# 2. 检查权限
ls -l /dev/asm*
# owner 应为 oracle:oinstall
# 3. 配置 UDEV
cat /etc/udev/rules.d/99-oracle-asm.rules
10.2 Disk Group 无法 MOUNT
现象:ORA-15032: not all alterations performed + ORA-15063。
修复:
-- 1. 检查 ASM alert log
! tail -50 $ORACLE_BASE/diag/asm/+asm/+ASM/trace/alert_+ASM.log
-- 2. 强制 mount
ALTER DISKGROUP data MOUNT FORCE;
-- 3. 重建 Disk Group(数据丢失!最后手段)
DROP DISKGROUP data INCLUDING CONTENTS;
CREATE DISKGROUP ...
10.3 ASM 实例启动失败
现象:ORA-01078: failure in processing system parameters。
修复:
# 检查 ASM 参数文件
ls -l $ORACLE_HOME/dbs/spfile+ASM.ora
ls -l $ORACLE_HOME/dbs/init+ASM.ora
# 使用 PFILE 启动
sqlplus / as sysasm
SQL> STARTUP PFILE='/tmp/init+ASM.ora';
10.4 AU 大小不一致
现象:不同 Disk Group AU 大小不同,影响性能。
修复:
-- 检查
SELECT name, allocation_unit_size/1024/1024 AS au_mb
FROM v$asm_diskgroup;
-- 统一规划,性能敏感场景建议相同 AU 大小
11. 最佳实践
- 生产用 ASM:性能与管理最优
- DATA / FRA / REDO 独立 Disk Group:分散 I/O
- AU 大小 4MB:大数据库推荐
- External Redundancy + 外部 RAID:性能最高
- Normal Redundancy:通用推荐
- Disk Group 用相同大小 Disk:均衡 I/O
- ASM Cluster:RAC 共享
- 监控 Disk 使用率:< 80%
- 定期备份 ASM 元数据:
md_backup - 使用 ASMCMD:统一管理工具
12. 参考资料
[1] Oracle Automatic Storage Management Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/
[2] Oracle Database Concepts 19c, “Automatic Storage Management” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/automatic-storage-management.html