對於任何一位使用mysql的開發人員來說,稍微有點深入的應該都會接觸到這兩個名詞。
區別:
1.redo log只有innodb引擎才有。
2.redo log關鍵點是先寫日誌,在寫磁碟,等到某個不忙的時間段再統一寫入磁碟。並且有大小如果超過了就暫停寫入日誌並擦除一些記錄,但在擦除之前會寫入檔案,這樣即使伺服器異常重啟,也不會丟失提交的記錄。而binlog是一種日誌歸檔,它記錄了你的“邏輯操作”,例如會記錄 “你在某個點更新了什麼資料”,binlog是用來資料恢復的重要手段。
3.redo log是引擎層面的產物;binlog是mysql的server層的產物,所以引擎都可以使用。
4.redo log是迴圈寫的,空間固定會用完。而binlog是追加寫入的,在寫滿一個日誌檔案後會建立一個新的檔案繼續寫入。
對於一個普通的更新操作,可以從以下過程看看如何執行的,例如:
update user set sex=1 where id=2
1、首先SQL的該有的驗證,許可權驗證、詞法解析、語法驗證、優化器都會走。
當優化器執行完後,判斷id是主鍵,於是去索引樹找到這一行。如果這條資料結果在記憶體中,就直接返回,否則需要從磁碟讀入記憶體再返回。
2、執行器拿到這行資料的值,給設定為1,再呼叫引擎的介面寫入這行資料。引擎將這行新資料更新到記憶體中,同時將這次的操作記錄儲存在redo log中,此時redo log處於預處理狀態。
3、 執行器將這次的改動存到磁碟裡的binlog。
4、執行器呼叫引擎的提交事務介面,並把redo log的狀態改為commit,更新完成。
這裡需要記住redo log是innodb引擎的,binlog是mysql的server層的,這樣就容易理解多了。
關於binlog,可以看看這篇部落格 www.cnblogs.com/Presley-lpc/p/9619...
本作品採用《CC 協議》,轉載必須註明作者和本文連結