跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何监控Oracle 19c RMAN备份的实时进度_查询V$SESSION_LONGOPS视图

v$session_longops是最稳的RMAN实时进度监控方式,它基于内核级工作单元更新sofar/totalwork,不受控制文件刷新延迟影响,且需配合v$rman_status判断作业最终状态。 直接看
v$session_longops
是最稳的实时进度监控方式,它不依赖 rman catalog,也不受控制文件刷新延迟影响,只要备份还在跑,就能看到百分比和预估剩余时间。 为什么
v$session_longops
能反映 RMAN 实时进度 Oracle 内部把 RMAN 备份拆成若干“可度量工作单元”(比如每个数据文件、每个归档日志段),每完成一个单元就更新
sofar
和
totalwork
。这个机制是内核级的,不受 RMAN 状态刷盘逻辑干扰——哪怕
v$rman_status
还卡在
RUNNING
或已清空,只要会话没退出,
v$session_longops
就持续有效。 常见误判点: 查不到记录?先确认 RMAN 是否真在运行:
SELECT sid, client_info FROM v$session WHERE client_info LIKE '%rman%';
返回空?可能
opname
匹配不准,用
LIKE 'RMAN%'
比
= 'RMAN backup'
更可靠 百分比卡住不动?检查
sofar = totalwork
是否成立——若相等说明该子任务已完成,下一个子任务还没触发更新
v$session_longops
查询必须加的过滤条件 裸查这个视图会返回大量无关记录(如 DBMS_STATS、SQL*Loader),必须用以下组合条件才能准确定位 RMAN 当前进度:
OPNAME LIKE 'RMAN%'
:覆盖
RMAN backup
、
RMAN restore
、
RMAN validate
等所有操作
OPNAME NOT LIKE '%aggregate%'
:排除聚合行(它没有
sofar
/
totalwork
,会报除零错误)
TOTALWORK != 0
:过滤掉初始化阶段未设工作量的伪记录
SOFAR TOTALWORK
:只显示“尚未完成”的任务,避免把已结束的子任务混进来 完整示例: 稿定在线PS PS软件网页版 下载
SELECT sid, serial#, opname, ROUND(sofar/totalwork*100, 2) "%_COMPLETE", TRUNC(elapsed_seconds/60)||':'||MOD(elapsed_seconds,60) "ELAPSED_MIN", TRUNC(time_remaining/60)||':'||MOD(time_remaining,60) "REMAINING_MIN" FROM v$session_longops WHERE opname LIKE 'RMAN%' AND opname NOT LIKE '%aggregate%' AND totalwork != 0 AND sofar <> totalwork;
进度数值怎么看才不误导
v$session_longops
的百分比是“当前子任务”的完成度,不是整个备份的全局进度。一个全库备份通常包含多个子任务(归档日志 → 数据文件1 → 数据文件2 → 控制文件),所以你会看到百分比反复从 0 跳到 100。 如果
%_COMPLETE
长期停在 0%,大概率是某个通道卡住:查
client_info
对应的
spid
,再用
ps -ef | grep spid
看 OS 进程是否僵死
TIME_REMAINING
是 Oracle 基于当前速率推算的,当 I/O 出现抖动(如 NFS 临时拥塞)时,该值可能剧烈跳变,不能当作绝对依据 真正反映“整体干了多少”的是
BYTES
字段(来自
v$backup_sync_io
),但它的更新频率远低于
v$session_longops
,不适合秒级盯盘 和
v$rman_status
搭配使用的实际价值
v$session_longops
解决“现在干到哪了”,
v$rman_status
解决“这个作业最终有没有成功”。两者必须配合,否则容易漏掉关键问题: 查到
v$session_longops
显示 100%,但
v$rman_status
里对应
session_stamp
的状态是
COMPLETED WITH WARNINGS
——说明备份集生成了,但可能跳过了离线数据文件或归档日志未删干净 查
v$session_longops
发现某通道卡在 99%,同时
v$rman_status
中该作业的
status
已变成
FAILED
——说明 RMAN 主控进程已放弃,但子会话还没清理完,此时强制 kill
sid
反而可能损坏备份片 关联字段只有
SESSION_STAMP
:用它把
v$session_longops.sid
和
v$rman_status.session_stamp
连起来,才能锁定具体是哪个 RMAN 作业出了问题 最易被忽略的一点:
v$session_longops
记录的是“会话级进度”,如果 RMAN 配了多个通道(
allocate channel c1
、
c2
),你会看到多行结果,每行代表一个通道的独立进度——别只盯着第一行看。

相关文章