mysql的binlog與redo log詳解

本章博客主要想解釋以下三個問題:

  • 這兩個日誌的作用
  • 這兩個日誌的區別
  • 一個更新操作的流程

mysql是由server層 + 存儲引擎層 組成。我們的主角redo log(重做日誌)和 binlog(歸檔日誌)分別屬於不同的模塊。redo log是 InnoDB 引擎獨有,其他存儲引擎是沒有的。binlog則屬於server層的能力。

實現下面的一條更新sql,流程是怎樣的呢?

update t_students set fname = 'tom' where fid = 1001;

redo log 和 binlog作用

  • redo log的作用很明顯,不用每次都去操作磁盤,可以先暫時記錄在redo log中,等到機器空閒時在批量的更新到磁盤。
  • binlog的存在,是因爲並不是所有的存儲引擎都有redo log,所以server層自己也有一套日誌記錄,叫做歸檔日誌

redo log 和 binlog的區別

  • redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 層實現的,所有引擎都可以使用。
  • redo log 是物理日誌,記錄的是“在某個數據頁上做了什麼修改”;binlog 是邏輯日誌,記錄的是這個語句的原始邏輯,比如“給 ID=2 這一行的 c 字段加 1 ”。
  • redo log 是循環寫的,空間固定會用完;binlog 是可以追加寫入的。“追加寫”是指 binlog 文件寫到一定大小後會切換到下一個,並不會覆蓋以前的日誌。

二階段提交

  • 可以看到流程圖中,先記錄redo log,且狀態爲prepare; 然後記錄binlog; 最後再把redo log狀態改爲 commit。其實這個就是兩階段提交,保證兩份日誌邏輯的一致性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章