<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          redo log與binlog間的破事

          共 1484字,需瀏覽 3分鐘

           ·

          2021-08-18 22:45

          點(diǎn)擊下方“IT牧場(chǎng)”,選擇“設(shè)為星標(biāo)”


          前言

          今天來聊聊InnoDB是如何保證redo logbinlog兩份日志之間的邏輯一致。

          兩階段提交

          redo log(重做日志)讓InnoDB存儲(chǔ)引擎擁有了崩潰恢復(fù)能力。

          binlog(歸檔日志)保證了MySQL集群架構(gòu)的數(shù)據(jù)一致性。

          雖然它們都屬于持久化的保證,但是則重點(diǎn)不同。

          在執(zhí)行更新語句過程,會(huì)記錄redo logbinlog兩塊日志,以基本的事務(wù)為單位,redo log在事務(wù)執(zhí)行過程中可以不斷寫入,而binlog只有在提交事務(wù)時(shí)才寫入,所以redo logbinlog的寫入時(shí)機(jī)不一樣。

          回到正題,redo logbinlog兩份日志之間的邏輯不一致,會(huì)出現(xiàn)什么問題?

          我們以update語句為例,假設(shè)id=2的記錄,字段c值是0,把字段c值更新成1SQL語句為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è)步驟preparecommit,這就是兩階段提交

          使用兩階段提交后,寫入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好文推薦

          關(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è)"在看"唄^_^

          瀏覽 98
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日日骚av无码 | 欧美性天天 | 一级特黄BBBBBB视频免费观看 | 欧美性操| 亚洲国产精品99久久 |