v$session_longops 是唯一能稳定反映 rman 实时进度的视图,因其准确显示当前子任务完成度(如归档日志、数据文件等分阶段进度),而 v$rman_backup_job_details 和 v$backup.percent_done 仅适用于历史记录或特定备份类型。

V$SESSION_LONGOPS 是唯一能稳定反映 RMAN 实时进度的视图,其他视图要么只存历史、要么字段长期为 0,别指望靠 V$RMAN_BACKUP_JOB_DETAILS 或 V$BACKUP.PERCENT_DONE 看正在跑的任务。
查不到进度?先确认 RMAN 确实在运行
直接查 V$SESSION_LONGOPS 却没结果,大概率是 RMAN 根本没真正启动,或会话已退出。先执行:
-
SELECT sid, client_info FROM V$SESSION WHERE client_info LIKE '%rman%'—— 如果返回空,说明当前没有活跃的 RMAN 会话 - 如果返回了 SID,但
V$SESSION_LONGOPS仍无对应记录,检查是否漏了过滤条件:OPNAME LIKE 'RMAN%'比= 'RMAN backup'更可靠,因为 OPNAME 可能被截断(如 'RMAN backup datab...') - RAC 环境下必须用
GV$SESSION_LONGOPS并加WHERE INST_ID = <your_instance_id></your_instance_id>,否则可能查错节点
V$SESSION_LONGOPS 的百分比不是全局进度
它显示的是“当前子任务”的完成度,不是整个备份的总进度。一个全库备份会拆成多个工作单元:归档日志 → 数据文件1 → 数据文件2 → 控制文件 → SPFILE,所以你会看到 %_COMPLETE 从 0 跳到 100、再跳回 0、再跳到 100……这是正常行为。
- 若 %_COMPLETE 长期卡在 0%,不是视图失效,而是某个通道卡住:查对应
SID的client_info,拿到 OS PID,再用ps -ef | grep <pid></pid>看进程是否僵死 -
ELAPSED_SECONDS和TIME_REMAINING在部分 Oracle 版本中不稳定,优先信ROUND(SOFAR/TOTALWORK*100, 2) -
SOFAR = TOTALWORK表示该子任务已完成,下一个还没开始更新 —— 此时百分比会“跳变”,不是延迟
为什么 V$BACKUP.PERCENT_DONE 总是 0
这不是 bug,是 Oracle 对备份类型的硬性限制:PERCENT_DONE 只对镜像拷贝(COPY)和部分归档日志备份实时更新;对默认的备份集(BACKUPSET),这个字段全程为 0。
- 执行
BACKUP DATABASE或BACKUP AS BACKUPSET DATABASE时,V$BACKUP.PERCENT_DONE基本无效 - 如果
V$BACKUP.STATUS = 'ACTIVE'但PERCENT_DONE = 0,只要V$SESSION_LONGOPS有对应记录,就说明任务确实在跑 - 想确认 I/O 是否真在干活,查
V$BACKUP_SYNC_IO等待事件,看是不是卡在db file sequential read或存储层超时
归档日志备份进度得单独盯 V$BACKUP_REDOLOG
V$SESSION_LONGOPS 对归档日志备份也有效,但更细粒度的进展要看 V$BACKUP_REDOLOG —— 它逐条列出被选中的归档日志,并实时更新状态。
- 关键字段:
SEQUENCE#(日志序号)、THREAD#(线程号)、STATUS(ACTIVE表示正在读,COMPLETED表示已写入备份片) - 执行
BACKUP ARCHIVELOG ALL后,SELECT THREAD#, SEQUENCE#, STATUS FROM V$BACKUP_REDOLOG ORDER BY FIRST_TIME能立刻看到哪条日志卡住了 - 若某条
STATUS = 'ACTIVE'超过 10 分钟,且对应归档文件在磁盘上存在但不可读,要检查 ASM diskgroup 状态或归档路径权限











