JJava 知识库
JAVA INTERVIEW

高频面试题

MySQL高级约 3 分钟

数据库宕机恢复、事务回滚和主从复制分别依赖哪些日志?项目里怎么配置?

参考回答约 3 分钟 · 口语表达
先说结论

我会先控制影响,再按证据定位:从事务恢复、MVCC、复制与两阶段提交理解 MySQL 三大日志

01

我会先确认影响范围,同时控制故障继续放大。能否从所属层次、记录内容和用途区分三类日志。 是否理解 Redo Log 为什么能把随机写转化为更顺序的日志写。 能否解释 Undo Log 同时服务回滚与 MVCC。 是否理解 Binlog 是复制、增量订阅和时间点恢复的重要基础。 能否说明两阶段提交解决了什么一致性问题。

02

止损之后,我会按请求链路建立证据,而不是凭经验猜。沿着「修改 Buffer Pool 页 → 生成 undo 旧版本 → 追加 redo 物理日志 → 两阶段协调 binlog → 刷盘恢复与复制消费」观察输入、状态与输出,这些阶段都可以从日志、指标或源码里验证。 修改 Buffer Pool 页 数据页通常先在内存修改为脏页,不要求事务提交时立即刷回表空间。 生成 undo 旧版本 undo 保存逻辑旧版本,支持事务回滚和 MVCC 快照读取,最终由 Purge 清理。 storage/innobase/log:redo 写入、checkpoint。 performanceschema.logstatus:LSN 与 binlog 状态。 我会先确认请求实际走到了哪条路径,再用运行数据验证,不会只看类名或配置猜测。

03

定位时我最关注这些参数、指标和容量关系。故障注入分别发生在 redo prepare、binlog flush、commit 后,重启核对事务、binlog 与副本结果。

04

找到根因后先做最小修复,再用同样的流量验证。错误地把业务消息发送放在数据库提交之后,进程在提交成功与发送之间崩溃。redo/binlog 能恢复数据库,却不能自动补发外部消息。使用事务 Outbox 从 binlog 或可靠扫描投递后才补齐跨系统窗口。 把 redo 当成数据库备份:redo 写入与 checkpoint 年龄:核心库使用双 1 持久化。 固定输入和基线 先在没有故障注入的环境执行上述配置,固定数据规模、并发度、运行时版本和预热时间。以「checkpoint age」为主基线,记录值应满足「低于日志容量安全线」;同时保存 redo 写入与 checkpoint 年龄、History List Length,使后续变化能够回到同一时间轴比较。

05

恢复阶段要逐步放量,最后把监控和边界补齐。方案:更适合的场景:主要收益:代价与边界。 redo:InnoDB 崩溃恢复:顺序 WAL、恢复页修改:不提供跨库逻辑复制接口。 undo:回滚与一致性读:保留旧版本:长事务会阻塞清理。 binlog:复制、备份和 CDC:逻辑事务流、跨存储消费:保留与格式需要治理。 选型至少带上 数据规模、选择性、读写比、事务长度和峰值并发,并用上面的量化基线验证;未知数据应明确为待测假设。

排查与恢复时间线从目标到落地
01修改 Buffer Pool 页
02生成 undo 旧版本
03追加 redo 物理日志
04两阶段协调 binlog
05刷盘恢复与复制消费