如何安全地逐步删除 RMAN 中的备份
为什么要在 RMAN 中删除备份
Oracle 恢复管理器(RMAN)是 Oracle 原生的备份和恢复工具。人们使用RMAN 备份 Oracle 数据库来保护数据文件、控制文件、SPFILE、重做日志等。但有时,您会想要删除 RMAN 备份,原因如下:
- 释放备份存储空间:几周的全备份加上归档日志可能会填满您的快速恢复区。当这种情况发生时,数据库可能会冻结。只需删除不必要的备份即可释放存储空间。
- 目录不同步。如果您在操作系统级别删除了备份文件(绕过 RMAN),RMAN 仍然会将它们列为 AVAILABLE。由于文件不存在,恢复将会失败。您需要删除过期的目录记录来清理混乱。
- 保留策略发生变化。业务需求从“保留 30 天”变为“保留 7 天”。那些较旧的备份变成了过时备份。它们一直占用空间,直到您运行 DELETE OBSOLETE。
什么是 RMAN 备份删除?
当您运行 DELETE BACKUP 时,RMAN 会做两件事:
1. 从磁盘上物理删除备份片(或通知介质管理器将磁带空间标记为可重用)
2. 从控制文件和/或恢复目录中删除相应的记录。
如果您在操作系统级别删除了备份文件(rm 或 del),RMAN 的控制文件仍然认为这些备份存在。CROSSCHECK 后跟 DELETE EXPIRED 可以清理记录 — 但无法恢复物理文件。
对于磁带备份,介质管理器(Oracle Secure Backup 或第三方 SBT 库)决定物理磁带文件是否被真正删除。通常,它只是被标记为可重用。
如何逐步删除 RMAN 中的备份
下表列出了核心的 RMAN 删除语法以供快速参考。同时,我们将提供详细的分步指南,说明如何在不同的场景中使用它们。
命令 | 功能 | 使用时机 |
DELETE BACKUP | 从磁盘/磁带删除备份集或备份片,并删除目录记录。物理删除文件。 | 您确切知道要删除哪些备份键。与特定键一起使用 — 切勿在没有过滤条件的情况下运行。 |
DELETE BACKUP OF | 删除特定数据库对象(数据文件、表空间、归档日志、控制文件)的备份。 | 您想要删除单个表空间或所有归档日志备份,但保留其他备份不变。 |
DELETE OBSOLETE | 根据您配置的保留策略(RECOVERY WINDOW 或 REDUNDANCY)删除不再需要的备份。 | 定期清理。设置保留策略后每天运行。始终先用 REPORT OBSOLETE 预览。 |
DELETE EXPIRED | 删除 CROSSCHECK 标记为 EXPIRED(物理文件丢失)的备份的目录记录。不删除文件 — 仅删除元数据。 | 备份物理文件是在 RMAN 外部删除的(操作系统 rm 或 del),您需要清理目录以便恢复不会失败。 |
删除超过 7 天或特定日期的备份
RMAN 的 DELETE BACKUP 没有直接的 UNTIL TIME 子句。但您可以使用 LIST BACKUP 来标识键,然后逐个删除。
以下是一个示例:
sql
# Find backups older than 7 days RMAN> LIST BACKUP OF DATABASE COMPLETED BEFORE 'SYSDATE-7'; -- Note the BS Key values, then delete eachRMAN> DELETE BACKUP 2048;RMAN> DELETE BACKUP 2049;对于脚本编写,可以使用 REPORT OBSOLETE 配合临时保留策略更改 — 但这有删除过多的风险。大多数 DBA 会编写一个基于 V$BACKUP_PIECE 的小型 PL/SQL 循环来实现精确的基于日期的删除。
仅删除归档日志备份
- 如果您想释放归档日志备份片占用的空间,但保留磁盘上的原始归档日志文件,请使用:
sql
RMAN> DELETE BACKUP OF ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';这仅删除备份片(RMAN 制作的副本)。原始归档日志文件(例如 /u01/arch/arch_1_123.arc)保持不变。当您的备份存储已满,但您仍然需要原始日志进行时间点恢复或因为它们尚未被复制到另一个目标时,请使用此命令。
- 如果您想删除原始的归档数据文件副本,请使用 DELETE ARCHIVELOG,而不是 DELETE BACKUP OF ARCHIVELOG。
bash
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3' BACKED UP 1 TIMES TO DEVICE TYPE DISK;从归档日志目录中物理删除 .arc 或 .log 文件。备份片保持不变。
注意:
- 为了安全起见,只有在确认原始归档日志已备份后才删除它们(使用 BACKED UP … TIMES 子句)。
- 如果您实际上需要释放归档日志目标位置的磁盘空间,运行 DELETE BACKUP OF ARCHIVELOG 命令不会释放任何空间。相反,如果您只想删除备份文件,运行 DELETE ARCHIVELOG 命令会删除错误的文件。
手动删除特定的备份片
要删除不需要的 RMAN 备份片,请使用以下语法:
bash
RMAN> DELETE BACKUPPIECE 'full_path_to_backup_piece';BACKUPPIECE 后面跟的是备份片的完整文件系统路径或磁带句柄。您可以通过运行 LIST BACKUP OF DATABASE 找到此路径。
RMAN 会从磁盘中精确删除该备份片,并删除其目录记录。同一备份集中的其他备份片不会被删除。
警告:删除备份片会使整个备份集不完整。如果您删除了一个多片备份集中的一片,您将无法再从该备份集恢复。仅在您确定该备份片已损坏或过时时才使用此命令。
使用保留策略自动删除 RMAN 备份
如果您想自动删除 RMAN 备份,请设置保留策略。
示例:自动删除 RMAN 中超过 7 天的备份。您可以根据需要更改天数。
sql
RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;如果您想要一个每日脚本:
bash
#!/bin/bash rman target / catalog rman/rman@catdb <RMAN 中删除备份时的常见问题排查
有时,您在删除备份时可能会遇到一些错误。以下是解决方法。
1. “RMAN-06091: no channel allocated for maintenance”
这通常发生在删除磁带备份时。
解决方法:
bash
RMAN> ALLOCATE CHANNEL FOR MAINTENANCE DEVICE TYPE sbt; RMAN> DELETE OBSOLETE;2. 恢复目录显示有备份,但物理文件丢失
CROSSCHECK + DELETE EXPIRED 会删除目录条目。如果在 crosscheck 后备份仍显示为 AVAILABLE,则文件可能存在但无法读取(权限问题、损坏)。在假设文件丢失之前,请使用 VALIDATE BACKUP。
使用 i2Backup 进行集中备份管理
使用 cron 作业管理备份对于单个或几个数据库来说是可行的。但是当您管理跨物理、虚拟和云环境的数十个 Oracle 实例时,为所有内容编写脚本会变得过于复杂。
i2Backup 由英方软件开发,采取了不同的方法。它是一个企业级备份平台,通过统一界面处理 Oracle 备份生命周期管理,包括自动清理,因此您无需为每个数据库编写和维护 RMAN 脚本。
管理员只需在中央 Web 控制台中定义备份计划和策略。然后软件会处理其余工作。它将按照预设的备份计划执行备份任务。当备份文件过时时,i2Backup 可以配置为根据您的保留规则自动删除它们。
Oracle 备份管理的关键能力:
- 集中保留策略:设置一次保留窗口或冗余规则,应用于所有 Oracle 实例,让系统处理清理工作,无需每个数据库都设置 cron 作业。
- 细粒度恢复选项:在 CDB、PDB、归档日志或控制文件级别进行恢复,无需提取整个备份集。还支持基于时间戳的时间点恢复。
- 多种存储目标:备份到本地磁盘、磁带库、NAS 或对象存储,内置重复数据删除功能以减少占用空间。
- 用于勒索软件防护的不可变备份:i2Backup 使用不可变存储和防篡改驱动程序,防止未经授权的删除。
结论
以上就是关于如何删除 RMAN 中过期备份的全部内容。这并不复杂:
- 使用 DELETE OBSOLETE 根据您的保留策略进行定期清理。
- 当物理文件在 RMAN 外部丢失时,使用 CROSSCHECK + DELETE EXPIRED。
- 只有在您确切知道备份键或备份片时才使用 DELETE BACKUP。
- 永远不要在操作系统级别删除备份文件。这会破坏目录,导致空间无法回收和恢复不可靠。
您还可以设置保留策略,在每日脚本中自动化该过程。如果您管理超过几个 Oracle 数据库,请考虑使用像 英方软件 的 i2Backup 这样的集中式平台来管理备份。