
Oracle 数据库 “Disk file Mirror/Media Repair Write” 等待事件深度解析
一、等待事件本质与原理
官方定义:
Disk file Mirror/Media Repair Write 是 Oracle 数据库在 ASM(Automatic Storage Management)环境 中特有的等待事件,主要发生在以下场景:
- 数据写入需要同时更新多个镜像副本时
- ASM 检测到磁盘损坏后自动执行介质修复时
- 磁盘组再平衡(Rebalance)操作期间
核心原理:
graph TD
A[DBWR 发起写请求] --> B{ASM 冗余类型}
B -->|NORMAL 冗余| C[写入主副本 + 镜像副本]
B -->|HIGH 冗余| D[写入主副本 + 2个镜像副本]
C --> E[等待所有副本写入确认]
D --> E
E --> F{是否有副本写入失败?}
F -->|是| G[触发 Media Repair 机制]
F -->|否| H[写入完成]
G --> I[从健康副本复制数据到新位置]
I --> J[更新 ASM 元数据]
二、产生过程与典型场景
1. 镜像写入过程
- DBWR 将脏数据块写入 ASM 磁盘组
- ASM 根据冗余级别(NORMAL/HIGH)选择多个副本位置
- 并发写入所有副本磁盘
- 等待事件触发点:等待所有副本写入确认的阻塞时间
2. 介质修复过程
- ASM 检测到磁盘损坏(SMART 错误或 I/O 超时)
- 标记损坏磁盘为 OFFLINE
- 自动启动修复进程(ARBx)
- 从健康副本读取数据并写入新位置
- 等待事件触发点:修复过程中的数据复制阶段
典型场景:
- 磁盘故障:物理磁盘损坏或链路故障
- 存储性能不均:镜像磁盘之间性能差异大(如 SSD+HDD 混用)
- 高并发写入:批量数据加载或大量 DML 操作
- 磁盘组变更:添加/删除磁盘触发的再平衡操作
- ASM 冗余变更:修改磁盘组冗余级别时
三、根本原因分析
存储层问题
| 问题类型 | 检测指标 | 影响 |
|---|---|---|
| 慢盘/坏盘 | I/O 响应时间 > 20ms | 拖累整个镜像组写入速度 |
| 存储带宽瓶颈 | 存储端口利用率 > 70% | 并发写入能力不足 |
| RAID 控制器故障 | 控制器缓存错误日志 | 写入缓冲失效 |
| 网络问题(Exadata) | InfiniBand 丢包率 > 0.1% | 存储节点通信延迟 |
ASM 配置问题
- 磁盘组不均衡:磁盘大小/性能差异大
- 冗余级别过高:HIGH 冗余导致写放大(3副本写入)
- 再平衡参数不当:
_asm_imbalance_tolerance设置不合理 - AU 大小不匹配:4MB AU 处理小 I/O 效率低
数据库问题
- 高频率提交(频繁 log file sync)
- 超大事务(批量 INSERT/DELETE)
- 热块争用(索引分裂/ASSM 位图更新)
四、详细排查流程
步骤 1:确认等待事件特征
-- 查看等待事件统计
SELECT event, total_waits, time_waited_micro,
ROUND(time_waited_micro/NULLIF(total_waits,0)) avg_wait_us
FROM v$system_event
WHERE event = 'Disk file Mirror/Media Repair Write';
-- 关联会话信息
SELECT s.sid, s.serial#, s.username, s.sql_id, s.event,
p1, p2, p3, p1text, p2text, p3text
FROM v$session s
WHERE s.event = 'Disk file Mirror/Media Repair Write';
步骤 2:诊断 ASM 磁盘组状态
-- ASM 实例查询
SELECT group_number, name, state, type, total_mb, free_mb,
offline_disks, voting_files
FROM v$asm_diskgroup;
-- 检查磁盘错误
SELECT path, name, failgroup, header_status, mode_status,
repair_timer, mount_date, path
FROM v$asm_disk
WHERE mount_status != 'CACHED';
关键指标:
offline_disks> 0:存在离线磁盘repair_timer> 0:正在进行介质修复header_status:PROVISIONED/FORMER 状态异常
步骤 3:定位物理写入热点
-- 关联等待事件与对象
SELECT d.file_id, d.block_id, e.owner, e.segment_name, e.segment_type
FROM dba_extents e
JOIN (
SELECT DISTINCT p1 AS file_id, p2 AS block_id
FROM v$session_wait
WHERE event = 'Disk file Mirror/Media Repair Write'
) d ON e.block_id <= d.block_id
AND e.block_id + e.blocks > d.block_id;
步骤 4:存储性能分析
操作系统级检查:
# Linux 环境
iostat -dxm 1 | grep -E '(Device|sd|asm)'
# 关键指标:
# await > 10ms - 磁盘响应延迟
# %util > 70% - 磁盘饱和
# svctm > 5ms - 控制器瓶颈
ASM 性能视图:
SELECT group_number, disk_number, reads, writes,
read_time, write_time,
ROUND(write_time/NULLIF(writes,0)) avg_write_ms
FROM v$asm_disk_iostat
WHERE avg_write_ms > 20; -- 高延迟磁盘
步骤 5:关联数据库负载
-- 检查高写入 SQL
SELECT sql_id, executions, buffer_gets, disk_writes,
sql_text
FROM (SELECT * FROM v$sql ORDER BY disk_writes DESC)
WHERE ROWNUM <= 5;
-- DBWR 写入压力
SELECT * FROM v$bgprocess WHERE name LIKE 'DBW%';
五、解决方案与优化建议
1. 存储层优化
- 更换故障磁盘:
ALTER DISKGROUP DATA OFFLINE DISK DATA_0004; ALTER DISKGROUP DATA ONLINE DISK DATA_0004; - 平衡磁盘性能:确保镜像组内磁盘规格一致
- 升级存储硬件:SSD 替换 HDD,升级 HBA 卡
2. ASM 配置优化
- 调整再平衡参数:
ALTER DISKGROUP DATA REBALANCE POWER 11; -- 提高并行度 - 优化 AU 大小(创建新磁盘组时):
CREATE DISKGROUP DATA HIGH REDUNDANCY DISK '/dev/sdb1' SIZE 1024G AU_SIZE 4M;
3. 数据库层优化
- 分散写入热点:
-- 分区表 CREATE TABLE sales (...) PARTITION BY RANGE (sale_date) (PARTITION p1 VALUES LESS THAN (...)); -- 反转键索引 CREATE INDEX idx ON table(col) REVERSE; - 优化写入事务:
-- 批量提交 BEGIN FOR i IN 1..10000 LOOP INSERT ...; IF MOD(i,1000)=0 THEN COMMIT; END IF; END LOOP; END;
4. 参数调整
-- 增加 DBWR 进程
ALTER SYSTEM SET db_writer_processes=4;
-- 启用异步 I/O
ALTER SYSTEM SET filesystemio_options=SETALL SCOPE=SPFILE;
六、高级诊断工具
-
ASM 跟踪文件分析:
ALTER SESSION SET events 'trace[ASM] disk high'; -
AWR 报告关键章节:
- ASM Instance Activity Stats
- I/O Stats by Filetype
- Top 5 Timed Events
-
Exadata 专用诊断:
SELECT * FROM v$cell_state; -- 存储节点状态 SELECT * FROM v$iofuncmetric; -- I/O 函数级指标
七、预防性维护建议
-
定期检查:
-- 每月执行 ALTER DISKGROUP DATA CHECK ALL; -
监控体系:
- 持续监控
v$asm_operation - 设置磁盘 SMART 预警
- 部署 OSWatcher 捕获 I/O 指标
- 持续监控
-
容量规划:
SELECT name, total_mb, free_mb, ROUND((free_mb/total_mb)*100) pct_free FROM v$asm_diskgroup WHERE pct_free < 20; -- 空间不足预警
关键结论:该等待事件本质是 ASM 冗余机制的保护性延迟,优化核心在于:
- 确保存储硬件健康
- 平衡 ASM 磁盘组负载
- 避免数据库写入热点
当平均等待时间持续 > 20ms 时,必须进行深入诊断。
欢迎关注我的公众号《IT小Chen》

被折叠的 条评论
为什么被折叠?



