
好的,以下是针对 Oracle 19c 中 V$BACKUP_FILES 动态性能视图的全面、详细的解析。这个视图功能强大且独特,与其他备份视图有显著区别。
1. 视图作用
V$BACKUP_FILES 提供 RMAN 可以备份或已经备份的所有文件的统一目录视图。它的核心作用是发现和枚举,而非仅仅记录历史。其主要功能包括:
- 备份前发现: 列出数据库当前所有可被备份的文件(数据文件、归档日志、控制文件、spfile),包括那些从未被备份过的新文件。
- 备份后查询: 列出所有已经被备份的文件及其备份片信息。
- 通道配置模拟: 模拟 RMAN 通道配置,显示文件如果被备份将会存储在何处(
HANDLE字段)。 - 文件删除决策: 识别哪些归档日志或文件副本可以被安全删除(因为已有备份)。
✅ 核心价值: 它是一个面向未来(规划) 和现在(发现) 的视图,而其他备份视图(如
V$BACKUP_DATAFILE)主要面向过去(历史)。
2. 使用场景
- 备份准备与规划: 在执行备份前,查看所有需要备份的文件列表和预计大小。
- 定位孤儿文件: 发现磁盘上存在的备份片文件,但在控制文件中没有记录(
STATUS='EXPIRED')。 - 清理归档日志: 查询哪些归档日志已经被备份,可以安全删除。
- 验证配置: 测试
CONFIGURE CHANNEL ... FORMAT配置是否正确,查看生成的备份片路径是否符合预期。 - 空间预估: 预估下一次备份需要的存储空间。
- 文件恢复: 快速找到包含特定数据文件或表空间的最新备份片的位置。
3. 字段详解 (Oracle 19c) - 关键字段
V$BACKUP_FILES 包含大量字段,以下是其中最关键的字段:
| 字段名 | 数据类型 | 描述 |
|---|---|---|
FILE_TYPE | VARCHAR2(20) | 关键:文件类型。主要值:DATAFILE, ARCHIVED LOG, CONTROLFILE, SPFILE, BACKUP PIECE, DATAFILE COPY。 |
STATUS | VARCHAR2(1) | 关键:文件状态。A (AVAILABLE - 文件存在且可备份/恢复), X (EXPIRED - RMAN 找不到文件), D (DELETED - 文件已被删除) |
HANDLE | VARCHAR2(513) | 关键:文件的完整路径/句柄。对于未备份的文件,此字段根据通道配置模拟生成路径。 |
COMPLETION_TIME | DATE | 备份片的完成时间。对于尚未备份的文件,此值为 NULL。 |
SIZE | NUMBER | 文件的字节大小。 |
BLOCKS | NUMBER | 文件的块数。 |
TAG | VARCHAR2(32) | 备份的标签。 |
FNAME | VARCHAR2(513) | 原始文件的名称(例如数据文件的路径)。对于 FILE_TYPE='DATAFILE',此字段是数据文件当前路径。 |
FILE# | NUMBER | 数据文件或归档日志的文件编号。 |
SET_STAMP | NUMBER | 备份集的时间戳(关联 V$BACKUP_SET)。 |
SET_COUNT | NUMBER | 备份集的计数(关联 V$BACKUP_SET)。 |
BS_KEY | NUMBER | 备份集主键(关联 V$BACKUP_SET)。 |
DEVICE_TYPE | VARCHAR2(17) | 设备类型:DISK 或 SBT_TAPE。 |
BACKUP_TYPE | VARCHAR2(13) | 备份类型:FULL, INCREMENTAL, ARCHIVELOG。 |
INCREMENTAL_LEVEL | NUMBER | 增量备份级别(0,1)。 |
KEEP | VARCHAR2(8) | 备份是否被长期保留:YES, NO。 |
KEEP_UNTIL | DATE | 长期保留的截止日期。 |
COPY_RECID | NUMBER | 文件副本的记录 ID(关联 V$DATAFILE_COPY)。 |
📌
STATUS字段解读:
A(AVAILABLE): 文件存在于磁盘上。对于归档日志或数据文件,表示文件可被备份;对于备份片,表示文件可用于恢复。X(EXPIRED): RMAN 在CONFIGUREd 的路径下找不到该文件。通常发生在手动删除备份文件后未执行CROSSCHECK,或执行CROSSCHECK后文件确实丢失。D(DELETED): 文件已被 RMAN 的DELETE命令删除。
4. 相关视图与基表
关联视图
| 视图名称 | 描述 | 与 V$BACKUP_FILES 的关系 |
|---|---|---|
V$BACKUP_SET | 备份集元数据。 | V$BACKUP_FILES 中的备份片 (FILE_TYPE='BACKUP PIECE') 可以通过 SET_STAMP/SET_COUNT 或 BS_KEY 关联到此视图。 |
V$BACKUP_DATAFILE | 数据文件备份详情。 | V$BACKUP_FILES 提供文件列表,V$BACKUP_DATAFILE 提供备份的详细 SCN 信息。 |
V$ARCHIVED_LOG | 归档日志信息。 | V$BACKUP_FILES 可以显示哪些 ARCHIVED LOG 已被备份 (STATUS='A' 且有 COMPLETION_TIME)。 |
V$DATAFILE_COPY | 数据文件副本信息。 | V$BACKUP_FILES 中的 FILE_TYPE='DATAFILE COPY' 记录可以关联到此视图。 |
底层基表
V$BACKUP_FILES 是一个功能视图 (Function View),它没有固定的底层基表。它的数据是动态生成的:
- 对于可备份文件:它通过内部查询(例如到
X$KCCFE- 文件枚举)来发现当前数据库的所有数据文件、控制文件、归档日志等。 - 对于备份文件:它查询控制文件中的备份元数据基表(如
X$KRBMS- 备份片记录)。 - 对于模拟路径:它动态应用当前 RMAN 通道配置(
CONFIGURE CHANNEL ... FORMAT)来生成HANDLE。
⚠️ 这意味着每次查询
V$BACKUP_FILES,它都可能执行一系列内部操作来生成结果,在生产系统上应谨慎使用,避免过度查询消耗资源。
5. 底层详细原理
工作流程
graph TD
A[查询 V$BACKUP_FILES] --> B{指定 FILE_TYPE?}
B -->|NO| C[枚举所有类型文件<br/>1. 当前数据/控制文件<br/>2. 磁盘上的归档日志<br/>3. 控制文件中的备份记录<br/>4. 应用格式模拟未备份文件]
B -->|YES| D[只枚举指定类型的文件]
C --> E[为每条记录设置 STATUS<br/>(A, X, D)]
D --> E
E --> F[返回结果集]
关键机制
- 文件发现 (Discovery): 视图的核心。它扫描磁盘上的归档日志目录(
LOG_ARCHIVE_DEST_N)和所有数据文件头,构建出一个"应该存在"的文件列表。 - 状态判定 (Crosscheck in Memory): 将发现的文件列表与控制文件中记录的备份元数据进行比对,确定每个文件的状态 (
A,X,D)。 - 路径模拟 (Path Simulation): 对于尚未备份的文件,RMAN 会根据配置的
CHANNEL ... FORMAT字符串,结合变量(如%U、%d、%T等)动态生成一个预期的备份路径。这就是为什么查询未备份文件也会看到HANDLE的原因。
6. 关键知识点介绍
1. 与 CROSSCHECK 命令的关系
V$BACKUP_FILES 视图的执行过程在内存中模拟了一次轻量级的 CROSSCHECK。但它不会永久更新控制文件。真正的 CROSSCHECK 命令会:
- 物理检查磁盘或磁带上的文件。
- 将状态 (
STATUS) 持久化更新到控制文件中。 - 之后,
V$BACKUP_FILES查询会反映这个持久化的状态。
2. 文件类型过滤
该视图通常需要与 DBMS_RMANA 包一起使用,通过设置一个"文件类型"的输入参数来指定要枚举的文件类型。最常用的方法是使用 SELECT * FROM V$BACKUP_FILES,这会触发对所有类型的枚举。
3. 性能考量
由于需要动态发现和枚举大量文件,在拥有数万甚至数十万个归档日志或大量备份片的系统上,全量查询 V$BACKUP_FILES 可能会非常耗时并消耗相当多的 CPU 和 I/O 资源。务必添加 WHERE 子句进行过滤。
7. 常用查询 SQL
① 查看所有可备份的数据文件和当前状态
SELECT file#, fname AS datafile_name, status, handle AS projected_backup_path,
ROUND(size/1024/1024, 2) AS size_mb
FROM v$backup_files
WHERE file_type = 'DATAFILE'
ORDER BY file#;
② 查找已被备份的归档日志(即可安全删除的日志)
SELECT file#, handle AS archived_log_path,
TO_CHAR(completion_time, 'YYYY-MM-DD HH24:MI:SS') AS backup_time,
sequence#
FROM v$backup_files
WHERE file_type = 'ARCHIVED LOG'
AND status = 'A' -- Available and backed up
AND completion_time IS NOT NULL -- This confirms it has been backed up
ORDER BY sequence#;
③ 查找所有状态为 EXPIRED 的备份片(即文件已丢失)
SELECT set_stamp, set_count, handle, device_type,
TO_CHAR(completion_time, 'YYYY-MM-DD HH24:MI:SS') AS backup_time
FROM v$backup_files
WHERE file_type = 'BACKUP PIECE'
AND status = 'X' -- Expired
ORDER BY completion_time DESC;
④ 模拟 RMAN 配置,查看备份特定文件会存到哪里
SELECT fname, handle AS simulated_backup_handle
FROM v$backup_files
WHERE file_type = 'SPFILE' -- or 'CONTROLFILE', or filter by a specific DATAFILE
AND status = 'A'
AND completion_time IS NULL; -- This means it hasn't been backed up yet
⑤ 综合查询:按类型和状态统计文件数和总大小
SELECT file_type,
status,
COUNT(*) AS file_count,
ROUND(SUM(size)/1024/1024/1024, 2) AS total_size_gb
FROM v$backup_files
GROUP BY file_type, status
ORDER BY file_type, status;
总结
- 核心价值:
V$BACKUP_FILES是 RMAN 的"文件系统浏览器",提供了全局的、统一的视角来查看所有与备份相关的文件,无论是已备份的还是待备份的。 - 最佳实践:
- 使用
WHERE子句始终过滤查询,避免全表扫描带来的性能开销。 - 理解
STATUS字段的含义是使用该视图的关键。 - 将其与
CROSSCHECK和DELETE EXPIRED命令结合使用,进行备份元数据维护。
- 使用
- 关键注意:
- 它是一个功能视图,数据非持久化,每次查询都可能动态生成。
- 对于
HANDLE字段,要区分是真实存在的备份片路径还是根据配置模拟生成的路径(COMPLETION_TIME IS NULL时是模拟路径)。
欢迎关注我的公众号《IT小Chen》

被折叠的 条评论
为什么被折叠?



