問題:請講下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中的內容刷到磁碟;
本文未完,待續