PITR 时间点恢复

共 17 题
📑 题目列表 17 题
#
★★★

1. PITR 恢复后如何验证数据一致性(行数校验、业务逻辑校验)

PITR 恢复完成后如何验证数据一致性?行数校验与业务逻辑校验分别怎么做?

  • PITR 恢复后的验证手段
  • 行数校验与业务逻辑校验
  • 验证的完整闭环

PITR 恢复后的一致性验证是恢复成功的最后一道关卡,需从多个层面校验。行数校验:对关键表比对恢复前记录的基准行数与恢复后行数,确认无多行、少行;更进一步可按主键/业务键做逐行或抽样比对,或用 checksum 对比恢复前后表的哈希值。业务逻辑校验:通过执行关键业务查询与业务流程(如核心交易、报表查询、关键接口调用)验证恢复出的数据在业务语义上可用,例如余额、订单状态、库存数量等关键字段是否与业务一致,避免"行数对但业务错"。验证流程上,恢复前先记录基准(源端被误操作前的数据快照/计数),恢复后先跑行数与 checksum,再跑业务冒烟,最后人工抽查关键场景;发现不一致需定位差异属于"恢复遗漏"还是"源端本身就不同",并决定是否需重新恢复。验证结果应记录并纳入恢复 SOP,作为恢复完成的收尾确认。

行数校验只能证明"数量对",业务逻辑校验才能证明"业务可用"。两者必须结合——行数/checksum 快速兜底,业务校验深入确认语义正确。恢复的终极目标不是"数据和源一样",而是"业务能正常跑",所以验证必须闭环到业务层。

#
★★★

2. PITR 的 RPO 粒度由什么决定?如何平衡日志保留成本与恢复粒度

PITR 的 RPO 粒度由什么决定?如何在日志保留成本与恢复粒度之间取得平衡?

  • PITR RPO 粒度的决定因素
  • 日志保留与恢复粒度的权衡
  • 平衡策略

PITR 的 RPO 粒度(即能将数据恢复到多接近"故障时刻")由日志(binlog/WAL)的保留范围与归档频率决定。逻辑上,PITR 能恢复到任意一个"有日志覆盖"的时间点,因此 RPO 粒度取决于:日志是否连续归档、归档日志保留的时间跨度、以及最近的归档点。理想情况下日志覆盖到故障前瞬间,RPO 可接近 0;若日志定期归档或保留有限,则 RPO 等于"最近归档点到故障时刻"的间隔。平衡日志保留成本与恢复粒度:日志保留越长、幅度越细,恢复粒度越优(能恢复到更早更精确的时间点),但存储与带宽成本越高、归档管理越复杂;保留越短,成本低但只能恢复到较近且较粗的时间点。平衡策略:按业务重要性设置差异化保留——核心库保留更长日志(如 7-30 天)并高频归档,普通库保留较短(如 1-3 天);结合全量备份基线,日志只需覆盖"上一全量之后"即可,避免无限保留;同时用压缩、分层存储(日志放热/冷存储)降低长期保留成本。目标是在可控成本内,让 RPO 粒度满足业务允许的恢复精度。

"RPO 粒度"本质是"日志覆盖到多精确的时间点"。粒度由日志的归档频率与保留时长共同决定,粒度越细成本越高。平衡的关键是"日志覆盖到上一全量备份即可"的分层设计,并让保留策略与业务 RPO 对齐,而非无脑长留。

#
★★★

3. 基于 binlog/WAL 的 PITR 恢复流程是怎样的?全量备份与日志重放如何衔接

基于 binlog/WAL 的 PITR 恢复流程是怎样的?全量备份与日志重放如何衔接?

  • binlog/WAL 的恢复机制
  • 全量备份与日志重放的衔接
  • PITR 实际操作步骤

基于 binlog/WAL 的 PITR 恢复流程分两步:先恢复全量备份作为基线,再重放日志到目标时间点。第一步,用全量物理备份(如 MySQL 的 xtrabackup 恢复、PostgreSQL 的 base backup 恢复)把数据恢复到备份时刻的状态,作为恢复起点;第二步,从全量备份对应的日志位置开始,重放 binlog/WAL 归档日志,应用到目标时间点(或目标 LSN/事务),从而把数据推进到"误操作前"的精确状态。衔接的关键是"日志起点":全量备份必须记录其对应的日志位置(xtrabackup 的 binlog position、pg_basebackup 的 WAL 起始 LSN),恢复时从该位置后的日志开始重放,避免从头重放或漏日志。MySQL 中用 xtrabackup --prepare 恢复全量,再 mysqlbinlog 重放 binlog 到指定时间点;PostgreSQL 中配置 restore_command 从 WAL 归档恢复,并设置 recovery_target_time 等目标。整个过程需保证日志连续性(无缺失、无损坏),重放后验证数据一致。

