1. 程式人生 > 其它 >MySQL Redo Log / Undo Log / BinLog

MySQL Redo Log / Undo Log / BinLog

Binlog
binlog是用於記錄資料庫執行的寫入操作(不包括查詢),以二進位制日誌的形式儲存在磁碟中。binlog是mysql的邏輯日誌,並且由server層進行記錄,使用任何儲存引擎都會記錄mysql binlog日誌。

邏輯日誌:可以理解為記錄的就是SQL語句。
物理日誌:mysql資料最終是儲存在資料頁中,物理日誌記錄的是資料頁的變更。

binlog是通過追加方式寫入,可以通過max_binlog_size引數設定每個binlog檔案的大小,當檔案達到指定給定值時,會生成新的檔案。

Binlog使用場景:
1.主從複製:在master端開啟binlog,然後將binlog推送給slave端,slave端重放binlog,從而達到資料一致性。

2.資料恢復:通過mysqlbinlog恢復資料

Binlog刷盤機制
對於innodb儲存引擎,只有事務在提交時才會記錄binlog,此時記錄還在記憶體中,mysql通過sync_binlog引數控制binlog的刷盤時機,取值是0-N
1.sync_binlog=0 不去強制要求,由系統自行判斷何時寫入磁碟

2.sync_binlog=1 每次commit時候都要寫入磁碟

3.sync_binlog=N 每N個事務,才會將binlog寫入磁碟

Binlog日誌格式
binlog日誌格式有三種:分別為:
1.STATEMENT

2.ROW

3.MIXED

STATEMENT:基於SQL語句複製( statement-based replication, SBR ),每一條修改資料的SQL語句記錄到binlog中。
1.優點:不需要記錄每一行的變化,減少了binlog日誌數量,節約了IO,從而提高了效能。

2.缺點:在某些情況下,會導致主從資料不一致,比如執行sysdate(),sleep()等

ROW:基於行的複製(row-based replication, RBR),不記錄每條SQL的上下文資訊,僅需記錄哪條資料被修改。
1.優點:不會出現某些特定情況下的儲存過程、函式(function),觸發器(trigger)的呼叫和觸發無法被正確複製的問題。

2.缺點:會產生大量的日誌,尤其是alter table操作。

MIXED:基於STATEMENT 和 ROW 兩種模式的混合(mixed-based replication, MBR),一般的複製使用STATEMENT模式儲存binlog,對於STATEMENT無法複製的使用ROW模式儲存binlog。

REDO LOG
mysql 事務四大特性中有一個是永續性,只要事務提交成功,那麼對資料做的修改就被永久儲存下來,不可能因為其他原因恢復到原來的狀態。

redo log 包括兩部分:一個是記憶體中的快取日誌(redo log buffer),另一個是磁碟上的日誌檔案(redo logfile)
mysql每執行一條DML語句,先將記錄寫入redo log buffer,後續某個時間點再一次性的將多個操作記錄寫到redo logfile。這種先寫日誌,再寫磁碟,就是mysql中的WAL(Write-Ahead Logging)技術。

在計算機作業系統中,使用者空間(user space)下的緩衝區資料一般情況下是無法直接寫入磁碟的,中間必須經過作業系統核心(kernel space)緩衝區(OS buffer)

因此,redo log buffer寫入redo logfile,是先寫入OS BUFFER,然後再通過呼叫fsync() 將其刷到redo logfile中。

MySQL 支援三種將redo log buffer 寫入redo logfile的時機,可以通過innodb_flush_log_at_trx_commit引數控制。
1.innodb_flush_log_at_trx_commit=0 延遲寫;事務提交時不會將redo log buffer 中日誌寫入os buffer,而是每秒寫入os buffer 並呼叫fsync()寫入到redo logfile中。也就是說,設定為0時是(大約)每秒重新整理寫入到磁碟中的,當系統崩潰,會丟失1秒鐘資料。

2.innodb_flush_log_at_trx_commit=1 實時寫,實時刷;事務每次提交都會將redo log buffer中的日誌寫入os buffer,並呼叫fsync()到redo logfile中,系統崩潰,不會丟失資料,IO效能差。

3.innodb_flush_log_at_trx_commit=2 實時寫,延遲刷;每次提交僅寫入到os buffer,然後通過呼叫fsync()將os buffer 中的日誌寫入到redo logfile中。

Redo log 與 Binlog 區別
1.redo log大小是固定,binlog可通過引數max_binlog_size修改

2.redo log是innodb儲存引擎層實現的,並不是所有引擎都有;binlog 是server層實現的,所有儲存引擎都可以使用

3.redo log採用迴圈方式寫,binlog通過追加方式寫

4.redo log適用於崩潰恢復,binlog適用於主從複製和資料恢復

Undo log
資料庫事務四大特性中有一個是原子性 ,具體來說就是 原子性是指對資料庫的一系列操作,要麼全部成功,要麼全部失敗,不可能出現部分成功的情況 。

實際上, 原子性 底層就是通過 undo log 實現的。undo log主要記錄了資料的邏輯變化,比如一條 INSERT 語句,對應一條DELETE 的 undo log ,對於每個 UPDATE 語句,對應一條相反的 UPDATE 的 undo log ,這樣在發生錯誤時,就能回滾到事務之前的資料狀態。
同時, undo log 也是 MVCC(多版本併發控制)實現的關鍵。

轉自:https://mp.weixin.qq.com/s/oIlMz0VQTOVtKaWktYffqQ