文章目錄
- 分類
- binlog 二進制日志
-
- 簡介
- 應用場景
- 刷盤時機
- redo log 重做日志
-
- 簡介
- 應用場景
- 刷盤時機
-
- 記錄形式
- 與binlog差別
- undo log 撤銷日志
-
- 簡介
- 應用場景
- 刷盤時機
- 參考連接配接
日志是 mysql 資料庫的重要組成部分,記錄着資料庫運作期間各種狀态資訊。
mysql日志主要包括錯誤日志、查詢日志、慢查詢日志、事務日志、二進制日志幾大類。作為開發,我們重點需要關注的是二進制日志( binlog )和事務日志(包括redo log 和 undo log )
分類
- 邏輯日志: 可以簡單了解為記錄的就是sql語句
- 實體日志: mysql 資料最終是儲存在資料頁中的,實體日志記錄的就是資料頁變更
binlog 二進制日志
簡介
- binlog 用于記錄資料庫執行的寫入性操作(不包括查詢)資訊,以二進制的形式儲存在磁盤中。
- binlog 是邏輯日志,并且由 Server 層進行記錄,使用任何存儲引擎的 mysql 資料庫可以使用 binlog 日志。
- binlog 是通過追加的方式進行寫入的,max_binlog_size 參數設定每個 binlog檔案的大小,當檔案大小達到給定值之後,會生成新的檔案來儲存日志。
應用場景
- 主從複制
- 資料恢複
刷盤時機
- mysql 通過 sync_binlog 參數控制 biglog 的刷盤時機,取值範圍是 0-N
- 0:不去強制要求,由系統自行判斷何時寫入磁盤
-
1:每次 commit 的時候都要将 binlog 寫入磁盤,MySQL 5.7.7
之後的預設值
- N:每N個事務,才會将 binlog 寫入磁盤
redo log 重做日志
簡介
- 實體日志
- redo log 包括兩部分:記憶體中的日志緩沖( redo log buffer ),磁盤上的日志檔案( redo log)
- mysql 每執行一條 DML 語句,先将記錄寫入 redo log buffer `,後續某個時間點再一次性将多個操作記錄寫到 redo log file 。這種 先寫日志,再寫磁盤 的技術就是 MySQL裡經常說到的 WAL(Write-Ahead Logging) 技術。
- redo log 是 InnoDB 引擎層實作的,并不是所有引擎都有
應用場景
- 系統突然崩潰恢複(crash-safe)
刷盤時機
- mysql 支援三種将 redo log buffer 寫入 redo log file 的時機,可以通過
參數配置innodb_flush_log_at_trx_commit
- 0(延遲寫)
- 1(實時寫,實時刷)
- 事務每次送出都會将 redo log buffer 中的日志寫入 os buffer 并調用 fsync() 刷到 redo log file 中。
- 2(實時寫,延遲刷)
記錄形式
-
redo log 實際上記錄資料頁的變更,而這種變更記錄是沒必要全部儲存,是以 redo log
實作上采用了大小固定,循環寫入的方式,當寫到結尾時,會回到開頭循環寫日志
- 啟動 innodb 的時候,不管上次是正常關閉還是異常關閉,總是會進行恢複操作。因為 redo log 記錄的是資料頁的實體變化,是以恢複的時候速度比邏輯日志(如 binlog )要快很多。
- 重新開機 innodb 時,首先會檢查磁盤中資料頁的 LSN ,如果資料頁的 LSN 小于日志中的 LSN ,則會從 checkpoint 開始恢複。
與binlog差別
- binlog 日志隻用于歸檔,隻依靠 binlog 是沒有
特有的,且日志上的記錄落盤後會被覆寫掉。是以需要 binlog 和 redo log二者同時記錄,才能保證當資料庫發生當機重新開機時,資料不會丢失。crash-safe 能力的。但隻有 redo log 也不行,因為 redo log 是 InnoDB
undo log 撤銷日志
簡介
- 邏輯日志
- 用于記錄事務開始前的狀态,用于事務失敗時的復原操作
- undo log 主要記錄了資料的邏輯變化,比如一條 ` INSERT語句,對應一條 DELETE 的 undo log ,對于每個 UPDATE 語句,對應一條相反的 UPDATE 的undo log ,這樣在發生錯誤時,就能復原到事務之前的資料狀态。
- 資料庫事務四大特性中有一個是 原子性 , 原子性 底層就是通過 undo log 實作的。
- undo log 也是 MVCC (多版本并發控制)實作的關鍵
應用場景
- 用于記錄事務開始前的狀态,用于事務失敗時的復原操作
刷盤時機
- undo log刷入磁盤後,才送出事務
參考連接配接
必須了解的mysql三大日志-binlog、redo log和undo log