第 1 / 23 篇

前言:恢复是一次需要证明的业务变更

数据库备份页面显示昨天的任务成功,复制监控显示两个线程都在运行,这些信息让人安心,却还没有回答最困难的问题:如果此刻误删订单,或者主库在最后一次提交之后失联,明天恢复出来的系统究竟承认哪些交易?客户已经收到成功的付款,会不会消失?一笔支出是否只剩下账户余额变化,却找不到对应订单?旧主重新启动时,又由谁保证它不继续接受写入?

本书把这些问题放进同一套实验。我们建立账户、订单和分录三种业务记录,用真实MySQL实例完成备份、恢复、日志回放和手工故障切换。每一次所谓成功,都必须拿出明确的业务状态。文件能下载、SQL能运行、复制线程没有报错,是过程证据;目标订单存在、应排除的事务不存在、账务关系成立,才是结果证据。

这本书与讨论索引、事务隔离和死锁的读物有不同的中心。我们会使用事务,却把视角放在数据库之外:业务确认、日志保存、恢复环境、写入入口与交付验收如何共同形成恢复能力。你不需要先构建复杂运维平台,但应能阅读SQL,理解提交与回滚,并愿意区分已经观察到的行为和希望系统具有的能力。

全书十八章沿着一条恢复路径展开。先定义承诺与实验边界,再制作可恢复的一致快照,然后用准确事务边界回放二进制日志,随后观察异步复制的应用延迟与丢失窗口,最后处理旧主隔离、手工提升、业务核对与演练制度。附录提供练习解析、官方来源和术语,完整实验代码会自动编入电子书,也能单独下载。

正式运行环境是Ubuntu的GitHub Actions和固定摘要的MySQL官方容器镜像。作者机器不具备Docker服务,因此没有把本地静态检查冒充数据库实验。随书程序在远端实际启动四个实例,生成机器可读证据,独立解压的实验包还会重新执行全部场景。具体版本、耗时与恢复结果以下载区的validation.json为准,不能把一次小数据集运行外推为生产容量指标。

本书不实现自动选主、代理切流、跨地域高可用或物理存储损坏恢复。故障切换是受控的人工流程,旧主通过容器停止而被隔离,重新启动时保持断网和只读。异步复制中尚未到达副本的已确认事务会真实丢失,我们保留这个结果。理解边界并没有削弱方案,反而让下一次改进有了清楚的起点。

所有破坏性操作只针对程序创建的随机命名教学资源。请先读第二章的隔离约定,再运行实验。生产系统中的恢复与切换必须结合你自己的拓扑、权限、存储和业务确认协议重新设计。我们要获得的能力,是知道如何提出可验证的恢复目标,并持续保存足以判断目标是否达成的证据。