日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

聊聊redo log是什么?

發布時間:2025/3/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聊聊redo log是什么? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

說到MySQL,有兩塊日志一定繞不開,一個是InnoDB存儲引擎的redo log(重做日志),另一個是MySQL Servce層的 binlog(歸檔日志)。

只要是數據更新操作,就一定會涉及它們,今天就來聊聊redo log(重做日志)。

redo log

redo log(重做日志)是InnoDB存儲引擎獨有的,它讓MySQL擁有了崩潰恢復能力。

比如MySQL實例掛了或宕機了,重啟時,InnoDB存儲引擎會使用redo log恢復數據,保證數據的持久性與完整性。

上一篇中阿星講過,MySQL中數據是以頁為單位,你查詢一條記錄,會從硬盤把一頁的數據加載出來,加載出來的數據叫數據頁,會放入到Buffer Pool中。

后續的查詢都是先從Buffer Pool中找,沒有命中再去硬盤加載,減少硬盤IO開銷,提升性能。

更新表數據的時候,也是如此,發現Buffer Pool里存在要更新的數據,就直接在Buffer Pool里更新。

然后會把“在某個數據頁上做了什么修改”記錄到重做日志緩存(redo log buffer)里,接著刷盤到redo log文件里。

理想情況,事務一提交就會進行刷盤操作,但實際上,刷盤的時機是根據策略來進行的。

小貼士:每條redo記錄由“表空間號+數據頁號+偏移量+修改數據長度+具體修改的數據”組成

?

刷盤時機

InnoDB存儲引擎為redo log的刷盤策略提供了innodb_flush_log_at_trx_commit參數,它支持三種策略

  • 設置為0的時候,表示每次事務提交時不進行刷盤操作

  • 設置為1的時候,表示每次事務提交時都將進行刷盤操作(默認值)

  • 設置為2的時候,表示每次事務提交時都只把redo log buffer內容寫入page cache

另外InnoDB存儲引擎有一個后臺線程,每隔1秒,就會把redo log buffer中的內容寫到文件系統緩存(page cache),然后調用fsync刷盤。

也就是說,一個沒有提交事務的redo log記錄,也可能會刷盤。

為什么呢?

因為在事務執行過程redo log記錄是會寫入redo log buffer中,這些redo log記錄會被后臺線程刷盤。

除了后臺線程每秒1次的輪詢操作,還有一種情況,當redo log buffer占用的空間即將達到innodb_log_buffer_size一半的時候,后臺線程會主動刷盤。

下面是不同刷盤策略的流程圖

innodb_flush_log_at_trx_commit=0

為0時,如果MySQL掛了或宕機可能會有1秒數據的丟失。

innodb_flush_log_at_trx_commit=1

為1時, 只要事務提交成功,redo log記錄就 一定在硬盤里,不會有任何數據丟失。

如果事務執行期間MySQL掛了或宕機,這部分日志丟了,但是事務并沒有提交,所以日志丟了也不會有損失。

innodb_flush_log_at_trx_commit=2

為2時, 只要事務提交成功,redo log buffer中的內容只寫入文件系統緩存(page cache)。

如果僅僅只是MySQL掛了不會有任何數據丟失,但是宕機可能會有1秒數據的丟失。

?

日志文件組

硬盤上存儲的redo log日志文件不只一個,而是以一個日志文件組的形式出現的,每個的redo日志文件大小都是一樣的。

比如可以配置為一組4個文件,每個文件的大小是1GB,整個redo log日志文件組可以記錄4G的內容。

它采用的是環形數組形式,從頭開始寫,寫到末尾又回到頭循環寫,如下圖所示。

在個日志文件組中還有兩個重要的屬性,分別是write pos、checkpoint

  • write pos是當前記錄的位置,一邊寫一邊后移

  • checkpoint是當前要擦除的位置,也是往后推移

每次刷盤redo log記錄到日志文件組中,write pos位置就會后移更新。

每次MySQL加載日志文件組恢復數據時,會清空加載過的redo log記錄,并把checkpoint后移更新。

write pos和checkpoint之間的還空著的部分可以用來寫入新的redo log記錄。

如果write pos追上checkpoint,表示日志文件組滿了,這時候不能再寫入新的redo log記錄,MySQL得停下來,清空一些記錄,把checkpoint推進一下。

本文到此就結束了,下篇會聊聊binlog(歸檔日志)。

?

小結

相信大家都知道redo log的作用和它的刷盤時機、存儲形式。

現在我們來思考一問題,只要每次把修改后的數據頁直接刷盤不就好了,還有redo log什么事。

它們不都是刷盤么?差別在哪里?

1?Byte?=?8bit 1?KB?=?1024?Byte 1?MB?=?1024?KB 1?GB?=?1024?MB 1?TB?=?1024?GB

實際上,數據頁大小是16KB,刷盤比較耗時,可能就修改了數據頁里的幾Byte數據,有必要把完整的數據頁刷盤嗎?

而且數據頁刷盤是隨機寫,因為一個數據頁對應的位置可能在硬盤文件的隨機位置,所以性能是很差。

如果是寫redo log,一行記錄可能就占幾十Byte,只包含表空間號、數據頁號、磁盤文件偏移 量、更新值,再加上是順序寫,所以刷盤速度很快。

所以用redo log形式記錄修改內容,性能會遠遠超過刷數據頁的方式,這也讓數據庫的并發能力更強。

其實內存的數據頁在一定時機也會刷盤,我們把這稱為頁合并,講Buffer Pool的時候會對這塊細說

站在巨人的肩膀上

  • 《MySQL實戰45講》

  • 《從零開始帶你成為MySQL實戰優化高手》

  • 《MySQL是怎樣運行的:從根兒上理解MySQL》

  • 《MySQL技術Innodb存儲引擎》

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的聊聊redo log是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。