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.總結(jié)
- 總結(jié)
1.redo log
redo log概述
redo log
(重做日志)是InnoDB
存儲引擎獨有的,它讓MySQL
擁有了崩潰恢復(fù)能力。
比如 MySQL
實例掛了或宕機了,重啟時,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
文件里。
刷盤時機
InnoDB
存儲引擎為 redo log
的刷盤策略提供了 innodb_flush_log_at_trx_commit
參數(shù),它支持三種策略:
- 0 :設(shè)置為 0 的時候,表示每次事務(wù)提交時不進行刷盤操作
- 1 :設(shè)置為 1 的時候,表示每次事務(wù)提交時都將進行刷盤操作 (默認(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
記錄,也可能會刷盤
