redo log與binlog間的破事
點(diǎn)擊下方“IT牧場(chǎng)”,選擇“設(shè)為星標(biāo)”

前言
今天來聊聊InnoDB是如何保證redo log與binlog兩份日志之間的邏輯一致。
兩階段提交
redo log(重做日志)讓InnoDB存儲(chǔ)引擎擁有了崩潰恢復(fù)能力。
binlog(歸檔日志)保證了MySQL集群架構(gòu)的數(shù)據(jù)一致性。
雖然它們都屬于持久化的保證,但是則重點(diǎn)不同。
在執(zhí)行更新語句過程,會(huì)記錄redo log與binlog兩塊日志,以基本的事務(wù)為單位,redo log在事務(wù)執(zhí)行過程中可以不斷寫入,而binlog只有在提交事務(wù)時(shí)才寫入,所以redo log與binlog的寫入時(shí)機(jī)不一樣。

回到正題,redo log與binlog兩份日志之間的邏輯不一致,會(huì)出現(xiàn)什么問題?
我們以update語句為例,假設(shè)id=2的記錄,字段c值是0,把字段c值更新成1,SQL語句為update T set c=1 where id=2。
假設(shè)執(zhí)行過程中寫完redo log日志后,binlog日志寫期間發(fā)生了異常,會(huì)出現(xiàn)什么情況呢?

由于binlog沒寫完就異常,這時(shí)候binlog里面沒有對(duì)應(yīng)的修改記錄。因此,之后用binlog日志恢復(fù)數(shù)據(jù)時(shí),就會(huì)少這一次更新,恢復(fù)出來的這一行c值是0,而原庫因?yàn)?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">redo log日志恢復(fù),這一行c值是1,最終數(shù)據(jù)不一致。

為了解決兩份日志之間的邏輯一致問題,InnoDB存儲(chǔ)引擎使用兩階段提交方案。
原理很簡(jiǎn)單,將redo log的寫入拆成了兩個(gè)步驟prepare和commit,這就是兩階段提交。

使用兩階段提交后,寫入binlog時(shí)發(fā)生異常也不會(huì)有影響,因?yàn)?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">MySQL根據(jù)redo log日志恢復(fù)數(shù)據(jù)時(shí),發(fā)現(xiàn)redo log還處于prepare階段,并且沒有對(duì)應(yīng)binlog日志,就會(huì)回滾該事務(wù)。

再看一個(gè)場(chǎng)景,redo log設(shè)置commit階段發(fā)生異常,那會(huì)不會(huì)回滾事務(wù)呢?

并不會(huì)回滾事務(wù),它會(huì)執(zhí)行上圖框住的邏輯,雖然redo log是處于prepare階段,但是能通過事務(wù)id找到對(duì)應(yīng)的binlog日志,所以MySQL認(rèn)為是完整的,就會(huì)提交事務(wù)恢復(fù)數(shù)據(jù)。
站在巨人的肩膀上
《MySQL實(shí)戰(zhàn)45講》 《從零開始帶你成為MySQL實(shí)戰(zhàn)優(yōu)化高手》 《MySQL技術(shù)Innodb存儲(chǔ)引擎》
MySQL好文推薦
CURD這么多年,你有了解過MySQL的架構(gòu)設(shè)計(jì)嗎? 淺談 MySQL InnoDB 的內(nèi)存組件 聊聊redo log是什么? 不會(huì)吧,不會(huì)吧,還有人不知道 binlog ?
關(guān)于我
阿星是一個(gè)熱愛技術(shù)的 Java 程序猿,公眾號(hào)「程序猿阿星」定期分享有趣有料的精品原創(chuàng)文章!

非常感謝各位小哥哥小姐姐們能看到這里,原創(chuàng)不易,文章有幫助可以關(guān)注、點(diǎn)個(gè)贊、分享與評(píng)論,都是支持(莫要白嫖)!
愿你我都能奔赴在各自想去的路上,我們下篇文章見。
干貨分享
最近將個(gè)人學(xué)習(xí)筆記整理成冊(cè),使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無套路領(lǐng)取!
?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?006:《DDD速成(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)速成)》?007:全部?008:加技術(shù)群討論
加個(gè)關(guān)注不迷路
喜歡就點(diǎn)個(gè)"在看"唄^_^
