MySQL三大日志(binlog、redo log和undo log)圖文詳解
目錄
- 1.redo log
- redo log概述
- 刷盤時(shí)機(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ī)制
- 刷盤時(shí)機(jī)
- 3.兩階段提交
- 4.undo log
- 5.總結(jié)
- 總結(jié)
1.redo log
redo log概述
redo log
(重做日志)是InnoDB
存儲(chǔ)引擎獨(dú)有的,它讓MySQL
擁有了崩潰恢復(fù)能力。
比如 MySQL
實(shí)例掛了或宕機(jī)了,重啟時(shí),InnoDB
存儲(chǔ)引擎會(huì)使用redo log
恢復(fù)數(shù)據(jù),保證數(shù)據(jù)的持久性與完整性。
MySQL
中數(shù)據(jù)是以頁為單位,你查詢一條記錄,會(huì)從硬盤把一頁的數(shù)據(jù)加載出來,加載出來的數(shù)據(jù)叫數(shù)據(jù)頁,會(huì)放入到 Buffer Pool
中。
后續(xù)的查詢都是先從 Buffer Pool
中找,沒有命中再去硬盤加載,減少硬盤 IO
開銷,提升性能。
更新表數(shù)據(jù)的時(shí)候,也是如此,發(fā)現(xiàn) Buffer Pool
里存在要更新的數(shù)據(jù),就直接在 Buffer Pool
里更新。
然后會(huì)把“在某個(gè)數(shù)據(jù)頁上做了什么修改”記錄到重做日志緩存(redo log buffer
)里,接著刷盤到 redo log
文件里。
刷盤時(shí)機(jī)
InnoDB
存儲(chǔ)引擎為 redo log
的刷盤策略提供了 innodb_flush_log_at_trx_commit
參數(shù),它支持三種策略:
- 0 :設(shè)置為 0 的時(shí)候,表示每次事務(wù)提交時(shí)不進(jìn)行刷盤操作
- 1 :設(shè)置為 1 的時(shí)候,表示每次事務(wù)提交時(shí)都將進(jìn)行刷盤操作 (默認(rèn)值)
- 2 :設(shè)置為 2 的時(shí)候,表示每次事務(wù)提交時(shí)都只把 redo log buffer 內(nèi)容寫入 page cache
另外,InnoDB
存儲(chǔ)引擎有一個(gè)后臺(tái)線程,每隔1
秒,就會(huì)把 redo log buffer
中的內(nèi)容寫到文件系統(tǒng)緩存(page cache
),然后調(diào)用 fsync
刷盤。
也就是說,一個(gè)沒有提交事務(wù)的
redo log
記錄,也可能會(huì)刷盤
