419 字
2 分钟
MySQL 崩溃后如何恢复已提交事务
InnoDB 重启时会检查 Redo Log 和数据页状态,对需要的修改执行前滚(redo),并撤销未提交事务的效果(undo)。因此崩溃瞬间仍留在 Buffer Pool 的脏页不意味着已提交数据丢失:只要相关日志符合持久化配置,恢复过程就能把数据页推进到正确状态。恢复耗时会受待处理日志、脏页和未完成事务影响。
单纯引擎崩溃恢复与恢复到某个时间点是两件事。时间点恢复通常先还原一个一致性备份,再按顺序重放备份之后的 Binlog,直到目标时间或位置。必须确保备份和 Binlog 连续、保存期足够,并先在隔离环境演练。误删后的恢复不能依靠 Redo Log 来选取历史业务时刻。
崩溃恢复能力还受刷盘设置和硬件行为影响。innodb_flush_log_at_trx_commit=1 配合可靠存储设备可提供更强的本地提交持久性;若设备缓存不兑现 flush/FUA 语义,软件配置无法弥补。还应设置可恢复的备份策略并定期验证恢复,而非只看备份任务显示成功。
追问
- 重启时 Redo 和 Undo 分别做什么? Redo 前滚已记录的页修改,Undo 撤销未提交事务,恢复一致状态。
- 如何恢复到误删前一分钟? 恢复最近的一致备份,再重放连续 Binlog 到误删前的位置或时间。
- Redo Log 能代替备份吗? 不能。它用于引擎崩溃恢复,不是长期历史归档或任意时间点回滚方案。
MySQL 崩溃后如何恢复已提交事务
https://blog.xqcherry.top/posts/interview/mysql/crash-recovery/ 目录