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 级,恢复路径更短。
选择策略的判断维度
选择哪种组合,取决于四个可量化的维度:备份窗口(每天可用于备份的时间)、数据变化率(每日变化块占比)、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 允许在同一个增量链中混用差异和累积,只要父备份集一致即可。
策略验证与调整
策略上线后,必须用 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 级备份即可恢复增量链。
RESTORE DATABASE VALIDATE 确认链完整。策略选择速查
| 场景特征 | 推荐组合 | 恢复路径 |
|---|---|---|
| 数据量小、RTO 极短 | 每日全量 + 归档 | 单次全量 + 归档 |
| 变化率低、备份窗口紧 | 周日 0 级 + 每日差异 1 级 | 0 级 + 多个差异增量 |
| 变化率中高、RTO 较紧 | 周日 0 级 + 每日累积 1 级 | 0 级 + 最近一次累积 |
| 变化率波动大、需平衡 | 0 级 + 差异/累积混合 | 0 级 + 收敛点后少量增量 |
最终策略应写入运维文档,明确 0 级执行时间、1 级类型与频率、保留窗口、归档删除策略、验证周期和责任人。策略不是一次设定就永久有效,随着数据增长和业务变化,应每季度复核一次备份窗口、恢复耗时与存储占用,必要时调整增量类型或 0 级频率。