接著上篇,現在開始看看各個模組,文件上的內容有點弱, 詳細的可以看看,《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配置選項,以避免“讀寫”。
兩個參考文章: