MySQL系列之事務(wù)日志Redo log學(xué)習(xí)筆記
學(xué)習(xí)本博客之前需要儲備知識:
- MySQL體系架構(gòu)
- InnoDB存儲引擎
- MySQL事務(wù)知識
在上篇博客凿试,我們知道了undo log逞敷,繼續(xù)上篇博客,學(xué)習(xí)另外一種重要的InnoDB事務(wù)日志redo log
1盛卡、Redo Log
1.1、什么是Redo log宇弛?
Redo :重做的意思曙痘,undo是撤銷回滾意思
Redo log:被稱之為重做日志,是在數(shù)據(jù)庫發(fā)生意外時(shí)戚篙,進(jìn)行數(shù)據(jù)恢復(fù)五鲫,redo log會備份是事務(wù)執(zhí)行過程中的修改數(shù)據(jù),redo log備份的是事務(wù)過程中最新的數(shù)據(jù)位置
1.2岔擂、Redo log工作原理
前面的學(xué)習(xí)位喂,我們知道undo log是用于回滾的日志記錄浪耘,是屬于邏輯日志,而本博客介紹的redo log是一種物理日志塑崖,只要用于預(yù)防系統(tǒng)冗機(jī)等特殊情況七冲,出現(xiàn)這種情況時(shí),重啟mysql會讀取redo log规婆,從而實(shí)現(xiàn)某些數(shù)據(jù)未寫入磁盤的數(shù)據(jù)寫到磁盤進(jìn)行持久保存
基于上一章博客的圖澜躺,進(jìn)行拓展,對比一下undo log和redo log
- undo log和redo logo都是InnoDB的功能抒蚜,都是事務(wù)日志
- undo log是邏輯日志掘鄙,記錄是操作記錄日志,redo log是物理日志嗡髓,記錄的是新數(shù)據(jù)
- undo log是為了保證事務(wù)原子性而設(shè)計(jì)的操漠,redo log是為了保證事務(wù)持久性設(shè)置的。undo log在InnoDB中用來實(shí)現(xiàn)多版本控制饿这,執(zhí)行rollback操作時(shí)浊伙,undo log可以作為事務(wù)回滾的快照讀參考,而redo log是備份的最新數(shù)據(jù)位置长捧,系統(tǒng)冗機(jī)時(shí)嚣鄙,只要重啟mysql服務(wù),就可以將未持久保存的數(shù)據(jù)持久到磁盤
1.3串结、Redo log寫入機(jī)制
- write point:這個(gè)指針記錄當(dāng)前位置哑子,一邊寫,一邊移動肌割,寫到最后一個(gè)文件末尾后就回到 0 號文件重新覆蓋寫
- check point:這個(gè)指針記錄當(dāng)前要擦除的位置赵抢,也是往后推移并且循環(huán)的,擦除記錄前要把記錄更新到數(shù)據(jù)文件
引用51博客的圖例:圖來自https://blog.51cto.com/wangwei007/2287431
[圖片上傳失敗...(image-f9e1ee-1640159311194)]
redo log寫滿時(shí)候声功,指針回到原點(diǎn)烦却,重新開始覆蓋保存,如果 write pos 追上checkpoint先巴,表示寫滿其爵,這時(shí)候不能再執(zhí)行新的更新,得停下來先擦掉一些記錄伸蚯,把checkpoint推進(jìn)一下節(jié)點(diǎn)
1.4摩渺、Redo log配置參數(shù)
通過命令查看redo log參數(shù):
show variables like '%innodb_log%';
[圖片上傳失敗...(image-c2ff63-1640159311194)]
1.5、Redo數(shù)據(jù)持久策略
【拓展知識】剂邮,每個(gè)InnoDB存儲引擎至少有1個(gè)日志重做文件組(redo file group)摇幻,每個(gè)文件組至少有2個(gè)redo日志文件,默認(rèn)為ib_logfile0
和ib_logfile1
,存儲路徑在${datadir}
Redo Buffer 持久化到 Redo Log 的策略绰姻,通過變量 innodb_flush_log_at_trx_commit
的值來決定
- 0:設(shè)置值為0枉侧,表示Log Buffer中的數(shù)據(jù)不經(jīng)過OS緩存,直接調(diào)用fsync直接刷到磁盤文件保存
- 1:設(shè)置值為1(默認(rèn)值)狂芋,事務(wù)提交后榨馁,會保存到log buffer,接著保存到os buffer緩存帜矾,同時(shí)調(diào)用fsync同步刷到磁盤
- 2:設(shè)置值為2翼虫,數(shù)據(jù)不寫到log buffer,直接緩存到os buffer屡萤,每隔一秒珍剑,調(diào)用fsync刷數(shù)據(jù)到磁盤