PITR 的本质是"全量基线 + 日志重放"的组合。全量提供起点,日志提供到目标点的增量。衔接的准确与否、日志的完整与否直接决定恢复精度,日志起点定位是 PITR 成败的细节关键。

# MySQL:xtrabackup 恢复全量 + binlog 重放到目标时间点
xtrabackup --prepare --target-dir=/backup/full
# 从备份记录的 binlog position 起重放
mysqlbinlog --start-position=154 --stop-datetime="2024-01-01 00:00:00" \
  /var/log/mysql/binlog.000015 | mysql -u root -p

# PostgreSQL:配置 restore_command 从 WAL 归档恢复
# recovery.conf (PG<12) / postgresql.conf 的 recovery 参数
restore_command = 'cp /wal_archive/%f %p'
recovery_target_time = '2024-01-01 00:00:00'
#
★★★

4. 如何设计并演练一次『恢复到误删表前一秒』的 PITR 操作

如何设计并演练一次『恢复到误删表前一秒』的 PITR 操作?

  • 误删表 PITR 的设计
  • 操作步骤与时间点定位
  • 演练与验证

设计『恢复到误删表前一秒』的 PITR 操作,核心是"精确定位误删时间点 + 完整执行恢复 + 验证"。设计步骤:事先确认该库已开启并归档 binlog/WAL,定期全量备份做基线;记录误删的精确时间(可从应用日志、SQL 审计、binlog 事件时间戳定位到"删表前一秒")。演练流程:先从最近的全量备份恢复该表所在库(或最小化到单表/单库),定位备份对应的日志起点;再重放日志到目标时间点前(即误删前的一秒,注意不要重放到 DROP 语句所在事务),恢复出表格数据;最后把恢复出的数据导入生产(或临时库确认后导入),并验证行数与业务一致性。演练要点:用临时实例/临时库演练避免污染生产;精确控制恢复目标(跳过 DROP 事务);恢复后与原表比对并做业务校验;演练中记录时间点定位、重放起点、恢复耗时,复盘优化。可预先准备"误删恢复 Runbook"脚本,把定位、恢复、验证固化,缩短真实故障时的恢复时间。

"恢复到前一秒"的关键是"精确到 DROP 之前的事务边界"。设计重点是把时间点定位、日志起点、重放边界、验证这几个环节固化,并用演练反复验证。演练的意义在于把"理论可行"变成"实操可行",同时暴露时间点定位不准、日志起点错等细节问题。

#
★★

5. MySQL(xtrabackup+binlog)与 PostgreSQL(base backup+WAL archive)的 PITR 实现有何差异

MySQL(xtrabackup+binlog)与 PostgreSQL(base backup+WAL archive)的 PITR 实现有何差异?

  • 两种数据库的 PITR 机制
  • 全量备份与日志的差异
  • 恢复目标与命令差异

MySQL 与 PostgreSQL 的 PITR 都遵循"全量 + 日志重放"模式,但实现有差异。MySQL 用 xtrabackup 做物理全量备份,恢复时先 --prepare 应用 redo log 使备份一致,再用 mysqlbinlog 重放 binlog 到目标时间点/LSN;binlog 的起点由 xtrabackup 记录的 position 给定,恢复目标支持时间点与位置(based on --stop-datetime/--stop-position)。PostgreSQL 用 pg_basebackup 做数据目录的全量备份,配合 WAL 归档(archive_command 写入归档目录),恢复时通过 restore_command 从归档取 WAL 段,用 recovery_target_time/recovery_target_lsn 指定目标,PG 本地自动回放 WAL 到目标并停止。差异点:MySQL 的 binlog 是"逻辑层"日志(记录 SQL 变更),由独立工具重放,需手动指定起点;PostgreSQL 的 WAL 是"物理层"日志(记录页面变更),由 PG 自身按归档回放,恢复更"原生";恢复目标上 PG 支持时间、LSN、XID 等更丰富的目标,MySQL binlog 主要用时间与 position。两者都需保证日志完整性,且 PITR 精度受日志归档频率影响。

