您好,登錄后才能下訂單哦!
這篇文章主要介紹了MySQL日志之redo log和binlog的區別是什么,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
redo log和binlog的區別
redo log
在MySQL中,如果你要更新一條語句,需要帶更新條件,比如update T set name = ‘god-jiang’ where id=6,一般都是先查詢到id=6的語句,然后再進行更新操作。
如果更新的數量是100條,1000條甚至10000條的時候,每一次更新都需要寫到磁盤上。然后磁盤也要找到對應的記錄,然后再更新,整個過程IO成本、查找成本太大,為了解決這個問題,MySQL的設計者采用了WAL技術來解決。WAL全稱是Write Ahead Logging,意思就是先寫日志,再寫磁盤。
具體操作:當有一條記錄需要更新的時候,InnoDB引擎會先把記錄寫到redo log中,并更新內存,這個時候更新就算完成了。同時,InnoDB引擎會在適當的時候(系統空閑時),將這個操作記錄更新到磁盤中,這個更新往往是在系統比較空閑的時候。
但是redo log的大小是固定的,不可能一直無限寫,讓我們看下MySQL怎么做到的吧。
write pos是當前記錄的位置,一邊寫一邊往后移動。check point是當前要擦除的位置,也是往后移動并且循環的,擦除記錄之前要把記錄更新到數據文件中。
write pos與check point之間綠色的部分表示可以記錄新的操作。如果write pos追上了check point,表示redo log滿了,這個時候就不能繼續執行新的操作,需要停下擦除一些記錄,并且把check point往后推進。
有了redo log,InnoDB可以保證即使數據庫發現異常重啟了,也不會丟失之前提交的事務,這個能力也被稱為crash-safe。
以上就是redo log的介紹,看完了之后,你可以試著去問一下你公司的DBA同事,MySQL是否可以恢復到半個月內任意一秒的狀態,得到的答案肯定是可以的,這都要歸功于redo log的功勞。
binlog
從MySQL整體來看,其實分為兩層,一層是Server層,一層是存儲引擎層。上面聊到的redo log就是屬于InnoDB引擎特有的日志,而binlog是屬于Server層的日志,也稱為歸檔日志。
redo log和binlog的區別
redo log是InnoDB引擎特有的;binlog是MySQL的Server層實現的,所有引擎都可以使用
redo log是物理日志,記錄的是“在XXX數據頁上做了XXX修改”;binlog是邏輯日志,記錄的是原始邏輯,其記錄是對應的SQL語句
redo log是循環寫的,空間一定會用完,需要write pos和check point搭配;binlog是追加寫,寫到一定大小會切換到下一個,并不會覆蓋以前的日志
通過簡單的更新語句演示執行器和InnoDB引擎的內部流程
update T set name = 'god-jiang' where id = 6
通過執行器從InnoDB引擎取出id=6的記錄,然后加載到內存中
執行器拿到引擎返回的結果,把name修改為’god-jiang’,再重新調用存儲引擎的接口寫入新數據
引擎將新數據更新到內存中,同時將這個更新操作寫到redo log中,此時redo log處于prepare狀態
執行器生成這個操作的binlog,并把binlog寫到磁盤中
執行器調用引擎提交事務的接口,并且把剛剛寫入的redo log改為commit狀態,更新完成
對應的流程圖
最后為什么寫入redo log會處于prepare狀態,然后寫入binlog還要變成commit狀態?其實這個過程就叫做“兩階段提交”。
兩階段提交
其實redo log和binlog都可以用于表示事務的提交的狀態,而兩階段提交就是讓這兩個狀態保持邏輯上的一致。
舉例子:update T set name = ‘god-jiang’ where id = 6沒有兩階段提交會發生什么?
先寫redo log后寫binlog。假設寫完了redo log,binlog還沒有寫完,這個時候MySQL異常重啟。因為redo log寫完了,恢復系統的時候name=‘god-jiang’。但是binlog沒有寫完,所以binlog沒有記錄這條語句,這個時候用binlog恢復數據的時候,恢復出來的name就是原來值,與redo log不同。
同理可得,先寫binlog后寫redo log也會發現兩個日志恢復的數據不同。這個不一致會導致線上出現主從不一致的情況。
總結
redo log可以保存crash-safe能力,可以保證MySQL異常重啟數據不丟失
binlog可以記錄對應的SQL語句,也可以保證MySQL異常重啟數據不丟失
提交事務的兩階段提交,可以維持數據邏輯一致性
感謝你能夠認真閱讀完這篇文章,希望小編分享的“MySQL日志之redo log和binlog的區別是什么”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。