MySQL三大日志(binlog、redo log和undo log)圖文詳解
目錄
- 1.redo log
- redo log概述
- 刷盤時機
- innodb_flush_log_at_trx_commit=0
- innodb_flush_log_at_trx_commit=1
- innodb_flush_log_at_trx_commit=2
- 日志文件組
- 2.binlog binlog
- 概述
- 記錄格式
- 寫入機制
- 刷盤時機
- 3.兩階段提交
- 4.undo log
- 5.總結
- 總結
1.redo log
redo log概述
redo log(重做日志)是InnoDB存儲引擎獨有的,它讓MySQL擁有了崩潰恢復能力。
比如 MySQL 實例掛了或宕機了,重啟時,InnoDB存儲引擎會使用redo log恢復數(shù)據,保證數(shù)據的持久性與完整性。

MySQL 中數(shù)據是以頁為單位,你查詢一條記錄,會從硬盤把一頁的數(shù)據加載出來,加載出來的數(shù)據叫數(shù)據頁,會放入到 Buffer Pool 中。
后續(xù)的查詢都是先從 Buffer Pool 中找,沒有命中再去硬盤加載,減少硬盤 IO 開銷,提升性能。
更新表數(shù)據的時候,也是如此,發(fā)現(xiàn) Buffer Pool 里存在要更新的數(shù)據,就直接在 Buffer Pool 里更新。
然后會把“在某個數(shù)據頁上做了什么修改”記錄到重做日志緩存(redo log buffer)里,接著刷盤到 redo log 文件里。

刷盤時機
InnoDB 存儲引擎為 redo log 的刷盤策略提供了 innodb_flush_log_at_trx_commit 參數(shù),它支持三種策略:
- 0 :設置為 0 的時候,表示每次事務提交時不進行刷盤操作
- 1 :設置為 1 的時候,表示每次事務提交時都將進行刷盤操作 (默認值)
- 2 :設置為 2 的時候,表示每次事務提交時都只把 redo log buffer 內容寫入 page cache
另外,InnoDB 存儲引擎有一個后臺線程,每隔1 秒,就會把 redo log buffer 中的內容寫到文件系統(tǒng)緩存(page cache),然后調用 fsync 刷盤。

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

網公網安備