差异本质是"日志层级与重放机制":MySQL 用逻辑日志 binlog 靠外部工具重放,PostgreSQL 用物理日志 WAL 靠数据库自身回放。理解这一差异有助于在各自场景下正确配置恢复起点、目标与命令。

# MySQL:全量恢复 + binlog 重放
xtrabackup --prepare --target-dir=/backup/full
mysqlbinlog --start-position=154 --stop-datetime="2024-01-01 00:00:00" \
  /var/log/mysql/binlog.000015 | mysql -u root -p

# PostgreSQL:restore_command 从归档取 WAL + recovery_target
restore_command = 'cp /wal_archive/%f %p'
recovery_target_time = '2024-01-01 00:00:00'
#
★★

6. Oracle Flashback 与 PITR 的适用场景与边界是什么

Oracle Flashback 与 PITR 的适用场景与边界是什么?二者如何选择?

  • Oracle Flashback 的类型
  • PITR 的适用边界
  • 两者选型

Oracle Flashback 是一套闪回机制,用于快速回退误操作,常见类型包括:Flashback Query(闪回查询到过去时间点的数据)、Flashback Drop(闪回删除的表)、Flashback Table(把表回滚到过去状态)、Flashback Database(把整个数据库快闪回,依赖闪回日志)。适用场景:针对单表/单行的误删、误更新,Flashback 可在秒级内回退,无需完整恢复,操作级恢复非常高效。PITR(基于备份的恢复)通过全量备份+归档日志重放到目标时间点,适用场景:需要恢复整个数据库到某个时间点、或数据库损坏/文件丢失、或 Flashback 不可用的场景。边界与选择:Flashback 依赖闪回日志/回收站,若闪回日志被覆盖或数据变化过大,无法闪回;Flashback Database 会"倒退"整个库,可能影响其他正常对象,需谨慎;PITR 更彻底但恢复耗时(需重放日志)、对停机时间要求高,且同样受日志保留限制。通常:操作级误操作优先 Flashback(快、影响小),库级灾难/需要精确到目标时间点用 PITR,且两者可互补(Flashback 作为快速手段,PITR 作为兜底)。

Flashback 是"低成本快速回退",PITR 是"彻底重建"。选型取决于恢复范围(单表 vs 整库)与恢复速度(秒级 vs 分钟级)。Flashback 依赖闪回日志,PITR 依赖备份与归档,了解各自的依赖与边界才能正确选型。

#
★★

7. PITR 与延迟复制(delayed replica)在误操作恢复中的协同

PITR 与延迟复制(delayed replica)在误操作恢复中如何协同?

  • 延迟复制的机制
  • PITR 与延迟复制的互补
  • 协同恢复流程

延迟复制(delayed replica)是让从库延迟一定时间(如 N 分钟)才应用主库的变更,从而在误操作发生后,从库仍保留"误操作前"的数据,可快速用于恢复。机制:延迟复制从库的日志应用滞后于主库固定时间,若主库在 T 时刻发生误删,延迟从库在 T+N 时刻前仍存有误删前的数据。PITR 与延迟复制的协同:延迟复制用于"快速止损"——误操作发生时,立即从延迟从库提取误删前的数据(或直接用延迟从库/其快照),无需走完整 PITR,恢复快;PITR 用于"精确到目标时间点"的兜底——当延迟从库不可用、数据变化过大或需要恢复更早时间点时,用全量+日志重放实现精确恢复。协同流程:误操作发生后,先用延迟从库确认数据并快速恢复(优先),若延迟从库不够或需更精确时间点,再启动 PITR;两者都以"恢复到误操作前"为目标,延迟复制提供低成本快速路径,PITR 提供精确兜底路径。需注意延迟复制会带来额外的数据滞后与存储成本,且延迟从库本身也要被保护(防止同样被误操作)。

延迟复制是"为误操作准备的软地面",PITR 是"最终兜底"。协同的关键是"先用延迟从库快速止损,再用 PITR 精确兜底"。延迟复制牺牲一定的实时性换取"误操作前的数据可同时取得",与 PITR 形成互补,提高误操作恢复的时效与灵活性。

