久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL日志之redo log和binlog的區別是什么

133次閱讀
沒有評論

共計 2124 個字符,預計需要花費 6 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章主要介紹了 MySQL 日志之 redo log 和 binlog 的區別是什么,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

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 怎么做到的吧。
MySQL 日志之 redo log 和 binlog 的區別是什么

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 狀態,更新完成

對應的流程圖
MySQL 日志之 redo log 和 binlog 的區別是什么

最后為什么寫入 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 異常重啟數據不丟失

提交事務的兩階段提交,可以維持數據邏輯一致性

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“MySQL 日志之 redo log 和 binlog 的區別是什么”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計2124字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 金沙县| 临颍县| 桃江县| 山阳县| 常山县| 内乡县| 肇东市| 亳州市| 突泉县| 新绛县| 轮台县| 青川县| 秦皇岛市| 昌平区| 苏尼特左旗| 进贤县| 乌兰察布市| 怀安县| 夏邑县| 太谷县| 弋阳县| 岑溪市| 四子王旗| 南漳县| 绥阳县| 达拉特旗| 孟州市| 宝鸡市| 海原县| 巴林左旗| 景德镇市| 江阴市| 宁国市| 兰坪| 铁岭县| 新郑市| 尤溪县| 余姚市| 黔西| 呈贡县| 新建县|