effective_bytes_per_second持续低于磁盘标称值30%即可判定i/o调度未跑满,需检查rman通道数与并行度配置;v$backup_async_io比os工具更准,因其仅统计rman异步i/o,排除归档、lgwr等干扰。
直接看日志里那行 effective_bytes_per_second,它比磁盘标称吞吐低一半以上,基本就能断定是 i/o 调度没跑满——不是数据库慢,是 rman 没用够硬件能力。
从 RMAN 日志里抓关键性能指标
RMAN 自己的日志(尤其是带 debug trace 或 log 参数运行时)会记录真实 I/O 效率,比 AWR 或 OS 工具更贴近备份路径。重点盯三类输出:
-
input datafile fno=... name=...后紧跟着的elapsed time和piece handle—— 单个数据文件耗时异常高,说明该文件所在 ASM diskgroup 或文件系统有瓶颈 -
channel ORA_DISK_1: starting piece ...后若出现大量waiting for archive log或checkpoint not complete,说明归档或检查点拖慢了读取起点 - 日志末尾或
V$BACKUP_ASYNC_IO查询结果中反复出现的EFFECTIVE_BYTES_PER_SECOND值 —— 若持续低于存储设备理论值的 30%,就是通道数或并行度没配对
为什么 V$BACKUP_ASYNC_IO 比 top/iostat 更准
OS 层工具看到的是混合负载下的总体 I/O,而 V$BACKUP_ASYNC_IO 是 RMAN 引擎内部实际发出的异步读请求统计,过滤掉了归档、LGWR、DBWR 等干扰项。尤其在 RAC 或高并发 OLTP 场景下:
-
TYPE = 'INPUT'行的WAIT_TIME高 → 数据文件读取卡在存储层(如 RAID 控制器队列满、ASM rebalance 中) -
TYPE = 'OUTPUT'行的WAIT_TIME高 → 备份目标写入慢(NFS 权限问题、挂载参数noac、本地磁盘已满) -
EFFECTIVE_BYTES_PER_SECOND接近磁盘标称值但整体耗时长 → CPU 成瓶颈(比如开了COMPRESS但没配够并行通道)
日志里藏匿的隐性线索:blocks_read vs datafile_blocks
查 V$BACKUP_DATAFILE 视图(需在备份完成后立刻查),对比每文件的 blocks_read 和 datafile_blocks:
- 若
blocks_read / datafile_blocks ≈ 100%且used_change_tracking = 'NO'→ BCT 没开,RMAN 正在全块扫描,伪增量 - 若某几个大文件
%READ明显高于其他(比如 98% vs 全局平均 45%)→ 这些文件刚被大量修改过,但 BCT 文件本身可能损坏或路径争用 -
incremental_level显示为1却读了全部块 → 检查V$BLOCK_CHANGE_TRACKING.STATUS是否真为ENABLED,别信配置命令的返回,要看这个视图
debug trace 日志里最常被忽略的一行
启用 rman target / debug trace=/tmp/rmandebug.txt 后,在 trace 文件里搜 ksfdr 或 kcfio 开头的行:
-
ksfdr: async read completed后跟超长耗时(>100ms)→ 存储响应延迟,不是 Oracle 问题 -
kcfio: write to file出现重复重试(retry count > 0)→ 备份路径文件系统权限/配额/inode 耗尽 - 连续多行
ksfd: opening file却无后续read→ RMAN 在等锁,大概率是多个通道写了同一挂载点,触发 NFS 或 ext4 的元数据锁
真正卡点往往不在 SQL 或参数,而在那一行不起眼的 kcfio retry 或 ksfdr 延迟——它不报错,只拖慢,但日志里清清楚楚写着。











