应查V$RMAN_STATUS视图确认RMAN备份是否成功及最近时间,STATUS须为'COMPLETED'或'COMPLETED WITH WARNINGS'且OPERATION='BACKUP',并注意其内存存储限制与及时区、权限问题。
rman 备份是否成功、最后一次是什么时候,不能只看邮件或日志文件——必须查数据库内部视图,否则可能漏掉失败但没告警的备份。
查最近一次 RMAN 备份时间用 V$RMAN_STATUS
这是最直接的方式,V$RMAN_STATUS 记录每次 RMAN 操作的起止、状态和类型。注意它只保留内存中近期记录(默认最多约 37278 条),不写入控制文件,所以不适合查半年前的备份。
-
STATUS字段必须是'COMPLETED'或'COMPLETED WITH WARNINGS'才算真正完成;'RUNNING'或'FAILED'都不算 -
OPERATION = 'BACKUP'是关键过滤条件,否则会混入CROSSCHECK、DELETE等操作 - 时间范围建议用
START_TIME >= TRUNC(SYSDATE) - 7,避免隐式转换导致索引失效
示例(查最近 7 天内完成的 DB FULL 备份):
SELECT START_TIME, END_TIME, STATUS, OBJECT_TYPE, INPUT_TYPE
FROM V$RMAN_STATUS
WHERE OPERATION = 'BACKUP'
AND OBJECT_TYPE = 'DB FULL'
AND STATUS IN ('COMPLETED', 'COMPLETED WITH WARNINGS')
AND START_TIME >= TRUNC(SYSDATE) - 7
ORDER BY START_TIME DESC
FETCH FIRST 1 ROW ONLY;
V$RMAN_BACKUP_JOB_DETAILS 提供更完整的备份元数据
V$RMAN_BACKUP_JOB_DETAILS 比 V$RMAN_STATUS 多出压缩率、输入/输出字节数、设备类型等字段,适合做容量分析或验证备份有效性。但它在某些旧版本 Oracle(如 10.2)中不可用,且数据刷新略滞后于 V$RMAN_STATUS。
- 字段
INPUT_BYTES_DISPLAY和OUTPUT_BYTES_DISPLAY是格式化后的字符串(如'12.34 GB'),不能直接参与数值计算 - 若需比对压缩效果,优先用原始数值字段
INPUT_BYTES/OUTPUT_BYTES,再除以1024^3转 GB - 该视图中
STATUS值与V$RMAN_STATUS不完全一致,例如没有RUNNING,只有已完成状态
查最近一次全备详情:
SELECT START_TIME, END_TIME, OUTPUT_DEVICE_TYPE, COMPRESSION_RATIO,
ROUND(INPUT_BYTES/1024/1024/1024, 2) AS INPUT_GB,
ROUND(OUTPUT_BYTES/1024/1024/1024, 2) AS OUTPUT_GB
FROM V$RMAN_BACKUP_JOB_DETAILS
WHERE INPUT_TYPE = 'DB FULL'
AND STATUS = 'COMPLETED'
ORDER BY START_TIME DESC
FETCH FIRST 1 ROW ONLY;查备份集物理信息要连查 V$BACKUP_SET 和 V$BACKUP_PIECE
如果想知道备份集是否还在磁盘上、有没有被 DELETE OBSOLETE 清掉,光看状态不够,得查物理备份片是否存在。这时需要关联 V$BACKUP_SET 和 V$BACKUP_PIECE,并过滤 STATUS IN ('A', 'X')(A 表示 AVAILABLE,X 表示 EXPIRED)。
-
V$BACKUP_PIECE.DELETED = 'NO'是判断备份片是否仍可恢复的关键条件,别只看V$RMAN_STATUS的状态 -
COMPLETION_TIME在V$BACKUP_SET中更可靠,因为它是备份片写完的时间,比V$RMAN_STATUS.END_TIME更贴近实际完成点 - 如果备份到磁带(
SBT_TAPE),HANDLE字段通常为空或为逻辑名,无法直接看到路径
查最新一个可用备份集的完成时间和大小:
SELECT bs.COMPLETION_TIME,
bp.HANDLE,
ROUND(bp.BYTES/1024/1024/1024, 2) AS SIZE_GB
FROM V$BACKUP_SET bs
JOIN V$BACKUP_PIECE bp ON bs.SET_STAMP = bp.SET_STAMP AND bs.SET_COUNT = bp.SET_COUNT
WHERE bp.STATUS IN ('A', 'X') AND bp.DELETED = 'NO'
ORDER BY bs.COMPLETION_TIME DESC
FETCH FIRST 1 ROW ONLY;容易忽略的时区和权限问题
V$RMAN_STATUS 和 V$RMAN_BACKUP_JOB_DETAILS 中的 START_TIME/END_TIME 是数据库时区(DBTIMEZONE),不是操作系统时区。如果你从监控脚本里用 date 取系统时间去比对,可能差 8 小时。
- 用
SYSDATE或TRUNC(SYSDATE)是安全的,它们和视图时间同源 - 普通用户默认查不到这些视图,需要
SELECT_CATALOG_ROLE或显式授权:GRANT SELECT ON V_$RMAN_STATUS TO your_user; -
V$开头的视图本质是V_$基表的同义词,真正基表名带下划线,授权时必须用带下划线的名
查当前用户是否有权限:
SELECT * FROM SESSION_ROLES WHERE ROLE = 'SELECT_CATALOG_ROLE';
没有就联系 DBA 授权,别硬试 SELECT * FROM V$RMAN_STATUS 报 ORA-00942。


















