Oracle ASMFD(ASM Filter Driver)
Oracle ASMFD(ASM Filter Driver)
适用版本:Oracle Database 12.2 / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
ASMFD(ASM Filter Driver) 是 12.2 引入的内核模块[1],为 ASM 磁盘提供过滤保护:
核心特性:
- 防止非 Oracle 进程访问 ASM 磁盘
- 替代 ASMLib
- 简化磁盘管理
- 支持 UDEV 集成
- 集群范围一致性
与 ASMLib 对比:
| 维度 | ASMLib | ASMFD |
|---|---|---|
| 内核模块 | oracleasm | oracleafd |
| 磁盘标识 | stamp | label |
| 保护 | 弱 | 强(Filter) |
| 集成 | 独立 | 与 Grid 集成 |
| 推荐 | 旧 | 新(12.2+) |
2. ASMFD 工作原理
2.1 过滤机制
应用/工具 I/O 请求
↓
+----------------------+
| ASMFD Filter Driver | ← 拦截 I/O
+----------------------+
│ │
│ Oracle 进程 │ 非Oracle 进程
▼ ▼
允许 拒绝
2.2 保护范围
- 防止
dd误写 ASM 磁盘 - 防止文件系统格式化
- 防止其他 Oracle 实例误用
- 防止非 Oracle 进程 I/O
3. ASMFD 安装
3.1 加载模块
# 加载 ASMFD 模块
modprobe oracleafd
# 验证
lsmod | grep oracleafd
# 配置开机加载
echo "oracleafd" >> /etc/modules-load.d/oracleafd.conf
3.2 配置 ASMFD
# 设置 ASMFD 路径
$ORACLE_HOME/bin/asmcmd afd_label data1 /dev/sdb1 --init
# 或通过 Grid Infrastructure
$ORACLE_HOME/bin/crsctl pin css -n hostname
$ORACLE_HOME/bin/asmcmd afd_init
4. 磁盘标签管理
4.1 标签磁盘
# 标签磁盘
asmcmd afd_label DATA1 /dev/sdb1
# 多磁盘
asmcmd afd_label DATA2 /dev/sdc1
asmcmd afd_label DATA3 /dev/sdd1
4.2 查看标签
# 查看所有标签
asmcmd afd_lsdsk
# 输出:
# --------------------------------------------------------------------------------
# Label Filtering Path
# --------------------------------------------------------------------------------
# DATA1 ENABLED /dev/sdb1
# DATA2 ENABLED /dev/sdc1
# DATA3 ENABLED /dev/sdd1
4.3 取消标签
# 卸载标签
asmcmd afd_unlabel DATA1
4.4 检查磁盘
# 检查磁盘是否可用
asmcmd afd_dsget
# 检查标签状态
asmcmd afd_lsdsk --label DATA1
5. 启用/禁用 Filter
5.1 启用 Filtering
# 启用所有磁盘的过滤
asmcmd afd_filter -e
# 或指定磁盘
asmcmd afd_filter -e /dev/sdb1
5.2 禁用 Filtering
# 禁用
asmcmd afd_filter -d
# 指定磁盘
asmcmd afd_filter -d /dev/sdb1
5.3 查看状态
asmcmd afd_lsdsk
# Filtering 列显示 ENABLED / DISABLED
6. 使用 ASMFD 磁盘
6.1 创建 Disk Group
-- 使用 ASMFD 标签的磁盘
CREATE DISKGROUP data EXTERNAL REDUNDANCY
DISK 'AFD:DATA1', 'AFD:DATA2', 'AFD:DATA3'
ATTRIBUTE 'au_size'='4M';
6.2 添加磁盘
-- 添加新磁盘
asmcmd afd_label DATA4 /dev/sde1
ALTER DISKGROUP data ADD DISK 'AFD:DATA4';
6.3 查看磁盘
SELECT
group_number,
disk_number,
mount_status,
header_status,
path
FROM v$asm_disk
WHERE path LIKE 'AFD:%';
7. ASMFD 与 ASMLib 迁移
7.1 迁移步骤
# 1. 停止 ASM
srvctl stop asm -n hostname
# 2. 卸载 ASMLib
oracleasm exit
# 3. 标签 ASMFD
asmcmd afd_label DATA1 /dev/sdb1
# 4. 启动 ASM
srvctl start asm -n hostname
# 5. 验证
asmcmd lsdsk
7.2 修改磁盘路径
-- 1. 停止使用磁盘的数据库
-- 2. Dismount 磁盘组
ALTER DISKGROUP data DISMOUNT;
-- 3. 修改 ASMFD 参数
-- 4. Mount 磁盘组
ALTER DISKGROUP data MOUNT;
8. ASMFD 与 UDEV
8.1 UDEV 规则示例
# /etc/udev/rules.d/99-oracle-asmfd.rules
KERNEL=="sdb1", OWNER="oracle", GROUP="dba", MODE="0660"
KERNEL=="sdc1", OWNER="oracle", GROUP="dba", MODE="0660"
8.2 重新加载 UDEV
udevadm control --reload-rules
udevadm trigger
9. 集群范围 ASMFD
9.1 所有节点配置
# 每个节点加载模块
modprobe oracleafd
# 每个节点标签磁盘(共享磁盘只需标签一次)
# 但每个节点都要看到标签
asmcmd afd_lsdsk
9.2 集群一致性
# 在任一节点标签后,所有节点可见
asmcmd afd_label DATA1 /dev/sdb1
# 节点 2 检查
asmcmd afd_lsdsk
10. 常见坑与排错
10.1 ORA-15137: ASMFD 模块未加载
修复:
# 加载模块
modprobe oracleafd
# 检查
lsmod | grep oracleafd
# 配置开机加载
echo "oracleafd" > /etc/modules-load.d/oracleafd.conf
10.2 磁盘标签失败
修复:
# 1. 检查磁盘
ls -l /dev/sdb1
# 2. 检查权限
chown oracle:dba /dev/sdb1
chmod 660 /dev/sdb1
# 3. 重新标签
asmcmd afd_label DATA1 /dev/sdb1
10.3 Filter 不生效
修复:
# 启用过滤
asmcmd afd_filter -e
# 检查状态
asmcmd afd_lsdsk
10.4 集群节点间标签不同步
修复:
# 1. 检查 ASMFD 配置
asmcmd afd_state
# 2. 重新初始化
asmcmd afd_init
# 3. 每个节点重新扫描
asmcmd afd_scan
10.5 ASMFD 替换 ASMLib 失败
修复:
# 1. 完全卸载 ASMLib
systemctl stop oracleasm
systemctl disable oracleasm
rpm -e oracleasm-support
# 2. 清除 ASMLib 标签
dd if=/dev/zero of=/dev/sdb1 bs=1M count=10
# 3. 加载 ASMFD
modprobe oracleafd
# 4. 标签
asmcmd afd_label DATA1 /dev/sdb1
11. 最佳实践
- 12.2+ 使用 ASMFD:替代 ASMLib
- 生产用 ASMFD:磁盘保护更强
- 统一磁盘命名:DATA1, DATA2, …
- UDEV + ASMFD:权限管理
- Filter 默认启用:保护磁盘
- 所有节点一致:集群同步
- 定期检查标签:afd_lsdsk
- 监控 ASMFD 日志:/var/log/messages
- 避免与 ASMLib 共存:单一选择
- 生产前测试:迁移验证
12. 参考资料
[1] Oracle ASM Administrator’s Guide 19c, “Managing Oracle ASM Filter Driver” https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/managing-oracle-asm-filter-driver.html
[2] Oracle Grid Infrastructure Installation Guide 19c, “Configuring ASMFD” https://docs.oracle.com/en/database/oracle/oracle-database/19/cwlin/