java面試一日一題:binlog undolog redolog的區別


問題:請講下mysql中binlog、undolog、redolog三種日志的區別

分析:mysql中這三種日志很常見,也是面試中涉及比較多的方面,要理解清楚這三種日志的定位及區別;

回答要點:

主要從以下幾點去考慮

1、三種日志的作用分別是什么;

2、三種日志解決的問題;

3、三種日志分別是什么時間寫入的;

 

bin log、redo log、undo log三種日志屬於不同級別的日志,按照mysql的划分可以分為服務層和引擎層兩大層,bin log是在服務層實現的;redo log、undo log是在引擎層實現的,且是innodb引擎獨有的,主要和事務相關。

bin log

bin log中記錄的是整個mysql數據庫的操作內容,對所有的引擎都適用,包括執行的DDL、DML,可以用來進行數據庫的恢復及復制。bin log有三種形式:statement、row、mixed,statement是基於語句的,也就是執行的sql語句,該種形式的文件比較小,例,update t1 set age='24' where name like '%王%',這樣一條語句,在statement下就會記錄這樣一條sql;row是基於數據行的,會記錄變化的所有數據,一般文件較大。例,update t1 set age='24' where name like '%王%',這條語句,在row的形式下,則會記錄該條sql影響的所有數據記錄;mixed是混合格式,是statement和row的組合;

redo log

redo log中記錄的是要更新的數據,比如一條數據已提交成功,並不會立即同步到磁盤,而是先記錄到redo log中,等待合適的時機再刷盤,為了實現事務的持久性

undo log

undo log中記錄的是當前操作中的相反操作,一條insert語句在undo log中會對應一條delete語句,update語句會在undo log中對應相反的update語句,在事務回滾時會用到undo log,實現事務的原子性,同時會用在MVCC中,undo中會有一條記錄的多個版本,用在快照讀中;

 

上面大體講了三種日志的作用及背景和解決的問題,有個問題一直困擾着我,那就是在執行一條sql時,這三種日志是什么時間寫入的。

首先,一個事務剛開始,為了防止事務提交前回滾,要先寫入undo log,只有寫入了undo log才有可能實現回滾,又由於可能出現回滾所以開始寫入的只有undo log;

其次,在寫入undo log后,要寫入redo log中,這里的redo log指的是redo log buffer,而不是redo log file,至於什么時候redo log buffer中的內容會刷到磁盤mysql提供了一個配置參數innodb_flush_log_at_trx_commit,該參數有0 1 2三種取值,;

最后,寫入了redo log后,事務會處於prepare階段,這時會告訴執行器隨時都可以提交事務,執行器便會生成binlog日志,並寫入磁盤,調用innodb的事務提交接口,進行事務提交,prepare狀態的redo log也會進入commit狀態,根據配置的innodb_flush_log_at_trx_commit的值是否把redo log buffer中的內容刷到磁盤;

 

下面總結了三種日志的寫入順序,請參考,有不當之處歡迎留言,

參考:https://www.cnblogs.com/klvchen/p/10861850.html

https://www.cnblogs.com/klvchen/p/10861850.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM