Repository navigation
feat: 日志增量与按时间点恢复:MySQL binlog、PostgreSQL 物理全量与 WAL - #10
Merged
Merged
Conversation
- 增量(binlog)任务的全量用 --source-data=2 / --master-data=2 在导出头部取得位点,GTID 开启时用 --set-gtid-purged=COMMENTED 取得 GTID 集合,MariaDB 由导出的文件和位置经 BINLOG_GTID_POS 换算;位点写进快照标签 start-pos 与 start-time 和运行日志,取不到时本次运行失败 - 仅全量任务的导出参数与行为不变 - compose 增加按 profile 启动的 MySQL 5.7、8.4、MariaDB 11.4、PostgreSQL 15、18 与带 sshd 的 PostgreSQL 目标;test-env.sh 增加 profile-up / profile-down;testenv 增加读取函数;补充 testing.md、verification.md 与 .env.example
- 新增 internal/pkg/pgphys:经复制连接建立、读取与删除物理复制槽 opsnap_<任务 ID>,执行 PG15+ 的 BASE_BACKUP(WAL、MANIFEST)并自行解码 n/d/p/m 子消息,得到 base.tar(含 pg_wal/)与 backup_manifest;位置写成 <LSN>;tli=<时间线> - 低于 15 或有自定义表空间时本次运行失败并写明原因,不建复制槽;没有收到终点或备份清单时不形成快照,归入“校验” - kopiarepo 的 SnapshotRequest 增加 Finalize:流读完后补全标签;物理全量的 start-pos/end-pos 为起止位置,start-time 为收到终点的时刻 - BASE_BACKUP 在快照写入开始后发出;暂停、删除任务或改为仅全量时删除复制槽,失败只记日志 - 真实测试在临时 PG 15、18 上证明只用这份快照即可在 pg-ssh 上恢复并成为主库;更新 AGENTS.md 与 architecture.md
…口执行确认、版本与并发规则,可选恢复前快照,取消与失败写明目标当前状态,kopia 快照流式读取,按目标版本选用 mysql 并以 0600 选项文件传凭据
…00 临时文件交给 mysqlbinlog / mariadb-binlog 重放,由目标分配新的 GTID,重放失败写明重放到的时刻;README 补离线按时间点恢复步骤
…段补零)与恢复配置,执行启动命令(输出去掉秘密)后经 SSH 隧道等待提升为主库并清理;恢复到本任务源集群时先停接收、成功后以“恢复后重建”重建;探测读取 data_directory 供预填;README 补离线物理恢复步骤
…步骤与“恢复后重建”标签;假 SSH 主机给出检查目标的确定输出,e2e 覆盖检查流程
…前方式能恢复的全量(e2e 用 bin/seedsnap 准备物理全量)、仅全量任务按增量链清理旧增量、第 4 步另有增量说明、快照库清单未知时预先要求确认同名库、提升为主库时写出重放位置、物理方式日志不提导出工具,并撤回备份任务 spec 中多出的修订
…断的归档不算归档失败;reconcile 对刚结束的接收重新读取状态、同一任务只留一个接收,关闭时先取消;PostgreSQL 保活只在其后再无 WAL 时报告已追上;mysqlbinlog 重放不再因 WaitDelay 截断输出;工具读取输入出错时报读取错误并修复竞争;物理恢复的启动命令输出经远端临时文件、提升后检查数据目录的偶发 SSH 失败重试;逻辑恢复对 13 以下目标不用 WITH (FORCE),全局对象超限报错;binlog 起点在首个文件末尾时接着下一个文件;恢复选项给出每份全量的可恢复区间,弹窗按它选基础全量;有恢复进行时持续高频刷新,换快照后同名库确认失效;合并重复的毫秒取整、PG 连接串与 TLS 文件、复制连接 TLS、重建排队与工具输出缓冲
…目标恢复,不暂停接收、不补恢复后重建;检查结果写明是哪一种;地址相同的主机标为“与源库同一主机”
…接收;暂停时本任务自己删除的复制槽不判为中断;接收流记下所属的任务启用时间,启用时间只增不减
…INLOG MONITOR 的 REPLICATION CLIENT 算作具备复制权限;README 离线恢复写明新接收流(restart)出现的全部情形;补全运行触发方式说明
…群;排队启用后重建失败时状态显示已暂停;挂载点上 du 读不全时按读不出大小处理;去掉空断言测试并合并重复的排队逻辑
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
本 PR 是第 3 轮:日志增量与按时间点恢复。需求见
docs/specs/2026-10-08-incremental-pitr.md,它包含运行时验证之后的两次修订。备份方式:
opsnap_<任务 ID>,基础备份覆盖整个集群。max_slot_wal_keep_size未设上限时提示风险;有自定义表空间时不可用。接收与归档:
恢复(任务详情 → 恢复):
界面:
验证
make verify通过:golangci-lint 0 issues,47 个 Go 包测试通过,Vitest 512,Playwright e2e 55。mysqlbinlog/ PostgreSQL,MySQL 与 PG 物理各做一次按时间点恢复,数据一致。已知问题与未观察
元数据库变更
job_incrementals,记录每个任务的接收状态。jobs增加archive_interval与incremental_since;job_runs增加恢复相关字段与物理恢复参数;job_incrementals增加enabled_at。migrations/20261008_job_incremental.go、20261009_job_incrementals.go、20261010_job_run_restore.go、20261011_job_incremental_since.go、20261011_job_run_restore_physical.go、20261012_job_incremental_enabled_at.go。