天天看點

MYSQL資料保障 三大日志 binlog、redo log、undo log分類binlog 二進制日志redo log 重做日志undo log 撤銷日志參考連接配接

文章目錄

  • 分類
  • 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 開始恢複。
    MYSQL資料保障 三大日志 binlog、redo log、undo log分類binlog 二進制日志redo log 重做日志undo log 撤銷日志參考連接配接

與binlog差別

  • binlog 日志隻用于歸檔,隻依靠 binlog 是沒有

    crash-safe 能力的。但隻有 redo log 也不行,因為 redo log 是 InnoDB

    特有的,且日志上的記錄落盤後會被覆寫掉。是以需要 binlog 和 redo log二者同時記錄,才能保證當資料庫發生當機重新開機時,資料不會丢失。

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

繼續閱讀