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

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

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

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

網(wǎng)公網(wǎng)安備