3. 备份策略设计

在 Oracle RMAN 中,备份策略的核心不是“备份得越多越安全”,而是在恢复时间目标(RTO)、恢复点目标(RPO)、存储成本与备份窗口之间找到平衡。RMAN 提供了四种基础备份类型:全量备份(Full Backup)、差异增量备份(Differential Incremental)、累积增量备份(Cumulative Incremental),以及作为基线的 0 级增量备份。理解它们的组合方式,是设计可落地策略的前提。

四种备份类型的本质区别

全量备份会备份数据文件中所有已使用的数据块,不依赖任何之前的备份。它可以是镜像副本(image copy)或备份集(backup set)。全量备份的恢复路径最短,但每次备份的数据量最大,对 I/O 和备份窗口压力最高。

0 级增量备份在逻辑上等同于全量备份,它备份所有已使用的数据块,但作为增量链的起点。后续的 1 级增量必须依赖某个 0 级备份作为父备份。0 级备份与全量备份的关键差异在于:0 级备份可以被 1 级增量引用,而普通全量备份不能作为增量链的父节点。

差异增量备份(Differential)是 1 级增量的一种,它备份自最近一次同级或更低级别备份以来发生变化的数据块。例如,周日做 0 级,周一做差异 1 级,则周一备份的是周日以来变化的块;周二再做差异 1 级,备份的是周一以来变化的块。差异增量每次只备份“最近一次增量”之后的变化,因此单个备份文件较小,但恢复时需要依次应用 0 级和所有中间增量。

累积增量备份(Cumulative)同样是 1 级增量,但它备份自最近一次 0 级备份以来所有发生变化的数据块。仍以周日 0 级为例,周一累积 1 级备份周日以来的变化,周二累积 1 级备份的仍是周日以来所有变化,而不是仅周一之后的变化。因此累积增量文件会逐日增大,但恢复时只需 0 级加最近一次累积 1 级,恢复路径更短。

差异增量 vs 累积增量:备份内容与恢复路径对比 时间 周日 0级 全量基线 周一 1级 变化块 A 周二 1级 变化块 B 周三 1级 变化块 C 周四 1级 变化块 D 差异增量(Differential):每次只备份“上一次增量之后”的变化 周一备份 A 周二备份 B 周三备份 C 周四备份 D 恢复周四状态:0级 + 周一A + 周二B + 周三C + 周四D(需应用 4 个增量) 特点:单次备份小,恢复链长,恢复时间长 累积增量(Cumulative):每次都备份“自 0 级以来”的全部变化 周一备份 A 周二备份 A+B 周三备份 A+B+C 周四备份 A+B+C+D 恢复周四状态:0级 + 周四累积备份(仅需应用 1 个增量) 特点:单次备份逐日增大,恢复链短,恢复时间短

选择策略的判断维度

选择哪种组合,取决于四个可量化的维度:备份窗口(每天可用于备份的时间)、数据变化率(每日变化块占比)、RTO(允许的恢复时长)、存储容量与保留周期。如果数据库每天变化率低于 5%,差异增量可以把每日备份压缩到很小;如果变化率超过 20%,差异增量的优势会迅速衰减,此时累积增量或全量备份反而更可控。

一个常见的误区是“全量备份最安全,所以每天都做全量”。在 2TB 数据库、每日变化 30GB 的场景下,每天全量需要约 2TB 备份空间和数小时窗口;而采用“周日 0 级 + 每日累积 1 级”,每日备份约 30~120GB,恢复时只需 0 级加最近一次累积,RTO 显著优于差异增量链。

组合策略示例:周日 0 级 + 每日累积 1 级

以下是一个可直接参考的 RMAN 配置示例,适用于变化率中等、RTO 要求较紧的 OLTP 库。假设数据库为 ORCL,归档日志已开启,恢复目录已注册。

-- 配置保留策略:恢复窗口 14 天
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;

-- 配置备份优化与压缩
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE COMPRESSION ALGORITHM 'MEDIUM';

-- 配置控制文件自动备份
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/cf_%F';

-- 周日 0 级备份脚本(每周日 01:00)
BACKUP INCREMENTAL LEVEL 0 DATABASE
  PLUS ARCHIVELOG
  FORMAT '/backup/full_%U'
  TAG 'WEEKLY_LEVEL0';