#
★★

8. PITR 回放引擎的工作原理中 redo/WAL 的 LSN 与时间戳定位、并行回放与恢复中断续点

PITR 回放引擎的工作原理是什么?LSN 与时间戳如何定位,并行回放与恢复中断续点如何处理?

  • redo/WAL 回放机制
  • LSN 与时间戳定位
  • 并行回放与断点续传

PITR 回放引擎的核心是把 redo/WAL 日志按顺序应用到目标状态。定位机制:日志记录有唯一的 LSN(Log Sequence Number,日志序列号)作为物理位置,也有时间戳(记录每条变更的大致时间),恢复目标可指定为某个 LSN 或时间戳,引擎从起点扫描日志,应用所有变更直到达到目标 LSN/时间戳为止,从而把数据推进到目标状态。并行回放:为加速,引擎会对日志按对象/事务/页进行分组,多线程并发应用不同部分的变更,但需正确处理依赖(同一页、同一对象的变更须有序),通过冲突检测与分区保证并行下的正确性,显著提升 TB 级大库的重放速度。恢复中断续点:若恢复过程中断(如磁盘满、进程被杀),引擎需能从中断点继续,而非从头重放——通过记录已应用到的 LSN/进度,重启后从该进度继续,避免重复应用破坏一致性;同时配合可重入(幂等)的日志应用保证续点安全。理解这些机制有助于优化恢复参数(如并行度、目标定位)并排查恢复耗时与中断问题。

回放引擎的三大机制是"定位(LSN/时间戳)、加速(并行)、续点(断点续传)"。LSN 提供精确位置,时间戳提供业务视角,并行提升速度,断点续传保证可恢复。这些机制共同决定了 PITR 的精度、速度与可靠性。

#
★★

9. PITR 在大型数据库(TB 级)场景下的加速手段(并行回放、增量备份)

PITR 在大型数据库(TB 级)场景下如何加速?并行回放与增量备份如何应用?

  • TB 级 PITR 的瓶颈
  • 并行回放加速
  • 增量备份减重放量

TB 级数据库的 PITR 主要瓶颈是"全量恢复耗时 + 日志重放量大"。加速手段:并行回放——提高日志应用的并行度,将重放按对象/事务/表空间分组并发应用,充分利用多核 CPU 与 I/O,显著缩短重放时间;合理配置并行度(如 PG 的 max_parallel_apply_workers、MySQL 的 slave_parallel_workers)并做 I/O 调优。增量备份——用增量/差异备份替代"总是全量恢复",从而减少"恢复到故障点"所需重放的日志量:先恢复最近的全量基线,再叠加增量备份,再重放仅"增量之后"的日志,缩短重放范围。其他手段:用高性能存储(SSD/NVMe)加速全量与日志的 I/O;将日志重放与恢复目标配合(只重放到目标点而非终点);多实例并行恢复不同表空间;使用专用恢复工具(如 pg_restore 并行、MySQL 的并行恢复)。落地时需评估并行度与存储的匹配、避免过度并行导致资源争抢,并预先压测恢复时间,使 PITR 在可接受窗口内完成。

TB 级 PITR 加速的本质是"并行化 + 减少重放量"。并行回放利用多核提速,增量备份缩短重放链,配合高性能 I/O 使恢复时间可控。加速手段需与硬件、目标时间点配合,并通过压测验证恢复窗口。

#
★★

10. PITR 对存储与 I/O 资源的影响及生产演练窗口选择

PITR 对存储与 I/O 资源有什么影响?生产演练窗口如何选择?

  • PITR 的资源消耗
  • 对生产的影响
  • 演练窗口选择

PITR 在恢复过程中会大量消耗存储与 I/O 资源:全量恢复需要把整份数据写入存储(写放大),日志重放需要持续读取归档日志并写回数据页,两者都会占用大量磁盘 I/O、CPU 与网络带宽,可能影响同机/同存储上的其他业务。因此 PITR 演练/恢复应避免在业务高峰进行,且尽量在隔离环境(临时实例、独立存储)执行,避免拖累生产。演练窗口选择:选在业务低峰期(如凌晨),此时生产负载低、对 I/O 竞争小,恢复演练对生产影响最小;同时预留足够的时间窗口覆盖完整恢复(全量+重放+验证),避免演练超时被强制中断;演练前评估恢复所需 I/O 与存储余量,必要时在演练环境而非生产环境执行。设计上,把"PITR 演练窗口"纳入运维排期,错峰执行,并监控演练期间生产 I/O 与延迟,异常时及时限流或中止,确保演练不影响生产可用性。

