問題:請講下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