
好的,我们来对 Oracle 19C 数据库中的 V$BACKUP_SET 动态性能视图进行一次全面、深入的解析。
1. 视图概述与核心作用
V$BACKUP_SET 是一个至关重要的动态性能视图,它提供了在数据库控制文件中注册的所有备份集(Backup Set) 的元数据信息。备份集是 RMAN (Recovery Manager) 创建的备份输出的主要形式,它是一个逻辑结构,包含一个或多个物理文件(称为备份片,Backup Piece)。
核心作用可以概括为:
- 备份目录与清单:充当所有已完成备份集的主目录,DBA 可以快速查看数据库中存在哪些备份。
- 备份属性查询:提供每个备份集的详细属性,如备份类型(全量/增量)、级别、时间、大小、设备类型等。
- 恢复规划:在执行恢复操作前,DBA 通过此视图确定可用哪些备份集来进行恢复。
- 备份生命周期管理:与
DELETE OBSOLETE或CROSSCHECK等命令结合使用,用于验证和管理备份的保留与过期状态。 - 审计与报告:生成备份报告,用于合规性审计或容量规划。
2. 使用场景
-
恢复前的情报收集:
当需要执行时间点恢复时,DBA 会查询此视图,找到在目标时间点之前创建的、包含所需数据文件或归档日志的备份集。 -
日常备份验证:
在备份脚本运行后,通过查询此视图确认备份作业是否成功创建了预期的备份集,并检查其状态 (STATUS) 是否为COMPLETED而非EXPIRED。 -
诊断备份问题:
如果备份失败或备份集不可用,此视图可以帮助定位问题备份集,进而使用CROSSCHECK命令验证备份片文件是否实际存在于磁盘或磁带库上。 -
存储空间管理:
通过汇总BYTES字段,可以计算不同时间段内备份集占用的总空间,从而进行容量趋势分析和规划。 -
清理过时备份:
在运行DELETE OBSOLETE命令后,可以查询此视图确认标记为EXPIRED的备份集是否已被正确清理。
3. 字段详细含义
以下是 V$BACKUP_SET 视图中关键字段的解释:
| 字段名 | 数据类型 | 含义说明 |
|---|---|---|
| SET_STAMP | NUMBER | 备份集唯一标识符的一部分。与 SET_COUNT 共同组成备份集的唯一ID。这是一个内部时间戳。 |
| SET_COUNT | NUMBER | 备份集唯一标识符的另一部分。在同一个 SET_STAMP 下,SET_COUNT 是递增的。SET_STAMP 和 SET_COUNT 共同唯一标识一个备份集。 |
| BACKUP_TYPE | VARCHAR2(1) | 备份类型: • D : 数据文件全量备份 (Full)• I : 数据文件增量备份 (Incremental)• L : 归档日志备份 (Archivelog)• U : 控制文件备份 (Controlfile) • G : 归档日志删除记录 (不包含实际文件) |
| INCREMENTAL_LEVEL | NUMBER | 增量备份级别: • 0 : 增量级别 0 备份(基础备份)• 1 : 增量级别 1 备份(差异或累积)• NULL : 非增量备份(如全备、归档日志备份) |
| DEVICE_TYPE | VARCHAR2(17) | 创建备份集所使用的设备类型: • DISK : 磁盘• SBT_TAPE : 磁带(或第三方介质管理库) |
| COMPLETION_TIME | DATE | 备份集完成的时间。这是最重要的时间戳之一,用于基于时间的恢复和报告。 |
| ELAPSED_SECONDS | NUMBER | 创建整个备份集所花费的总时间(秒)。 |
| STATUS | VARCHAR2(8) | 备份集的状态: • AVAILABLE : 备份集可用且未被删除。• EXPIRED : 备份集已被 CROSSCHECK 命令标记为过期(在介质上找不到对应的备份片文件)。• DELETED : 备份集已被 DELETE 命令显式删除。 |
| KEEP | VARCHAR2(8) | 是否应用了保持策略: • NO : 备份集受配置的保留策略管理。• YES : 备份集已被 BACKUP ... KEEP 命令豁免于保留策略,会长期保留。• LOGS : (较少见) 仅保持归档日志。 |
| KEEP_UNTIL | DATE | 如果 KEEP 选项为 YES,此字段指定该备份集的保持到期时间。 |
| KEEP_OPTIONS | VARCHAR2(10) | 保持选项,如 BACKUP_LOGS 等。 |
| CONTROLFILE_INCLUDED | VARCHAR2(3) | 备份集中是否包含当前控制文件的快照: • YES • NO |
| OPTIMIZED | VARCHAR2(3) | 备份是否使用了优化功能(如增量备份的块更改跟踪)。 |
| BYTES | NUMBER | 备份集的总大小(字节)。 |
| BLOCK_SIZE | NUMBER | 备份集中块的字节大小。 |
| TAG | VARCHAR2(32) | 用户或 RMAN 分配给此备份集的标签(Tag)。 |
| RECID | NUMBER | (已废弃) 为了向后兼容而保留,请使用 SET_STAMP 和 SET_COUNT。 |
| STAMP | NUMBER | (已废弃) 为了向后兼容而保留,请使用 SET_STAMP 和 SET_COUNT。 |
4. 相关视图与基表
-
相关动态性能视图:
V$BACKUP_PIECE:显示构成备份集的物理备份片的详细信息(如文件名、路径、状态)。通过SET_STAMP和SET_COUNT与V$BACKUP_SET关联。V$BACKUP_FILES:19c 引入的更强大的视图,提供了备份集和备份片的统一视图,信息更全面。V$BACKUP_DATAFILE:显示备份集中包含的数据文件的详细信息。V$BACKUP_REDOLOG:显示备份集中包含的归档日志的详细信息(主要用于监控进行中的备份)。V$BACKUP_SPFILE:显示备份集中包含的服务器参数文件(SPFILE) 的详细信息。V$BACKUP_CORRUPTION:记录在备份过程中检测到的损坏块信息。V$DATABASE_BLOCK_CORRUPTION:记录在数据库中检测到的损坏块,可能与备份相关。
-
底层基表(X表)∗∗:‘V表)**: `V表)∗∗:‘VBACKUP_SET` 的数据来源于控制文件。其底层关联的 X$表 是不公开**的,Oracle 不提供官方支持或文档。这些表是控制文件内存映像的动态性能接口。
从功能上讲,它与控制文件中的以下内部记录结构相关:X$KCCBS:可能与备份集记录有关。X$KCCBP:可能与备份片记录有关。
重要警告:绝对不要直接查询或修改 X$ 表。这可能导致数据库崩溃或数据损坏,且不受 Oracle 支持。所有诊断都必须通过公开的 V$ 视图进行。
5. 相关底层原理
-
控制文件作为 RMAN 仓库:
默认情况下,RMAN 的元数据(备份集、备份片、文件记录等)主要存储在目标数据库的控制文件中。每个备份操作的成功完成都会在控制文件中创建一条新记录。 -
记录创建过程:
- 当 RMAN 开始执行
BACKUP命令时,它会先在控制文件中分配一个备份集记录槽位。 - 随着备份的进行,详细信息(如包含的文件、大小、完成时间)被填充到这条记录中。
- 备份成功完成后,记录被标记为
COMPLETED(在V$BACKUP_SET中体现为STATUS='AVAILABLE')。 - 如果 RMAN 进程异常终止,控制文件中可能会留下不完整的记录,这些记录可能会被后续的 RMAN 会话清理。
- 当 RMAN 开始执行
-
状态管理:
CROSSCHECK命令:该命令会检查控制文件中的记录(V$BACKUP_SET)是否在磁盘或磁带上存在对应的物理文件。如果找不到,就将STATUS更新为EXPIRED。DELETE EXPIRED命令:该命令会从控制文件中删除所有STATUS='EXPIRED'的记录。DELETE BACKUP命令:该命令会先删除物理文件,然后将控制文件中的记录标记为DELETED。
6. 相关知识点介绍
- 备份集 vs. 镜像拷贝:RMAN 可以创建备份集(多个文件打包到一个或多个备份片中,支持压缩和增量)或镜像拷贝(文件的逐位副本)。
V$BACKUP_SET只管理备份集。镜像拷贝由V$DATAFILE_COPY和V$ARCHIVED_LOG_COPY管理。 - 增量备份策略:理解
INCREMENTAL_LEVEL字段依赖于对增量备份(Level 0 和 Level 1)以及差异(DIFFERENTIAL)和累积(CUMULATIVE)策略的理解。 - 保留策略(Retention Policy):
KEEP字段直接与配置的保留策略(REDUNDANCY 或 RECOVERY WINDOW)以及KEEP FOREVER/KEEP UNTIL命令相关。 - 块更改跟踪(Block Change Tracking):
OPTIMIZED字段为YES通常意味着使用了块更改跟踪功能,从而极大地加快了增量备份的速度。
7. 常用查询 SQL
1. 列出所有可用的备份集(基本信息):
SELECT set_stamp, set_count, backup_type, incremental_level,
device_type, TO_CHAR(completion_time, 'YYYY-MM-DD HH24:MI:SS') AS completion_time,
ROUND(bytes/1024/1024/1024, 2) AS size_gb, status, tag
FROM v$backup_set
WHERE status = 'AVAILABLE'
ORDER BY completion_time DESC;
2. 查找最近的数据库全量备份:
SELECT set_stamp, set_count, device_type,
TO_CHAR(completion_time, 'YYYY-MM-DD HH24:MI:SS') AS completion_time,
ROUND(bytes/1024/1024/1024, 2) AS size_gb, tag
FROM v$backup_set
WHERE backup_type = 'D' -- Datafile full backup
AND incremental_level IS NULL -- Not incremental
AND status = 'AVAILABLE'
ORDER BY completion_time DESC;
3. 查看备份集的详细信息及其对应的备份片:
SELECT bs.set_stamp, bs.set_count, bp.piece#,
bp.handle, bp.bytes AS piece_bytes,
bs.bytes AS set_bytes, bs.tag
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 bs.status = 'AVAILABLE'
AND bp.status = 'AVAILABLE'
ORDER BY bs.completion_time DESC, bp.piece#;
4. 检查过期的备份集(需要执行 CROSSCHECK):
SELECT set_stamp, set_count, backup_type, device_type, completion_time
FROM v$backup_set
WHERE status = 'EXPIRED';
5. 按周统计备份数据量(用于容量报告):
SELECT
TRUNC(completion_time, 'IW') AS week_start, --按周分组
backup_type,
device_type,
COUNT(*) AS number_of_sets,
ROUND(SUM(bytes)/1024/1024/1024, 2) AS total_gb
FROM v$backup_set
WHERE status = 'AVAILABLE'
GROUP BY TRUNC(completion_time, 'IW'), backup_type, device_type
ORDER BY week_start DESC;
6. 查找包含特定数据文件(file_id=5)的备份集:
SELECT DISTINCT bs.set_stamp, bs.set_count, bs.backup_type, bs.completion_time, bs.tag
FROM v$backup_set bs
JOIN v$backup_datafile bd ON (bs.set_stamp = bd.set_stamp AND bs.set_count = bd.set_count)
WHERE bd.file# = 5
AND bs.status = 'AVAILABLE'
ORDER BY bs.completion_time DESC;
欢迎关注我的公众号《IT小Chen》
1719

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