PITR 是"重资源"操作,理解其 I/O 与存储消耗是演练规划的前提。窗口选择遵循"低峰 + 隔离 + 预留余量"原则,既保证演练真实有效,又不影响生产。演练环境的隔离与资源评估是保护生产的关键。

#
★★

11. PITR 演练的自动化脚本与回滚验证流程

PITR 演练如何自动化?自动化脚本与回滚验证流程如何设计?

  • PITR 演练自动化
  • 脚本设计
  • 回滚与验证

PITR 演练自动化用于把"全量恢复 + 日志重放 + 验证 + 清理"固化为可重复执行的脚本,降低人工错误、提高演练频率。脚本设计:分阶段——①准备:选定演练库、确认全量备份与归档日志在演练环境可达;②恢复:自动执行全量恢复并定位日志起点;③重放:自动重放日志到目标时间点;④验证:自动执行行数/checksum/业务 SQL 校验;⑤清理:演练完成后自动清理临时实例与数据,避免残留。回滚验证流程:演练中若发现恢复结果异常(如行数不符、业务校验失败),脚本应支持回滚——中止当前恢复、清理已恢复数据、恢复到演练前状态,并记录失败原因,供复盘;对"演练本身"的验证,需确认恢复出的数据与误操作前基准一致(正向验证),同时演练失败时能安全退出(反向回滚)。设计上脚本要幂等(可重复执行)、可参数化(时间点、库名)、有进度与日志,并接入失败告警,使 PITR 演练可持续、可审计、可复盘。

自动化让 PITR 演练"高频可重复",回滚流程保证"演练失败也不留下脏数据"。脚本化的分阶段设计与幂等/可回滚特性,是把演练从"一次性手工操作"升级为"可持续的验证能力"的关键。

#
★★

12. binlog/WAL 损坏或丢失时 PITR 的降级策略

当 binlog/WAL 损坏或丢失时,PITR 的降级策略是什么?

  • 日志损坏/丢失的影响
  • 降级恢复手段
  • 预防与兜底

PITR 依赖 binlog/WAL 的完整连续性,日志损坏或丢失会破坏重放链,使"精确恢复到目标时间点"不可行,此时需降级策略。降级手段:①恢复到"最后一个完整日志"之前的时间点——跳过损坏/缺失段,把数据恢复到最后一个可用日志位置,牺牲精度换取可用性;②只恢复全量备份——若日志不可用面过大,则只能在最近全量备份时间点恢复,RPO 退化为全量间隔;③用其他来源补齐——如用从库/延迟从库/跨库副本的数据、或从复制下游取回数据,尽量补回缺失的变更;④利用存储/文件系统快照弥补——若日志丢失但存在快照,可恢复到更接近的时间点。同时,若日志损坏但内容可部分解析,可尝试跳过损坏记录继续重放(部分数据库支持)。预防与兜底:日志多做一份(镜像/归档到异地)、定期校验日志完整性、监控日志断流与损坏告警,并保证"全量备份 + 日志"至少有一份完整可用,避免日志与全量同时故障。降级策略的核心是"宁可降低 RPO 精度,也要保证有可用的恢复点"。

日志损坏/丢失的降级本质是"顺着可用日志/备份往回退到最近的可用点"。策略顺序是"跳损坏段→全量兜底→外部补齐",同时用日志冗余与完整性监控做预防。降级策略保证极端情况下仍有可恢复的数据点,而不是完全无法恢复。

#

13. MySQL binary log 的 format(row/statement/mixed)对 PITR 准确性的影响

MySQL binary log 的 format(row/statement/mixed)对 PITR 准确性有什么影响?

  • 三种 binlog 格式
  • 对重放准确性的影响
  • 生产建议

