如果你刚接触 ASM,建议把这句话默念三遍。本文基于 11gR2 官方文档,并结合 12c/19c 的新特性与日常运维经验,把「磁盘组、磁盘、文件」这三个概念揉碎、讲透。
ASM Disk Group:自描述的存储池
ASM Disk Group(DG)是由一个或多个 ASM Disk 组成的逻辑存储池,具备以下特点:
- 自包含:所有元数据(磁盘头、文件目录、别名、仲裁信息等)都存放在 DG 内部,磁盘组本身即可“自描述”。
- 独立单元:一个 DG 的元数据损坏不会影响其他 DG。
- 文件系统接口:对 DBA 而言,DG 就像一个大目录,创建表空间时直接写
+DATA
,不需要关心底层磁盘名。
建议
- 11gR2 之前:两个 DG 足够
+DATA
:数据文件、控制文件、redo+FRA
:备份、归档、闪回日志
- 11gR2 之后:考虑第三个 DG
+OCR
:ASM spfile、OCR、voting file(Grid Infrastructure 专属)
- 12c 及以后:
- 支持 511 个 DG(11g 只有 63 个)
- 支持 32 PB 单盘、4 PB 单 DG,限制进一步放开。
ASM Disk:磁盘如何“入团”
先分区,再入团
- 强烈建议:无论整盘还是 LUN,一律先分区(哪怕只分一个区)。 好处:避免操作系统把整块盘当成“空闲”而被误格式化;分区表还能存放 ASM 磁盘头信息。
- 常见来源:
- 本地盘:SATA/SAS/NVMe
- SAN:FC / iSCSI / FCoE LUN
- NAS:NFS 挂载(仅 12c 后支持,性能有限)
- Exadata:LIBCELL 输出的 Grid Disk
磁盘发现机制
- 参数:
ASM_DISKSTRING
- 默认值:
*
(Linux 下/dev/raw/*
、/dev/sd*
、/dev/dm-*
等都会被扫) - 建议显式指定,例如:
/dev/oracleasm/disks/*
,减少误扫。
- 默认值:
- 集群场景:不同节点 OS 设备名可以不同,ASM 只认磁盘头里的 GUID,不认
/dev/sdX
。
容量与数量限制
版本 | 单盘最大 | 单 DG 最大磁盘数 |
---|---|---|
11gR2 | 2 TB(BUG 6453944 前) | 10,000 |
12c+ | 32 PB | 10,000+ |
遇到“2 TB 以上盘添加成功”的坑,可打补丁或直接升级。
ASM File:一切皆文件
存放规则
- 唯一归属:一个文件只能属于一个 DG,但一个 DG 可以存放多个数据库的文件。
- 均衡分布:ASM 在 DG 内所有磁盘上条带化数据,既保证 I/O 均衡,又逼近裸设备性能。
- 编号机制:
- 数据文件:从 256 开始编号
- 元数据文件:1–255 预留(如 File#1 是磁盘头,File#2 是文件目录,等等)
支持类型
类别 | 示例文件 | 备注 |
---|---|---|
数据库文件 | 数据文件、控制文件、redo、standby redo、归档、备份集、Data Pump 文件 | 直接存放 |
ASM 元数据 | 磁盘头、文件目录、别名目录、仲裁文件 | 自动管理 |
非数据库文件 | 二进制、文本、trace、日志、应用安装包 | 11gR2 前不支持,需 ACFS 或本地文件系统 |
ACFS 的登场
- 11gR2 引入 ASM Cluster File System (ACFS):
- 基于 ASM DG 的通用集群文件系统。
- 支持数据库二进制、应用文件、日志等几乎所有传统文件类型。
- 支持快照、动态扩容、跨节点共享。
- 使用场景:Oracle Home、中间件、应用日志,甚至 Docker 镜像。
注意
- 磁盘命名惯例 在
/dev/oracleasm/disks/
下建软链接,命名包含 LUN ID(如DATA01
,DATA02
),便于排障。 - 磁盘头备份
kfed read /dev/oracleasm/disks/DATA01 > /backup/DATA01.kfed
一旦磁盘头损坏,可快速恢复。 - 监控空间
asmcmd lsdg
看使用率,超过 85% 及时加盘或 rebalance。 - ACFS 与 DBFS 的选择
- 需要集群级共享 → ACFS
- 单机或少量文件 → DBFS 更简单