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_logfile0
和ib_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刷數據到磁盤