本章博客主要想解釋以下三個問題:
- 這兩個日誌的作用
- 這兩個日誌的區別
- 一個更新操作的流程
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。其實這個就是兩階段提交,保證兩份日誌邏輯的一致性。