首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

InnoDB Redo Log 與 Undo Log 深度解析:WAL、LSN、Checkpoint、Crash Recovery 全流程

     編輯:MySQL 綜合教學

核心定位

  • 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
  • 循環寫入,覆蓋前必須確保對應髒頁已刷盤

寫入流程

  1. 事務修改頁面 → 生成 Redo 記錄寫入 **Log Buffer** (內存)
  2. 提交時根據 innodb_flush_log_at_trx_commit 刷盤:
    1 (預設):每次提交 fsync,最安全
    2:寫入 OS Cache,每秒 fsync,性能較好
    0:每秒寫入+fsync,風險最高
  3. Log Buffer 滿 1/3 / 1MB / 3秒 / 提交時 → 刷入文件

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 全流程

  1. 讀取最新 Checkpoint LSN
  2. Redo 階段 (Roll Forward):從 Checkpoint LSN 開始順序掃描 Redo Log,將已提交事務的修改重新應用到頁面 (含提交前已刷盤的髒頁,冪等操作)
  3. Undo 階段 (Roll Back):掃描未提交事務的 Undo Log,執行反向操作回滾
  4. 完成,實例可用

**關鍵**:只需從 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 核心可靠性機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型觸發時機特點
Sharp Checkpoint正常關閉刷新所有髒頁,LSN 推進到最新
Fuzzy Checkpoint運行時增量刷新部分髒頁,非阻塞