InnoDB文件筆記(二)—— Redo Log

TheheiWorld發表於2019-04-11

接著上篇,現在開始看看各個模組,文件上的內容有點弱, 詳細的可以看看,《MySQL技術內幕(InnoDB儲存引擎)》這本書的第七章!

Redo Log是基於磁碟的資料結構,用來恢復由於未完成事務造成的資料修改。預設情況下,Redo Log在ib_logfile0和ib_logfile1這個兩個檔案中,m預設大小為5MB。事務的執行,會向redo log中記錄相應資料頁的修改。

Redo Log用保證事務的永續性。Redo Log通常是物理日誌,記錄的是資料頁的物理修改。

一、相關引數

  • innodb_log_files_in_group
  • innodb_log_file_size

redo log size = innodb_log_files_in_group * innodb_log_file_size

二、簡介

Redo Log:redo log buffer 、redo log file

Redo Log持久化:redo log buffer -> os buffer -> redo log file

InnoDB記錄了資料檔案的物理修改,並且保證日誌先行,即WAL(write-ahead logging)。

LNS(log sequence number)記錄日誌序號。

Redo Log以順序的方式寫入檔案,寫滿時則回溯到第一個檔案,進行覆蓋。

Redo Log在儲存引擎層產生,是物理格式日誌;bin log在資料庫的上層產生,是邏輯日誌,無論什麼儲存引擎都會產生。

三、Redo Log Flush策略

通過innodb_flush_log_at_trx_commit控制,值有0、1、2,預設為1

  • 0:事務commit時,log Buffer的日誌不會寫入os buffer,而是每秒寫入os buffer,並刷入log file。
  • 1:事務commit時候,log buffer的日誌會寫入os buffer並刷入log file。
  • 2:事務commit時,log buffer的日誌寫入os buffer,然後每秒os buffer輸入log file。

四、Log Block

參考Log Block,這篇文章的圖描述的很清楚。

redo log基於頁儲存,預設大小為16kb,由多個log block組成,一個log block大小為512位元組。

五、Redo Log何時刷入磁碟

  • 發出commit動作時,具體看 Redo Log Flush策略
  • innodb_flush_log_at_timeout控制,預設每一秒一次
  • log buffer使用記憶體超過一半
  • checkpoint

六、LSN(Log Sequence Number)

參考LSN

七、Optimizing InnoDB Redo Logging

讓redo log files足夠大,但不能太大

增加log buffer大小

配置innodb_log_write_ahead_size配置選項,以避免“讀寫”。

兩個參考文章:

相關文章