-- 周一至周六累积 1 级备份脚本(每日 01:00)
BACKUP INCREMENTAL LEVEL 1 CUMULATIVE DATABASE
  PLUS ARCHIVELOG
  FORMAT '/backup/cum_%U'
  TAG 'DAILY_CUMULATIVE';

执行后可通过以下查询确认增量链的父子关系与备份集大小,判断累积增量是否按预期增长:

SELECT b.backup_type, b.incremental_level,
       b.parent_backup_set_id, b.backup_set_id,
       ROUND(b.bytes/1024/1024, 2) AS mb,
       b.start_time, b.tag
FROM   v$backup_set b
WHERE  b.start_time > SYSDATE - 7
ORDER  BY b.start_time;

观察要点:INCREMENTAL_LEVEL=0 的记录应出现在周日;周一至周六应为 INCREMENTAL_LEVEL=1,且 PARENT_BACKUP_SET_ID 均指向同一个 0 级备份集。累积增量的 MB 值应逐日递增,若某天突然下降,说明变化块减少或备份被优化跳过,需要结合 V$BACKUP_DATAFILE 进一步确认。

差异增量与累积增量的混合使用

实际工程中,纯差异或纯累积并不总是最优。一种更灵活的组合是:周日 0 级 + 周一至周三差异 1 级 + 周四累积 1 级 + 周五至周六差异 1 级。这样既控制了周中每日备份大小,又在周四形成一个“恢复收敛点”,把最长恢复链从 6 个增量压缩到 3 个以内。RMAN 允许在同一个增量链中混用差异和累积,只要父备份集一致即可。

差异增量与累积增量都属于 1 级增量,二者可以混用,但必须共享同一个 0 级父备份。切换类型时不需要重建 0 级,RMAN 会自动识别最近一次 0 级作为父节点。

策略验证与调整

策略上线后,必须用 VALIDATE 和实际恢复演练验证。推荐每月执行一次“0 级 + 最近一次 1 级”的异机恢复测试,记录实际恢复耗时,与 RTO 目标对比。如果恢复耗时超出预期,优先考虑把差异增量改为累积增量,或增加 0 级备份频率。如果备份窗口不足,则反向调整:降低 0 级频率、改用差异增量、启用块变化跟踪(Block Change Tracking)以加速增量备份。

-- 启用块变化跟踪,显著加速增量备份
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING
  USING FILE '/u01/app/oracle/oradata/orcl/chg_track.ctf';

-- 验证备份可恢复性
RESTORE DATABASE VALIDATE;
VALIDATE BACKUPSET 1234;

块变化跟踪文件记录了自上次备份以来变化的数据块位图,使 RMAN 无需扫描全部数据文件即可定位变化块。在 2TB 以上数据库中,启用后增量备份耗时通常可下降 50% 以上。需要注意的是,块变化跟踪文件本身不参与恢复,丢失后只需重建并执行一次 0 级备份即可恢复增量链。

不要长期只依赖差异增量而不做 0 级刷新。差异增量链越长,恢复时需要应用的备份集越多,任何一个中间备份损坏都会导致恢复失败。建议 0 级备份间隔不超过 7 天,并在每次 0 级完成后立即执行一次 RESTORE DATABASE VALIDATE 确认链完整。

策略选择速查

场景特征 推荐组合 恢复路径
数据量小、RTO 极短 每日全量 + 归档 单次全量 + 归档
变化率低、备份窗口紧 周日 0 级 + 每日差异 1 级 0 级 + 多个差异增量
变化率中高、RTO 较紧 周日 0 级 + 每日累积 1 级 0 级 + 最近一次累积
变化率波动大、需平衡 0 级 + 差异/累积混合 0 级 + 收敛点后少量增量

最终策略应写入运维文档,明确 0 级执行时间、1 级类型与频率、保留窗口、归档删除策略、验证周期和责任人。策略不是一次设定就永久有效,随着数据增长和业务变化,应每季度复核一次备份窗口、恢复耗时与存储占用,必要时调整增量类型或 0 级频率。