主从切换与数据恢复:PITR 与 xtrabackup 边界
误删表后的第一反应不应该是
RESET MASTER。PITR 需要
全量备份点 + 连续
binlog;物理备份(Percona XtraBackup)捕获
InnoDB 页快照 + redo 位点,恢复后仍需
apply binlog 到目标时刻。GTID 环境下
failover 要遵守 executed gtid
集合单调性,否则从库拒绝启动。
版本 8.0.36;工具版本需与 Server 匹配(以官方文档为准)。
一、备份类型
| 方式 | 机制 | 优点 | 缺点 |
|---|---|---|---|
| mysqldump | 逻辑 SQL | 简单、跨版本 | 大库慢、锁/一致性依赖选项 |
| xtrabackup | 物理页拷贝 + redo | 热备、恢复快 | 工具链、版本耦合 |
XtraBackup 在备份结束记录 binlog
位点/GTID,恢复后 xtrabackup --prepare
应用 redo 到一致点。
二、PITR 流程
flowchart LR
FULL[全量备份 T0] --> RESTORE[恢复到实例]
BIN[binlog T0→T1] --> APPLY[mysqlbinlog / MTS]
APPLY --> TARGET[目标时刻 T1]
# 示意命令,需本地验证环境与路径
# xtrabackup --backup --target-dir=/backup/full
# xtrabackup --prepare --target-dir=/backup/full
# mysqlbinlog --stop-datetime="2026-06-18 12:00:00" binlog.000010 | mysql边界:未包含在 binlog 中的 DDL、非 InnoDB 引擎、主库已 PURGE 的 binlog 无法回到更早时刻。
三、GTID failover
提升从库为主后:
- 避免回退 更小 GTID 集合 的实例为主
RESET MASTER会清空 binlog 与 executed 历史——仅在明确重建拓扑时使用
Orchestrator、MHA 等工具处理选举;内核机制仍是 第 13 篇。
四、误操作 DROP 边界
- 有 binlog + 备份:可生成反向事件或恢复到临时实例导出
- 无 binlog:数据不可恢复
- 闪回工具依赖 row binlog + 完整行镜像
五、关键要点
- 物理备份 + binlog 是 PITR 标准组合。
- GTID 约束拓扑拼接。
- RESET MASTER 有毁灭性,非日常操作。
- 恢复演练应按 RTO/RPO 定期做。
十、PG 对照
| 维度 | MySQL | PG |
|---|---|---|
| 物理备份 | XtraBackup(热拷页+redo) | pg_basebackup |
| PITR | binlog 逻辑事件 | WAL archive + recovery_target |
| 位点 | GTID / file+pos | LSN / timeline |
| 提升从库 | CHANGE MASTER / 自动 | pg_ctl promote |
PG 第 18 篇 timeline 与 MySQL GTID 集合类似,都用于 防止脑裂后错误拼接。
上一篇:性能调查方法论
下一篇:配置陷阱
参考资料
源码(MySQL 8.0.36)
storage/innobase/— 引擎实现sql/binlog.cc,sql/handler.cc— Server 层交界
官方文档
- MySQL 8.0 Reference Manual, InnoDB / Replication / Backup
相关文章
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【MySQL InnoDB 内核】主从复制:异步、半同步、GTID 与并行回放
拆解 Dump/IO/SQL 线程、GTID、WRITESET 并行复制、半同步等待点与 Seconds_Behind_Master 陷阱。
【MySQL InnoDB 内核】InnoDB 架构与线程模型
InnoDB handler 边界、Master/Purge/IO/Page Cleaner 线程、内存布局与 srv0srv.cc 启动路径。
【MySQL InnoDB 内核】页结构与行格式
FIL 页头、Infimum/Supremum、聚簇/二级索引、ROW_FORMAT 与 rem0rec.h 行头字段。
【MySQL InnoDB 内核】Buffer Pool 与 LRU:frame、flush 列表与 young/old 分区
Buffer Pool 实例、LRU 年轻/年老分区、flush 列表、buf_page_get 路径与 read-ahead。