MySQL binlog 有三种格式:statement(记录执行的 SQL 语句)、row(记录每行变更前后的值)、mixed(自动选择,默认 statement,非安全语句用 row)。对 PITR 准确性的影响:statement 格式记录 SQL,重放时重新执行语句,若语句不安全(如依赖临时表、非确定性函数 NOW()/UUID、并发顺序),重放结果可能与原始不一致,导致 PITR 数据不准确;row 格式记录每行的实际变更,重放时直接应用行变更,与原始执行结果一致,准确性最高,是 PITR 最可靠的选择;mixed 混合模式,对非安全语句自动用 row,安全语句用 statement,兼顾性能与准确性,但仍有少部分语句可能走 statement 而存在不确定性。生产建议:为保证 PITR 的准确性与可预测性,优先使用 row 格式(或 mixed 并确保关键非安全操作走 row),并配合 binlog_row_image=FULL 记录完整前后值,方便精确恢复与冲突处理。row 格式虽然日志更大,但准确性最优,是 PITR 与复制的主流选择。

三种格式的核心差异是"记语句还是记行"。statement 重放可能因不确定性导致结果偏差,row 记录实际变更、重放最准确。生产 PITR 优先 row 格式,用"更精确的日志"换取"更可靠的恢复"。

-- MySQL 配置 binlog 格式为 row(生产 PITR 推荐)
SET GLOBAL binlog_format = 'ROW';
-- 记录完整前后值,便于精确恢复
SET GLOBAL binlog_row_image = 'FULL';
#

14. PITR 与备份组合中全量基线加归档日志的恢复链如何缩短恢复时间

PITR 与备份如何组合?全量基线+归档日志的恢复链如何缩短恢复时间?

  • 备份与日志的组合恢复链
  • 缩短恢复时间的机制
  • 恢复链设计

PITR 与备份组合的标准恢复链是"全量基线 + 归档日志"。恢复时间取决于"全量恢复耗时 + 从基线到目标点的日志重放量"。缩短恢复时间的手段:①用更接近目标时间的全量/增量备份做基线——基线越新,需重放的日志越少,恢复越快;②用增量备份叠加——恢复最近的全量基线后,先应用增量备份再重放少量日志,缩短日志重放范围;③并行恢复与并行重放——对全量与日志应用都用多线程加速;④只重放到目标时间点(而非终点),减少重放量;⑤高 I/O 存储加速全量恢复与日志应用。恢复链设计上,采用"金字塔"式备份:高频增量(每小时)叠加低频全量(每日),配合短期日志,使任意时刻都能用"最近的基线 + 少量日志"快速恢复,兼顾 RPO 与 RTO。落地时需监控备份链的完整性(日志连续性、基线可用性),一旦某环断裂要及时修复,保证恢复链始终可用。

"全量基线+归档日志"的核心是"基线越新、日志越少,恢复越快"。通过高频增量/更近基线 + 并行 + 只重放到目标点来缩短恢复链。恢复链的设计是"用适度的备份开销换取可接受的恢复时间"。

#

15. PITR 演练场景中误删表、误更新与误 DDL 三类误操作的恢复步骤与验证方法

PITR 演练中,误删表、误更新与误 DDL 三类误操作分别如何恢复与验证?

  • 三类误操作的恢复步骤
  • 目标时间点定位
  • 验证方法

三类误操作恢复的共性思路是"全量基线 + 日志重放到误操作前的时间点",但细化步骤不同。误删表:定位到 DROP 前的日志位置,恢复全量后重放到"表格删除前"(跳过 DROP 事务),把数据导回,验证行数与内容。误更新(UPDATE 且未提交的公共数据被改):定位到 UPDATE 执行前的时间点,恢复全量+重放到该时刻,取回被覆盖的旧值,重点验证被影响行的新旧值;若已提交且后续大量写入,需用 binlog 逆向或从更早时间点恢复。误 DDL(如误删列、误改表结构):定位到 DDL 之前,恢复全量+重放,取回 DDL 前的表结构与数据,验证结构(列、索引)与数据行数;由于 DDL 会改变结构,重放需恰好在 DDL 前停止,否则后续日志因结构不匹配无法应用。验证方法:三类都做行数比对、checksum 与关键业务 SQL 校验,误 DDL 额外验证表结构正确、误更新额外验证受影响行值正确。演练需分别为三类准备场景与 Runbook,用临时实例演练并记录目标定位与恢复结果。

