MySQL系列之事務日志Redo log學習筆記
學習本博客之前需要儲備知識:
- MySQL體系架構
- InnoDB存儲引擎
- MySQL事務知識
在上篇博客,我們知道了undo log,繼續(xù)上篇博客,學習另外一種重要的InnoDB事務日志redo log
1、Redo Log
1.1、什么是Redo log?
Redo :重做的意思,undo是撤銷回滾意思
Redo log:被稱之為重做日志,是在數據庫發(fā)生意外時,進行數據恢復,redo log會備份是事務執(zhí)行過程中的修改數據,redo log備份的是事務過程中最新的數據位置
1.2、Redo log工作原理
前面的學習,我們知道undo log是用于回滾的日志記錄,是屬于邏輯日志,而本博客介紹的redo log是一種物理日志,只要用于預防系統(tǒng)冗機等特殊情況,出現(xiàn)這種情況時,重啟mysql會讀取redo log,從而實現(xiàn)某些數據未寫入磁盤的數據寫到磁盤進行持久保存
基于上一章博客的圖,進行拓展,對比一下undo log和redo log
- undo log和redo logo都是InnoDB的功能,都是事務日志
- undo log是邏輯日志,記錄是操作記錄日志,redo log是物理日志,記錄的是新數據
- undo log是為了保證事務原子性而設計的,redo log是為了保證事務持久性設置的。undo log在InnoDB中用來實現(xiàn)多版本控制,執(zhí)行rollback操作時,undo log可以作為事務回滾的快照讀參考,而redo log是備份的最新數據位置,系統(tǒng)冗機時,只要重啟mysql服務,就可以將未持久保存的數據持久到磁盤
1.3、Redo log寫入機制
- write point:這個指針記錄當前位置,一邊寫,一邊移動,寫到最后一個文件末尾后就回到 0 號文件重新覆蓋寫
- check point:這個指針記錄當前要擦除的位置,也是往后推移并且循環(huán)的,擦除記錄前要把記錄更新到數據文件
引用51博客的圖例:圖來自https://blog.51cto.com/wangwei007/2287431
[圖片上傳失敗...(image-f9e1ee-1640159311194)]
redo log寫滿時候,指針回到原點,重新開始覆蓋保存,如果 write pos 追上checkpoint,表示寫滿,這時候不能再執(zhí)行新的更新,得停下來先擦掉一些記錄,把checkpoint推進一下節(jié)點
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刷數據到磁盤