文章目录
-
- 每日一句正能量
- 摘要
- [1. 背景与问题](#1. 背景与问题)
- [2. 环境与数据](#2. 环境与数据)
-
- [2.1 实验环境](#2.1 实验环境)
- [2.2 数据分层](#2.2 数据分层)
- [2.3 周期表设计](#2.3 周期表设计)
- [3. 复现过程](#3. 复现过程)
-
- [3.1 只做每日全量的容量与窗口问题](#3.1 只做每日全量的容量与窗口问题)
- [3.2 归档连续性中断](#3.2 归档连续性中断)
- [3.3 增量链缺失](#3.3 增量链缺失)
- [3.4 故障注入矩阵](#3.4 故障注入矩阵)
- [4. 方案实施](#4. 方案实施)
-
- [4.1 组合策略](#4.1 组合策略)
- [4.2 目录与命名规范](#4.2 目录与命名规范)
- [4.3 备份清单表示例](#4.3 备份清单表示例)
- [4.4 容量测算](#4.4 容量测算)
- [4.5 归档监控](#4.5 归档监控)
- [4.6 恢复演练流程](#4.6 恢复演练流程)
- [4.7 RTO/RPO 计算](#4.7 RTO/RPO 计算)
- [5. 结果对比](#5. 结果对比)
-
- [5.1 备份窗口](#5.1 备份窗口)
- [5.2 恢复演练结果](#5.2 恢复演练结果)
- [5.3 故障注入结果](#5.3 故障注入结果)
- [6. 风险与复盘](#6. 风险与复盘)
-
- [6.1 风险一:增量链变长](#6.1 风险一:增量链变长)
- [6.2 风险二:备份与生产同故障域](#6.2 风险二:备份与生产同故障域)
- [6.3 风险三:只验证数据库启动](#6.3 风险三:只验证数据库启动)
- [6.4 风险四:容量模型长期不更新](#6.4 风险四:容量模型长期不更新)
- [6.5 风险五:演练影响生产](#6.5 风险五:演练影响生产)
- [6.6 复盘结论](#6.6 复盘结论)
- 上线检查清单

每日一句正能量
与其忙着用言语去指正别人,不如静下心来向下兼容,向内提升。
"忙着指正"往往源于焦虑或证明欲。能理解而不居高临下;把能量从改造他人收回到深耕自己。
摘要
很多团队把"备份成功"理解为备份任务返回零,但真正的恢复能力取决于四件事:备份链是否完整、归档日志是否连续、恢复流程是否被验证、恢复结果是否满足业务的 RTO 与 RPO。本文设计一套适用于核心数据库的分层备份策略:每周一次全量备份、每日一次增量备份、持续归档事务日志,并通过恢复演练、故障注入和容量测算验证其可用性。
文章给出周期表、容量公式、备份目录规范、执行脚本、恢复步骤、故障注入场景、RTO/RPO 统计方式以及上线检查清单。重点不在某条命令,而在于建立"策略---执行---校验---演练---复盘"的闭环。
1. 背景与问题
某核心交易库承担订单、支付状态和清结算流水写入,日均新增数据约 180GB,业务全天运行。早期运维方案只有"每天凌晨做一次全量备份",表面简单,实际存在五个问题。
第一,全量窗口越来越长。数据库达到数 TB 后,备份持续时间从两小时增长到六小时以上,和批处理、统计分析任务争抢 I/O。第二,恢复链路没有演练。团队知道备份文件存在,却无法回答"恢复到新主机要多久""最后一笔可恢复交易是什么时间"。第三,备份介质与生产主机同域,主机故障、存储故障或误删除可能同时影响生产数据和备份。第四,日志归档只关注目录是否有文件,没有检查连续性和远端复制延迟。第五,保留周期由人工经验决定,容量不足时临时删除旧文件,容易破坏恢复链。
因此,本次改造不把目标定义为"每天备份",而是定义为:
- 关键交易库目标 RPO 不超过 5 分钟;
- 同机房恢复目标 RTO 不超过 90 分钟;
- 异地恢复目标 RTO 不超过 4 小时;
- 任意保留点必须能找到完整的"基线备份 + 增量链 + 归档日志";
- 每月至少完成一次技术恢复演练,每季度完成一次业务验收演练。
备份策略必须服务于恢复目标。没有 RTO/RPO 的备份周期表,只是任务日历;没有恢复演练的备份文件,只是未经验证的存储占用。

2. 环境与数据
2.1 实验环境
| 项目 | 脱敏配置 |
|---|---|
| 数据库 | 金仓数据库核心实例,主备部署 |
| 数据规模 | 基础数据 6.2TB |
| 日增量 | 约 180GB/日 |
| 峰值日志产生速率 | 95GB/小时 |
| 数据盘有效吞吐 | 450MB/s |
| 本地备份盘 | 20TB |
| 远端对象存储 | 80TB 配额 |
| 网络带宽 | 同城 2Gbps,异地 1Gbps |
| 保留目标 | 本地 14 天,远端 35 天 |
| 恢复验证机 | 独立计算节点与独立存储 |
本文不绑定单一备份工具名称。实际环境可使用金仓数据库自带备份恢复能力、企业备份工具或经过验证的文件级方案,但必须满足:一致性备份、增量链可追踪、归档日志可恢复、元数据可校验、恢复过程可审计。
2.2 数据分层
容量测算前先区分数据组成:
- 数据库有效数据:表、索引、系统目录和必要配置。
- 备份数据:全量备份与增量备份。
- 归档日志:用于把数据库推进到备份结束之后的目标时间点。
- 临时空间:备份压缩、校验、恢复解压和重建索引所需。
- 安全余量:应对业务突增、重试、备份链重建和保留期重叠。
如果只按"数据库 6.2TB,所以准备 6.2TB 备份盘",几乎必然不足。
2.3 周期表设计
| 任务 | 周期 | 启动时间 | 保留 | 目标 |
|---|---|---|---|---|
| 全量备份 | 每周日 | 00:30 | 本地 2 份、远端 5 份 | 形成恢复基线 |
| 增量备份 | 周一至周六 | 01:00 | 本地 14 天、远端 35 天 | 缩短备份窗口 |
| 归档日志上传 | 持续 | 每 1 分钟检查 | 本地 48 小时、远端 35 天 | 支撑时间点恢复 |
| 备份清单校验 | 每日 | 07:30 | 90 天记录 | 检查链完整性 |
| 抽样恢复 | 每月 | 第一个周六 | 12 个月报告 | 验证技术可恢复 |
| 业务恢复演练 | 每季度 | 变更窗口 | 长期留档 | 验证 RTO/RPO |
周期表不是固定答案。写入量大、日志增长快或监管保留期更长时,应提高远端容量并缩短归档上传间隔。
3. 复现过程
3.1 只做每日全量的容量与窗口问题
假设有效数据 6.2TB,压缩后平均比例为 0.62,则单次全量约:
text
6.2TB × 0.62 = 3.844TB
若每日全量并保留 14 天,仅备份数据就需要约:
text
3.844TB × 14 = 53.816TB
这还没有计入归档日志、重试副本和安全余量。20TB 本地备份盘无法满足。
按 450MB/s 的理想持续吞吐计算,读取 6.2TB 至少需要约 4 小时;考虑压缩、校验、网络复制和生产 I/O 竞争,实际可能超过 6 小时。窗口过长会使备份与凌晨批处理重叠。
3.2 归档连续性中断
在演练环境中模拟归档上传进程异常 12 分钟。数据库仍正常写入,本地归档目录持续增长,但远端最后归档时间停滞。若此时生产主机与本地备份盘同时损坏,远端可恢复点将落后 12 分钟,实际 RPO 远大于 5 分钟。
检查不能只看"归档目录存在文件",还必须计算:
text
归档上传延迟 = 当前时间 - 远端最后成功归档时间
并检查归档序列是否有缺口。
3.3 增量链缺失
模拟删除周三增量备份的一个关键分片。周四、周五任务仍显示"完成",但恢复时无法从周日全量顺利应用到周五。这个场景说明:单个任务成功不等于恢复链完整。
每次备份完成后至少记录:
- 备份唯一编号;
- 备份类型;
- 父备份编号;
- 开始和结束时间;
- 数据库检查点或日志位置;
- 文件数量、总字节数与摘要;
- 归档起止范围;
- 远端复制状态。
3.4 故障注入矩阵
| 场景 | 注入方式 | 预期检测 | 恢复目标 |
|---|---|---|---|
| 备份进程中止 | 终止备份进程 | 任务失败且不生成"可用"标记 | 自动重试,不污染备份链 |
| 备份文件损坏 | 修改单个分片 | 摘要校验失败 | 禁止进入恢复候选 |
| 归档上传中断 | 停止上传任务 | 延迟告警、目录积压告警 | 恢复上传后补齐 |
| 本地备份盘满 | 限制文件系统空间 | 容量阈值告警 | 优先保护最近完整链 |
| 主库主机丢失 | 关闭主机或隔离网络 | 启动灾难恢复流程 | 满足 RTO/RPO |
| 误删除业务表 | 删除演练表 | 时间点恢复到隔离库 | 导出并回灌目标数据 |

4. 方案实施
4.1 组合策略
最终采用"周全量 + 日增量 + 持续归档"的组合。
全量备份提供稳定基线,增量备份降低日常窗口与存储占用,归档日志用于把恢复点推进到最近事务。恢复路径为:
text
最近全量 → 按顺序应用增量 → 应用归档日志 → 到达目标时间点 → 一致性校验
对于极核心系统,可并行保留两条独立备份链:一条用于快速恢复,一条存放于隔离或不可变介质,用于抵御勒索、误删除和备份账号泄露。
4.2 目录与命名规范
text
/backup/
├── full/
│ └── 2026-07-12_FULL_BK202607120030/
├── incr/
│ └── 2026-07-13_INCR_BK202607130100/
├── archive/
│ └── 2026-07-13/
├── manifest/
│ ├── BK202607120030.json
│ └── BK202607130100.json
└── restore_reports/
文件名应能表达日期、备份类型和唯一编号,但不能只依赖文件名判断可用性。真正的状态由清单文件和校验结果决定。
4.3 备份清单表示例
sql
CREATE TABLE ops_backup_catalog (
backup_id varchar(64) PRIMARY KEY,
backup_type varchar(16) NOT NULL,
parent_backup_id varchar(64),
start_time timestamp NOT NULL,
end_time timestamp,
status varchar(16) NOT NULL,
source_lsn varchar(64),
end_lsn varchar(64),
file_count integer,
size_bytes bigint,
checksum_status varchar(16),
remote_copy_status varchar(16),
remark varchar(500)
);
备份脚本只有在以下条件全部满足时,才把状态更新为 AVAILABLE:
- 备份命令成功;
- 文件数量与总大小符合预期;
- 清单文件写入成功;
- 摘要校验通过;
- 所需归档范围已确认;
- 远端复制成功或进入明确的待传状态。
4.4 容量测算
本例采用以下参数:
- 全量压缩后 3.84TB;
- 日增量平均 220GB,峰值按 320GB;
- 日归档平均 900GB,峰值按 1.3TB;
- 本地保留 2 个全量、14 个增量、2 天归档;
- 预留 25% 安全余量。
本地容量估算:
text
全量:3.84TB × 2 = 7.68TB
增量:0.32TB × 14 = 4.48TB
归档:1.30TB × 2 = 2.60TB
小计:14.76TB
安全余量:14.76TB × 25% = 3.69TB
建议容量:不低于 18.45TB
因此 20TB 本地盘勉强可用,但必须设置 70%、80%、90% 三级告警,并禁止"无规则删除"。若全量重试导致短期保留 3 份,应临时扩容或提前清理已确认过期且不属于任何有效恢复链的文件。

4.5 归档监控
归档监控至少包含四项:
sql
-- 示例:查询最近归档记录,字段需按实际版本调整
SELECT archive_name,
archive_time,
upload_status,
remote_finish_time
FROM ops_archive_log
ORDER BY archive_time DESC
FETCH FIRST 20 ROWS ONLY;
监控指标:
- 远端最后成功归档距当前时间;
- 本地待上传文件数量和字节数;
- 归档序列是否连续;
- 归档目录剩余空间;
- 上传失败次数和最长失败持续时间。
建议告警门槛:
| 指标 | 警告 | 严重 |
|---|---|---|
| 远端归档延迟 | > 3 分钟 | > 5 分钟 |
| 本地积压空间 | > 30 分钟产生量 | > 90 分钟产生量 |
| 归档序列缺口 | 任意缺口 | 立即严重 |
| 备份盘使用率 | > 70% | > 85% |
| 最近可用全量年龄 | > 8 天 | > 10 天 |
4.6 恢复演练流程
恢复演练必须使用独立主机、独立目录和独立端口,避免误连生产应用。
步骤一:选定恢复目标。
例如目标时间为 2026-07-16 10:28:00,选择该时间之前最近的全量和所有必要增量。
步骤二:校验备份链。
检查父子关系、文件摘要、归档起止范围和远端副本。
步骤三:恢复基线。
恢复全量备份,记录开始、解压完成、实例可启动等时间点。
步骤四:应用增量。
严格按顺序应用,任意一级失败立即停止,不允许跳过。
步骤五:应用归档并停止到目标点。
目标时间点恢复不能只看系统时间,还要结合日志位置和业务流水确认。
步骤六:执行技术校验。
sql
-- 核心表行数与时间范围
SELECT COUNT(*) AS row_count,
MIN(create_time) AS min_time,
MAX(create_time) AS max_time
FROM core_order;
-- 最近十分钟订单分布
SELECT date_trunc('minute', create_time) AS minute_bucket,
COUNT(*) AS cnt,
SUM(order_amount) AS amount
FROM core_order
WHERE create_time >= timestamp '2026-07-16 10:18:00'
AND create_time < timestamp '2026-07-16 10:29:00'
GROUP BY date_trunc('minute', create_time)
ORDER BY minute_bucket;
-- 关键关系完整性
SELECT COUNT(*) AS orphan_count
FROM payment_record p
LEFT JOIN core_order o ON o.order_id = p.order_id
WHERE o.order_id IS NULL;
步骤七:业务验收。
使用只读账号运行核心查询、日终汇总和抽样对账。只有技术和业务校验都通过,演练才算成功。
4.7 RTO/RPO 计算
RTO 从"宣布启动恢复"开始计时,到"业务验收通过且具备接入条件"为止,而不是到数据库进程启动为止。
text
RTO = 决策与资源准备
+ 备份下载
+ 全量恢复
+ 增量应用
+ 归档重放
+ 数据校验
+ 业务验收
RPO 以恢复库中最后一笔确认有效的业务数据时间,与故障发生时间的差值计算:
text
RPO = 故障发生时间 - 最后可恢复业务时间
不能用"最后归档文件时间"直接代替 RPO,因为归档文件可能尚未完成、未上传或未通过校验。
5. 结果对比
5.1 备份窗口
| 指标 | 改造前:每日全量 | 改造后:周全量+日增量 |
|---|---|---|
| 日常备份读取量 | 约 6.2TB | 约 220GB |
| 日常备份耗时 | 6小时12分 | 38分钟 |
| 日常峰值 I/O 影响 | 高 | 中低 |
| 恢复链复杂度 | 低 | 中 |
| 时间点恢复能力 | 弱 | 强 |
组合策略牺牲了部分恢复链管理复杂度,但显著降低日常备份窗口,并获得更细粒度的恢复点。复杂度必须通过自动化清单和月度演练控制,而不是靠人工记忆。
5.2 恢复演练结果
一次主机丢失演练记录如下:
| 阶段 | 耗时 |
|---|---|
| 启动流程与资源确认 | 8分钟 |
| 下载最近全量与增量 | 17分钟 |
| 恢复全量 | 31分钟 |
| 应用 3 级增量 | 11分钟 |
| 应用归档到目标点 | 6分钟 |
| 技术校验 | 7分钟 |
| 业务抽样验收 | 6分钟 |
| 总 RTO | 86分钟 |
故障时间为 10:32:40,恢复库最后确认业务时间为 10:29:12,RPO 为 3 分 28 秒,满足 5 分钟目标。

5.3 故障注入结果
- 终止增量备份进程后,任务未写入可用标记,重试生成新备份编号,旧目录被隔离。
- 修改备份分片后,摘要校验失败,恢复候选列表自动排除该备份。
- 停止归档上传 12 分钟后,3 分钟触发警告、5 分钟触发严重告警;恢复进程后 9 分钟补齐。
- 填满备份盘到 88% 后,系统禁止启动新全量,并保留最近两条完整恢复链。
- 删除演练表后,通过时间点恢复到隔离库,导出目标表并完成回灌,未对其他表执行整库回退。
6. 风险与复盘
6.1 风险一:增量链变长
增量层级越多,恢复步骤越多,任何一级损坏都会影响后续恢复。因此建议每周重建全量基线,必要时增加"合成全量"或缩短链长度。关键库不宜无限叠加增量。
6.2 风险二:备份与生产同故障域
备份盘和生产数据盘在同一存储阵列、同一账号或同一机房,不能称为灾备。至少应具备远端副本;高安全要求场景应增加不可变存储、离线副本或独立凭据。
6.3 风险三:只验证数据库启动
数据库能启动不代表恢复成功。还要检查:
- 核心表行数、金额和时间范围;
- 主外键或业务关联完整性;
- 序列、自增键和任务状态;
- 用户、权限、扩展、参数和定时任务;
- 应用连接与核心接口;
- 业务方认可的对账结果。
6.4 风险四:容量模型长期不更新
业务增量、压缩率、日志速率和保留政策都会变化。容量模型应每月更新一次,以最近 30 天 P95 作为基线,而不是沿用项目上线时的估算。
6.5 风险五:演练影响生产
恢复演练应在隔离网络和独立资源池执行。演练账号禁止写入生产,恢复库必须使用醒目标识、不同端口和访问白名单。演练导出的数据也应遵循脱敏和最小权限要求。
6.6 复盘结论
这次改造最重要的收获不是"把每日全量改成增量",而是建立可度量的恢复能力:
- 用业务 RTO/RPO 反推备份周期;
- 用容量模型约束保留策略;
- 用清单和摘要证明备份链完整;
- 用归档延迟证明当前 RPO;
- 用故障注入验证异常处理;
- 用恢复演练证明备份真正可用;
- 用业务校验决定是否允许接入。
备份系统的最终交付物不是一堆文件,而是一条经过验证的恢复路径。
上线检查清单
策略与容量
- 已确认核心系统 RTO 与 RPO,并由业务负责人签字。
- 已完成全量、增量、归档的 30 天容量测算。
- 已按峰值增长率预留至少 20%~30% 安全余量。
- 已定义本地、同城、异地的保留周期。
- 已定义完整恢复链的删除规则,禁止按文件年龄直接删除。
备份执行
- 全量和增量任务使用唯一备份编号。
- 备份完成后生成清单、文件数量、总大小和摘要。
- 增量备份记录父备份编号。
- 失败任务不会被标记为可用。
- 备份账号和生产高权限账号分离。
归档
- 已监控远端最后成功归档时间。
- 已监控归档序列连续性。
- 已监控本地积压数量、字节数和剩余空间。
- 归档延迟超过 RPO 门槛时能触发严重告警。
- 已测试上传中断后的自动补传。
恢复与演练
- 已准备隔离恢复环境。
- 已形成恢复操作手册和回退门禁。
- 已至少完成一次全量+增量+归档恢复。
- 已完成备份文件损坏、归档中断和主机丢失注入。
- RTO 从启动恢复到业务验收完成全程计时。
- RPO 以最后确认业务时间计算。
- 演练报告包含问题、责任人和关闭日期。
转载自:https://blog.csdn.net/u014727709/article/details/163328359
欢迎 👍点赞✍评论⭐收藏,欢迎指正