一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Oracle数据库如何查看RMAN备份历史

时间:2026-08-18 20:22:50 编辑:袖梨 来源:一聚教程网

V$RMAN_STATUS是查RMAN备份历史的首选视图,但仅内存驻留、默认最多保留约37278条记录,超限即被刷出;查最近一次成功全备需严格过滤OPERATION='BACKUP'、OBJECT_TYPE='DB FULL'、STATUS IN ('COMPLETED','COMPLETED WITH WARNINGS')及START_TIME>=TRUNC(SYSDATE)-7。

V$RMAN_STATUS 是查 RMAN 备份历史的首选视图,但它只存内存、默认最多保留约 37278 条记录,超过就刷掉——所以“查不到”不等于“没备份”,很可能是记录已过期。

查最近一次成功全备(V$RMAN_STATUS)

这个查询聚焦日常巡检,条件必须收严,否则容易混入干扰项:

  1. OPERATION = 'BACKUP' 是硬过滤,否则会拉出 CROSSCHECKDELETE OBSOLETE 等无关操作
  2. OBJECT_TYPE = 'DB FULL'INPUT_TYPE = 'DB FULL' 更可靠,旧版本中后者可能为空
  3. STATUS IN ('COMPLETED', 'COMPLETED WITH WARNINGS') 才算真正完成;'FAILED''RUNNING' 都不能算
  4. 时间范围用 START_TIME >= TRUNC(SYSDATE) - 7,避免 TO_DATE 字面量因 NLS 设置失效

示例语句:

SELECT START_TIME, END_TIME, STATUS, OBJECT_TYPEFROM V$RMAN_STATUSWHERE OPERATION = 'BACKUP'AND OBJECT_TYPE = 'DB FULL'AND STATUS IN ('COMPLETED', 'COMPLETED WITH WARNINGS')AND START_TIME >= TRUNC(SYSDATE) - 7ORDER BY START_TIME DESCFETCH FIRST 1 ROW ONLY;

查更久远或带容量的备份(V$RMAN_BACKUP_JOB_DETAILS)

V$RMAN_STATUS 返回空时,这是第二选择。它数据来自控制文件,持久性强,但 Oracle 10.2 及更早版本不支持:

  1. 没有 'RUNNING' 状态,所有记录都是已完成的,不用额外排除
  2. INPUT_BYTESOUTPUT_BYTES 是原始字节数,可用于计算压缩比
  3. INPUT_BYTES_DISPLAYOUTPUT_BYTES_DISPLAY 是带单位的格式化字符串,适合人眼阅读
  4. 刷新有轻微延迟(通常几秒),不适合监控实时进度

示例语句(查最近 30 天全备):

SELECT START_TIME, END_TIME, STATUS, INPUT_BYTES_DISPLAY, OUTPUT_BYTES_DISPLAY, COMPRESSION_RATIOFROM V$RMAN_BACKUP_JOB_DETAILSWHERE OPERATION = 'BACKUP'AND INPUT_TYPE = 'DB FULL'AND START_TIME >= TRUNC(SYSDATE) - 30ORDER BY START_TIME DESC;

查备份集物理信息(GV$BACKUP_PIECE + GV$BACKUP_SET)

要确认备份是否真的写到磁盘、路径在哪、大小多少、是否可用,得查这两个视图:

  1. STATUS = 'A' 表示 AVAILABLE'X'EXPIRED(RMAN 认为不存在),'D'DELETED(已被清理)
  2. DELETED = 'NO' 必须显式过滤,否则会拉出已删但未清理元数据的残影
  3. RAC 环境要用 GV$ 视图,单实例用 V$ 即可
  4. BYTES 字段单位是字节,除以 1024*1024*1024 得 GB,注意别漏括号

示例语句(查近 7 天所有可用备份集):

SELECT A.RECID "BACKUP SET", A.SET_STAMP, DECODE(B.INCREMENTAL_LEVEL, '', DECODE(BACKUP_TYPE,'L','Archivelog','Full'), 1,'Incr-1级', 0,'Incr-0级'),  DECODE(A.STATUS, 'A','AVAILABLE', 'D','DELETED', 'X','EXPIRED') "STATUS", A.DEVICE_TYPE, A.START_TIME, A.COMPLETION_TIME, ROUND(A.BYTES/1024/1024/1024, 2) "Size(GB)"FROM GV$BACKUP_PIECE A, GV$BACKUP_SET BWHERE A.SET_STAMP = B.SET_STAMPAND A.DELETED = 'NO'AND A.START_TIME >= TRUNC(SYSDATE) - 7ORDER BY A.COMPLETION_TIME DESC;

常见误判和排查顺序

查不到备份,先别急着报故障——按以下顺序排查:

  1. 先跑 SELECT COUNT(*) FROM V$RMAN_STATUS WHERE OPERATION = 'BACKUP',看总数是否接近 37278;接近就说明老记录被刷掉了
  2. V$RMAN_BACKUP_JOB_DETAILS,如果它也空,再检查 RMAN 配置:SELECT * FROM V$RMAN_CONFIGURATION,确认 RETENTION POLICY 是否太激进
  3. 如果两个视图都无记录,但 RMAN 日志显示成功,立刻查 LIST BACKUPSET 命令输出——它走的是控制文件,和 SQL 视图来源不同
  4. V$RMAN_OUTPUT 能看到 RMAN 执行时的逐行输出,但也是内存视图,同样受 37278 条限制,且不包含错误堆栈

最易被忽略的一点:V$RMAN_STATUS 中的 COMMAND_ID 是时间戳字符串(如 '2026-07-27T09:15:22'),不是数字,用它做范围比较时别用 BETWEEN,应转为 TO_TIMESTAMP 或直接用 START_TIME 字段。

热门栏目