mysql日志系統(tǒng)redo log和bin log介紹
首先,我們先來看看一次查詢/更新語句流程圖
本文會將重點(diǎn)放在執(zhí)行器<->存儲引擎之間的交互。
mysql不是每次數(shù)據(jù)更改都立刻寫到磁盤,而是會先將修改后的結(jié)果暫存在內(nèi)存中,當(dāng)一段時(shí)間后,再一次性將多個(gè)修改寫到磁盤上,減少磁盤io成本,同時(shí)提高操作速度。
mysql通過WAL(write-ahead logging)技術(shù)保證事務(wù):
在同一個(gè)事務(wù)中,每當(dāng)數(shù)據(jù)庫進(jìn)行修改數(shù)據(jù)操作時(shí),將修改結(jié)果更新到內(nèi)存后,會在redo log添加一行記錄記錄“需要在哪個(gè)數(shù)據(jù)頁上做什么修改”,并將該記錄狀態(tài)置為prepare,等到commit提交事務(wù)后,會將此次事務(wù)中在redo log添加的記錄的狀態(tài)都置為commit狀態(tài),之后將修改落盤時(shí),會將redo log中狀態(tài)為commit的記錄的修改都寫入磁盤。
過程如下圖:
redo log記錄方式:
redolog的大小是固定的,在mysql中可以通過修改配置參數(shù)innodb_log_files_in_group和innodb_log_file_size配置日志文件數(shù)量和每個(gè)日志文件大小,redolog采用循環(huán)寫的方式記錄,當(dāng)寫到結(jié)尾時(shí),會回到開頭循環(huán)寫日志。
如下redolog記錄方式圖:
write pos表示日志當(dāng)前記錄的位置,當(dāng)ib_logfile_4寫滿后,會從ib_logfile_1從頭開始記錄;check point表示將日志記錄的修改寫進(jìn)磁盤,完成數(shù)據(jù)落盤,數(shù)據(jù)落盤后checkpoint會將日志上的相關(guān)記錄擦除掉,即write pos->checkpoint之間的部分是redo log空著的部分,用于記錄新的記錄,checkpoint->write pos之間是redo log待落盤的數(shù)據(jù)修改記錄。當(dāng)writepos追上checkpoint時(shí),得先停下記錄,先推動checkpoint向前移動,空出位置記錄新的日志。
有了redo log,當(dāng)數(shù)據(jù)庫發(fā)生宕機(jī)重啟后,可通過redo log將未落盤的數(shù)據(jù)恢復(fù),即保證已經(jīng)提交的事務(wù)記錄不會丟失。有了redo log,為啥還需要binlog呢?
- 1、redo log的大小是固定的,日志上的記錄修改落盤后,日志會被覆蓋掉,無法用于數(shù)據(jù)回滾/數(shù)據(jù)恢復(fù)等操作。
- 2、redo log是innodb引擎層實(shí)現(xiàn)的,并不是所有引擎都有。
基于以上,binlog必不可少
- 1、binlog是server層實(shí)現(xiàn)的,意味著所有引擎都可以使用binlog日志
- 2、binlog通過追加的方式寫入的,可通過配置參數(shù)max_binlog_size設(shè)置每個(gè)binlog文件的大小,當(dāng)文件大小大于給定值后,日志會發(fā)生滾動,之后的日志記錄到新的文件上。
- 3、binlog有兩種記錄模式,statement格式的話是記sql語句, row格式會記錄行的內(nèi)容,記兩條,更新前和更新后都有。
binlog和redo log必須保持一致,不允許出現(xiàn)binlog有記錄但redolog沒有的情況,反之亦然。之前說過在一個(gè)事務(wù)中,redolog有prepare和commit兩種狀態(tài),所以,在redolog狀態(tài)為prepare時(shí)記錄binlog可保證兩日志的記錄一致,下圖列出各種情況來說明。
現(xiàn)在我們再來看看整個(gè)完整的流程圖:
相關(guān)參數(shù)設(shè)置建議:
- 1、innodb_flush_log_at_trx_commit:設(shè)置為1,表示每次事務(wù)的redolog都直接持久化到磁盤(注意是這里指的是redolog日志本身落盤),保證mysql重啟后數(shù)據(jù)不丟失。
- 2、sync_binlog: 設(shè)置為1,表示每次事務(wù)的binlog都直接持久化到磁盤(注意是這里指的是binlog日志本身落盤),保證mysql重啟后binlog記錄是完整的。
到此這篇關(guān)于mysql日志系統(tǒng)redo log和bin log介紹的文章就介紹到這了,更多相關(guān)mysql日志系統(tǒng) 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入理解MySQL重做日志 redo log
- mysql日志文件之undo?log和redo?log
- MySQL Redo與Undo日志詳細(xì)解析
- MySQL三大日志(binlog、redo?log和undo?log)圖文詳解
- mysql中的事務(wù)重做日志(redo log)與回滾日志(undo log)
- 詳解MySQL事務(wù)日志redo log
- 真的了解MySQL中的binlog和redolog區(qū)別
- mysql中 redo日志詳解
- MySQL三大日志之binlog、redoLog、undoLog詳細(xì)講解
- MySQL8.0設(shè)置redo緩存大小的實(shí)現(xiàn)
相關(guān)文章
mysql語句實(shí)現(xiàn)簡單的增、刪、改、查操作示例
這篇文章主要介紹了mysql語句實(shí)現(xiàn)簡單的增、刪、改、查操作,結(jié)合實(shí)例形式分析總結(jié)了mysql語句實(shí)現(xiàn)數(shù)據(jù)庫與表的創(chuàng)建、刪除以及增刪改查等常見操作技巧,需要的朋友可以參考下2019-05-05MYSQL出現(xiàn)" Client does not support authentication "的
MYSQL出現(xiàn)" Client does not support authentication "的解決方法...2007-06-06mysql運(yùn)行net start mysql報(bào)服務(wù)名無效的解決辦法
這篇文章主要為大家詳細(xì)介紹了mysql運(yùn)行net start mysql報(bào)服務(wù)名無效的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Mysql查詢語句執(zhí)行過程及運(yùn)行原理分析
這篇文章主要介紹了Mysql查詢語句執(zhí)行過程及運(yùn)行原理分析,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08