v$rman_backup_job_details查不到实时读写速度,因其仅记录已结束作业的统计值;实时速率需查v$backup_sync_io或v$backup_async_io中discrete_bytes_per_second字段。
v$rman_backup_job_details 查不到实时读写速度——它只记录已结束作业的统计值,对正在运行的备份完全不可见。
为什么 V$RMAN_BACKUP_JOB_DETAILS 不能反映实时速率
这个视图本质是“事后记账本”,不是“进度仪表盘”。只要备份还没完成,它的 START_TIME 和 END_TIME 都为空,INPUT_BYTES、OUTPUT_BYTES、ELAPSED_SECONDS 等字段也不会刷新。哪怕备份已执行 90 分钟,只要没退出 RMAN,该视图里就查不到这条记录。
-
STATUS字段只有COMPLETED、FAILED、COMPLETED WITH WARNINGS等终态值,没有RUNNING - 所谓“输入字节/秒”或“压缩率”都是最终计算值,无法用于判断当前通道是否卡死
- 如果你在备份中途查这个视图并没看到数据,不是语句写错,而是设计如此
真正能看实时读写速率的两个视图
要监控“此刻每秒写了多少 MB”,必须转向 I/O 层级的动态视图:
-
V$BACKUP_SYNC_IO:显示同步 I/O 的实时吞吐,关键字段是DISCRETE_BYTES_PER_SECOND(单位:字节/秒),TYPE = 'AGGREGATE'的行代表整体速率 -
V$BACKUP_ASYNC_IO:对应异步 I/O 场景(如启用BACKUP ASYNC或某些 MML 配置),同样关注DISCRETE_BYTES_PER_SECOND
这两个视图的数据只驻留在内存中,实例重启即清空;但它们会在备份进行中持续更新,每几秒就能看到变化。
示例查询(取最近 5 秒内最高瞬时速率):
SELECT MAX(discrete_bytes_per_second)/1024/1024 mb_per_sec FROM v$backup_sync_io WHERE type = 'AGGREGATE' AND open_time > SYSDATE - 5/86400;
结合 v$session_longops 看“进度+预估速率”
v$session_longops 不提供原始字节数,但它能告诉你“还剩多久”,间接反映当前速率是否异常:
-
OPNAME LIKE 'RMAN%'且OPNAME NOT LIKE '%aggregate%'才是具体任务(如RMAN: full backup) -
TIME_REMAINING > 0表示该操作仍在进行,且 Oracle 已基于历史采样估算剩余时间 - 若
TIME_REMAINING长期不下降,或突然跳增,大概率是 I/O 停滞(比如磁带机断连、NFS 挂起)
注意:SOFAR/TOTALWORK 对备份集(backupset)类型常为 0,别强依赖百分比;重点盯 TIME_REMAINING 的趋势变化。
容易被忽略的关键点
监控链路上最脆弱的一环,不是查哪个视图,而是忘记权限和时间窗口:
- 所有这些视图(
V$BACKUP_SYNC_IO、v$session_longops、V$RMAN_BACKUP_JOB_DETAILS)都要求SYSDBA或至少SELECT_CATALOG_ROLE权限,普通用户查出来永远是空 -
V$BACKUP_SYNC_IO中的OPEN_TIME是会话打开时间,不是备份开始时间;若通道复用频繁,得结合V$SESSION的LOGON_TIME过滤 - 不要把
DISCRETE_BYTES_PER_SECOND当作稳定带宽指标——它是一次性采样值,波动极大;应聚合 10~30 秒取平均,否则看到的可能是毛刺











