MySQL - 日志 - redo log

概述

redo log是InnoDB引擎特有的物理日志。redo log記錄了數(shù)據(jù)被修改后的值,確保事務的持久性。
防止在發(fā)生故障的時間點,尚有臟頁未寫入磁盤,在重啟mysql服務的時候,根據(jù)redo log進行重做,從而達到事務的持久性這一特性。

redo log 物理文件

InnoDB 的 redo log 是固定大小的,
比如可以配置為一組 4 個文件: 0 ~ 3,每個文件的大小是 1GB。
從頭開始寫到尾后會開始擦除頭部進行循環(huán)寫。 如圖:


111.png

可以通過配置參數(shù)

  innodb_log_files_in_group 日志文件數(shù)量
  innodb_log_file_size 文件大小

redo log 寫入包括兩部分:

  • 內(nèi)存日志緩沖(redo log buffer)
    基于內(nèi)存,性能快,但易丟失。
  • 重做日志文件(redo log file)
    基于磁盤,將文件寫入磁盤進行持久化(由于redo log file是循環(huán)擦除寫,會導致歷史記錄丟失,這里涉及到二階段提交到binlog進行持久化)。

redo log寫入機制

  1. 事務執(zhí)行時是先寫入redo log buffer (必須)
  2. write 寫到文件系統(tǒng)的 page cache (可選)
  3. fsync 持久化到磁盤 (可選)

可以通過參數(shù)對redolog寫入策略進行配置:

# 配置文件:mysql.ini
innodb_flush_log_at_trx_commit = 1

設為0時,表示每次事務提交時都只是把 redo log 留在 redo log buffer 中 ;(不主動刷到磁盤)
設為1時,表示每次事務提交時都將 redo log 直接持久化到磁盤;
設為2時,表示每次事務提交都只是吧redolog寫到page cache
注:InnoDB 后臺線程每1 秒就會把 redo log buffer 中的日志調(diào)用 write 寫到文件系統(tǒng)的 page cache然后調(diào)用 fsync 持久化到磁盤。一個沒有提交的事務的 redo log,也是可能已經(jīng)持久化到磁盤的。

另外兩種場景也會觸發(fā)未提交事務的redo log 寫入磁盤:
  • redo log buffer 占用的空間即將達到 innodb_log_buffer_size 一半時。
    注:由于事務并沒有提交,所以寫盤動作只是 write,未調(diào)用 fsync,也就是只留在了文件系統(tǒng)的 page cache。
  • innodb_flush_log_at_trx_commit = 1 情況下
    多事務并行,當有事務先提交時,其他事務還停留在redo log buffer 也會提前觸發(fā)寫磁盤

二階段提交

222.png

階段一:寫入redo log完成時,階段處于prepare
階段二:binlog 也寫入成功,階段才處于commit

崩潰恢復時的判斷規(guī)則:

  • 如果 redo log 里面的事務是完整的,也就是已經(jīng)有了 commit 標識,則直接提交;
  • 如果 redo log 里面的事務只有完整的 prepare,則判斷對應的事務 binlog 是否存在并完整:
    是 提交事務 , 否 回滾事務。

redo log 和 binlog 通過共同數(shù)據(jù)字段:XID關(guān)聯(lián)

崩潰恢復時會按順序掃描 redo log:

  • 如果碰到既有 prepare、又有 commit 的 redo log,就直接提交;
  • 如果碰到只有 parepare、而沒有 commit 的 redo log,就拿著 XID 去 binlog 找對應的事務。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 之前我們了解了一條查詢語句的執(zhí)行流程,并介紹了執(zhí)行過程中涉及的處理模塊。一條查詢語句的執(zhí)行過程一般是經(jīng)過連接器、分...
    武培軒閱讀 735評論 1 7
  • 系列MySQL實戰(zhàn)45講閱讀筆記-MySQL入門MySQL實戰(zhàn)45講閱讀筆記-日志MySQL實戰(zhàn)45講閱讀筆記-鎖...
    Mhhhhhhy閱讀 1,534評論 3 4
  • 假如有一天你需要換一張臉,你會換上誰的臉? 這個問題對整容族來說沒有難度,可我想來想去還是喜歡自己的臉。 于是我給...
    樂天8226閱讀 352評論 1 3
  • 這會兒算是趕著教師節(jié)的尾巴簡單聊點關(guān)于教與學的想法。學生和老師是相互依存不可分割的整體,而我們平時說的教師...
    筱手真黑閱讀 143評論 0 0
  • 從二號晚上開完年會回到家以后一直處于忙碌的一個狀態(tài)中……以至于沒有每天去記錄我的一個總結(jié)!總覺得時間過得太快,很多...
    愛善天使蓮子閱讀 461評論 0 0

友情鏈接更多精彩內(nèi)容