核心定位
- Redo Log (重做日誌):保證**事務持久性**,記錄「做了什麼修改」(物理頁面變更),採用 WAL (Write-Ahead Logging)。
- Undo Log (回滾日誌):保證**事務原子性**與 **MVCC**,記錄「修改前的舊值」(邏輯反向操作)。
關鍵概念
LSN (Log Sequence Number)
- 單調遞增的 64 位無符號整數,代表日誌字節偏移量
- 遍佈:頁面 LSN、Redo Log LSN、Checkpoint LSN
SHOW ENGINE INNODB STATUS 可見:Log sequence number, Log flushed up to, Last checkpoint at
Dirty Page (髒頁) 與 Flush 機制
- Buffer Pool 中被修改、未刷盤的頁面
- Flush 觸發條件:
① Redo Log 循環寫追趕 Checkpoint (最嚴重)
② Buffer Pool 空間不足需淘汰髒頁
③ Master Thread 定期 (1s/10s) 批量刷新
④ innodb_max_dirty_pages_pct (預設 90%) 閾值觸發
⑤ 正常關閉
Redo Log 詳細機制
結構與參數
- 文件組:
ib_logfile0, ib_logfile1... (預設 2 個)
innodb_log_file_size:單文件大小
innodb_log_files_in_group:文件組數量
- 總大小 = size × count,建議 1~4GB
- 循環寫入,覆蓋前必須確保對應髒頁已刷盤
寫入流程
- 事務修改頁面 → 生成 Redo 記錄寫入 **Log Buffer** (內存)
- 提交時根據
innodb_flush_log_at_trx_commit 刷盤:
1 (預設):每次提交 fsync,最安全
2:寫入 OS Cache,每秒 fsync,性能較好
0:每秒寫入+fsync,風險最高
- Log Buffer 滿 1/3 / 1MB / 3秒 / 提交時 → 刷入文件
Checkpoint 類型
| 類型 | 觸發時機 | 特點 |
| Sharp Checkpoint | 正常關閉 | 刷新所有髒頁,LSN 推進到最新 |
| Fuzzy Checkpoint | 運行時 | 增量刷新部分髒頁,非阻塞 |
Fuzzy 細分:Master Thread、FLUSH_LRU_LIST、Async/Sync Flush、Dirty Page 過多。
Undo Log 詳細機制
分類
- Insert Undo:僅事務可見,提交後**立即刪除** (無 MVCC 需求)
- Update Undo:UPDATE/DELETE 產生,支援 MVCC,**保留至無活躍事務需求**
存儲與 5.6+ 獨立表空間
- 預存於系統表空間
ibdata1
- 5.6+ 支援
innodb_undo_tablespaces、innodb_undo_directory 獨立文件,便於管理與 I/O 隔離
版本鏈與 Purge
- 每行記錄含
DB_TRX_ID、DB_ROLL_PTR 指向 Undo 版本鏈
- Purge 線程清理無用 Undo (無活躍事務可見)
- 長事務 → 版本鏈極長 → Purge 延遲 → 空間膨脹、查詢變慢
Crash Recovery 全流程
- 讀取最新 Checkpoint LSN
- Redo 階段 (Roll Forward):從 Checkpoint LSN 開始順序掃描 Redo Log,將已提交事務的修改重新應用到頁面 (含提交前已刷盤的髒頁,冪等操作)
- Undo 階段 (Roll Back):掃描未提交事務的 Undo Log,執行反向操作回滾
- 完成,實例可用
**關鍵**:只需從 Checkpoint 開始,而非重放所有日誌,LSN 保證同步效率。
生產調優建議
innodb_flush_log_at_trx_commit=1 + sync_binlog=1:雙 1 配置,數據零丟失
- 擴大 Redo Log 總量 (4GB+) 減少 Checkpoint 衝刷頻率
innodb_max_dirty_pages_pct=75 提前觸發刷新,平滑 I/O
- 獨立 Undo 表空間 + 監控
History list length 防長事務
- 定期
SHOW ENGINE INNODB STATUS 觀察 LSN 推進、Checkpoint 年齡、Log Buffer 使用率
透徹理解 Redo/Undo,才能駕馭 InnoDB 核心可靠性機制。
- 上一篇文章: MySQL 分頁查詢數據丟失問題深度分析與解決方案
- 下一篇文章: MySQL 5.6 二進位包安裝標準化流程 (用戶、目錄、my.cnf、初始化)
Copyright ©
程式碼之家 All Rights Reserved