1. 核心概念
保证数据不丢失,本质上是保证事务的 持久性 (Durability)。即便数据库宕机或断电,已提交的事务修改也不能丢失。
MySQL InnoDB 引擎依靠 WAL (Write-Ahead Logging) 技术,即“先写日志,再写磁盘”来保证数据安全。
2. 关键机制
2.1 Redo Log (重做日志)
- 作用:记录物理数据页的修改(“在第 X 页第 Y 偏移量写了 Z”)。
- 机制:事务提交时,必须先将 Redo Log 持久化到磁盘。如果系统崩溃,重启时通过重放 Redo Log 恢复内存中未刷盘的脏页数据。
- 特点:循环写,物理日志。
2.2 Binlog (归档日志)
- 作用:记录逻辑 SQL 语句(或行修改)。主要用于主从复制和数据恢复(Point-in-Time Recovery)。
- 机制:事务提交时追加写入。
2.3 两阶段提交 (2PC)
为了保证 Redo Log 和 Binlog 的逻辑一致性,MySQL 使用两阶段提交:
- Prepare 阶段:写 Redo Log,标记为 Prepare。
- Write 阶段:写 Binlog。
- Commit 阶段:将 Redo Log 标记为 Commit。
3. 生产配置:双 1 设置
要真正保证数据 零丢失,必须在 my.cnf 中配置以下两个参数:
innodb_flush_log_at_trx_commit = 1- 每次事务提交时,都将 Redo Log 强制刷入磁盘(fsync)。
- 缺省为 1。如果设为 0 或 2,虽然性能提升,但断电会丢失 1秒 数据。
sync_binlog = 1- 每次事务提交时,都将 Binlog 强制刷入磁盘。
- 缺省可能为 0(由 OS 调度刷盘),宕机可能丢失 Binlog,导致主从不一致。
4. 总结
面试回答示例: “保证 MySQL 数据不丢失主要靠 Redo Log 和 Binlog。 在底层,InnoDB 使用 WAL 技术,事务提交时优先持久化日志。 为了防止断电丢数据,生产环境必须开启 ‘双1’ 配置:即 innodb_flush_log_at_trx_commit=1 和 sync_binlog=1,强制每次提交都刷盘。同时,MySQL 内部通过 两阶段提交 保证了 Redo Log 和 Binlog 的一致性。”