三类误操作的差异在于"目标时间点要停在哪个事件之前":误删表停在 DROP 前、误更新停在 UPDATE 前、误 DDL 停在 DDL 前。时间点定位与日志边界是恢复的关键,验证则按各自特点侧重行数/值/结构。分类演练能覆盖最常见的误操作恢复需求。

#

16. PITR 的关键配置项中归档开启、恢复目标(时间/LSN)与恢复模式的参数如何设置

PITR 的关键配置项有哪些?归档开启、恢复目标(时间/LSN)与恢复模式的参数如何设置?

  • PITR 的关键配置
  • 归档与恢复目标参数
  • 恢复模式设置

PITR 的关键配置项分三块:归档开启、恢复目标、恢复模式。归档开启:MySQL 需开启 binlog(log_bin=ON)并合理设置 expire 与格式;PostgreSQL 需开启 archive_mode=on 并配置 archive_command 把 WAL 写入归档目录,同时设置 wal_level=replica。恢复目标:MySQL 用 --stop-datetime/--stop-position 指定目标时间点/LSN;PostgreSQL 用 recovery_target_time/recovery_target_lsn/recovery_target_xid 指定恢复目标。恢复模式:决定恢复到目标后如何动作——PostgreSQL 的 recovery_target_action 可设为 pause(停在目标点等待确认)、promote(恢复后提升为主)、shutdown(恢复后关闭);MySQL 的恢复一般重放到目标后停止,再人工确认。设置要点:归档必须持续开启且完整,否则无法精确重放;恢复目标要精确(时间/位置),并配合 recovery_target_inclusive 控制是否包含目标点所在事务;恢复完成后调整恢复模式参数(如从 standby 提升为可写),并验证数据。生产配置需在演练中验证参数正确性与恢复效果。

PITR 配置的闭环是"归档开启(数据齐全)→ 恢复目标(到哪)→ 恢复模式(到后怎么办)"。归档是前提,目标决定精度,模式决定恢复后的状态。参数设置需在演练中验证,确保配置正确、恢复可用。

# PostgreSQL:开启归档与恢复目标
archive_mode = on
archive_command = 'cp %p /wal_archive/%f'
wal_level = replica
recovery_target_time = '2024-01-01 00:00:00'
recovery_target_action = 'pause'   # 或 promote/shutdown
#

17. PostgreSQL WAL archiving 与 PITR 中 restore_command 的配置要点

PostgreSQL 的 WAL archiving 与 PITR 中 restore_command 如何配置?要点有哪些?

  • WAL archiving 配置
  • restore_command 的作用
  • 配置要点与常见问题

PostgreSQL 的 WAL archiving 与 PITR 配合:开启 archive_mode=onwal_level=replica,设置 archive_command 把满的 WAL 段复制到归档目录(如 cp %p /wal_archive/%f),保证重放时需要的 WAL 无限期可从归档获取。恢复时,restore_command 定义"如何从归档获取 WAL 段":PG 在恢复过程中会以 %f(需要获取的 WAL 文件名)和 %p(目标路径)调用该命令,如 restore_command = 'cp /wal_archive/%f %p',PG 用它能取回归档 WAL 并回放。配置要点:①archive_command 必须成功且正确写入归档,失败会阻塞归档(需监控并处理);②restore_command 必须能从归档取回对应 WAL 段,且当 WAL 不存在时返回非零让 PG 知道边界;③恢复目标通过 recovery_target_time/recovery_target_lsn 设置,配合 recovery_target_action;④归档目录需与 base backup 一致(备份时记录起始 WAL),保证恢复起点正确;⑤archive_mode 需在 postgresql.conf 中设置且重启生效,restore_command 在恢复配置中设置。常见问题:归档丢失导致恢复中断、archive_command 路径错误导致 WAL 未归档、restore_command 权限/路径问题导致无法取回 WAL。需在演练中验证归档与恢复链路。

archive_command 负责"把 WAL 写出去(归档)",restore_command 负责"把 WAL 拿回来(恢复)",两者是 PITR 的读写两端。配置要点是确保归档完整、restore 能正确取回、恢复目标与基线衔接,并在演练中验证整个链路。

# 归档:把满 WAL 段复制到归档目录
archive_mode = on
archive_command = 'cp %p /wal_archive/%f'
wal_level = replica

# 恢复:从归档目录取回 WAL 段
restore_command = 'cp /wal_archive/%f %p'
recovery_target_time = '2024-01-01 00:00:00'