从零上手恩智浦MM912H634评估板:硬件连接、软件调试与核心模块实战
2026/6/17 17:11:00
MySQL 事务持久化依赖WAL(Write-Ahead Logging,预写日志)机制,其核心思想是:“先写日志,再写数据”。这确保了即使系统崩溃,也能通过日志恢复事务的原子性与持久性。
| 特性 | WAL 如何实现 |
|---|---|
| Atomicity | 未提交事务无 Redo Log → 自动回滚 |
| Durability | 提交事务的 Redo Log 已刷盘 → 必可恢复 |
| Consistency | Redo + Undo 保证数据逻辑一致 |
| Isolation | MVCC + Undo Log 实现 |
✅本质:
WAL 将随机 I/O(数据页)转换为顺序 I/O(日志),用时间换空间,用简单换可靠。
fsync()确保 Redo Log 落盘⚠️关键点:
事务持久化 = Redo Log 落盘,与数据页无关!
ib_logfile0,ib_logfile1(默认 2 个)innodb_log_file_size控制(建议 1~4GB)[Group 1] [Group 2] ... [Group N] → 回绕到 Group 1fsyncinnodb_flush_log_at_trx_commit = 1 # 每次 COMMIT 刷盘(安全) innodb_flush_log_at_timeout = 1 # 后台每秒刷一次| 参数 | 默认值 | 作用 | 安全 vs 性能 |
|---|---|---|---|
innodb_flush_log_at_trx_commit | 1 | COMMIT 时刷 Redo | 1=安全, 2/0=高性能 |
innodb_log_file_size | 48M | 单个 Redo 文件大小 | 越大越少 checkpoint |
innodb_log_files_in_group | 2 | Redo 文件数量 | ≥2 防止单点故障 |
innodb_log_buffer_size | 16M | Redo 内存缓冲区 | 大事务需调大 |
⚠️生产建议:
innodb_flush_log_at_trx_commit=1(金融级必须)innodb_log_file_size=2G(减少 checkpoint 压力)
🔍验证:
SHOWENGINEINNODBSTATUS\G-- 查看 "LOG" 部分:LSN, flushed up to, etc.
为保证主从一致性,MySQL 采用内部 XA 事务:
✅目的:
确保 Binlog 与 InnoDB 状态一致,避免主从不一致
| 指标 | 命令 | 健康值 |
|---|---|---|
| Redo Log 使用率 | SHOW ENGINE INNODB STATUS | < 90% |
| Log Flush Wait | SHOW GLOBAL STATUS LIKE 'Innodb_log_waits' | = 0 |
| LSN 差距 | SHOW ENGINE INNODB STATUS | Checkpoint LSN 接近最新 LSN |
innodb_log_file_size→ 减少 checkpoint 频率Innodb_log_waits=0(否则增大innodb_log_buffer_size)💡一句话:
Redo Log 是数据库的黑匣子,记录每一次改变,确保 crash 后重生如初。