MySQL系列之事務日誌Redo log學習筆記

MySQL系列之事務日誌Redo log學習筆記

學習本博客之前需要儲備知識:

  • MySQL體系架構
  • InnoDB存儲引擎
  • MySQL事務知識

上篇博客,我們知道了undo log,繼續上篇博客,學習另外一種重要的InnoDB事務日誌redo log

1、Redo Log

1.1、什麼是Redo log?

Redo :重做的意思,undo是撤銷回滾意思
Redo log:被稱之爲重做日誌,是在數據庫發生意外時,進行數據恢復,redo log會備份是事務執行過程中的修改數據,redo log備份的是事務過程中最新的數據位置

1.2、Redo log工作原理

前面的學習,我們知道undo log是用於回滾的日誌記錄,是屬於邏輯日誌,而本博客介紹的redo log是一種物理日誌,只要用於預防系統冗機等特殊情況,出現這種情況時,重啓mysql會讀取redo log,從而實現某些數據未寫入磁盤的數據寫到磁盤進行持久保存

基於上一章博客的圖,進行拓展,對比一下undo log和redo log

  • undo log和redo logo都是InnoDB的功能,都是事務日誌
  • undo log是邏輯日誌,記錄是操作記錄日誌,redo log是物理日誌,記錄的是新數據
  • undo log是爲了保證事務原子性而設計的,redo log是爲了保證事務持久性設置的。undo log在InnoDB中用來實現多版本控制,執行rollback操作時,undo log可以作爲事務回滾的快照讀參考,而redo log是備份的最新數據位置,系統冗機時,只要重啓mysql服務,就可以將未持久保存的數據持久到磁盤

1.3、Redo log寫入機制

  • write point:這個指針記錄當前位置,一邊寫,一邊移動,寫到最後一個文件末尾後就回到 0 號文件重新覆蓋寫
  • check point:這個指針記錄當前要擦除的位置,也是往後推移並且循環的,擦除記錄前要把記錄更新到數據文件

引用51博客的圖例:圖來自https://blog.51cto.com/wangwei007/2287431
[圖片上傳失敗...(image-f9e1ee-1640159311194)]

redo log寫滿時候,指針回到原點,重新開始覆蓋保存,如果 write pos 追上checkpoint,表示寫滿,這時候不能再執行新的更新,得停下來先擦掉一些記錄,把checkpoint推進一下節點

1.4、Redo log配置參數

通過命令查看redo log參數:

show variables like '%innodb_log%';

[圖片上傳失敗...(image-c2ff63-1640159311194)]

1.5、Redo數據持久策略

【拓展知識】,每個InnoDB存儲引擎至少有1個日誌重做文件組(redo file group),每個文件組至少有2個redo日誌文件,默認爲ib_logfile0ib_logfile1,存儲路徑在${datadir}

Redo Buffer 持久化到 Redo Log 的策略,通過變量 innodb_flush_log_at_trx_commit 的值來決定

  • 0:設置值爲0,表示Log Buffer中的數據不經過OS緩存,直接調用fsync直接刷到磁盤文件保存
  • 1:設置值爲1(默認值),事務提交後,會保存到log buffer,接着保存到os buffer緩存,同時調用fsync同步刷到磁盤
  • 2:設置值爲2,數據不寫到log buffer,直接緩存到os buffer,每隔一秒,調用fsync刷數據到磁盤

附錄:參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章