Mysql 的 binlog 和 redolog

參考資源:Mysql 實戰 45 講

Mysql 的 binlog 和 redolog

在 Mysql 中,有兩個重要的日誌,binlog 和 redolog。在數據恢復和備份上起着重要的作用。

binlog

binlog 是 Mysql 中 server 層的數據記錄日誌,它記錄了所有數據的邏輯操作。例如:” id = 2 的行 a 字段從 1 變成了 2 “,這樣的記錄。並且數據是以追加的形式存儲在磁盤上的。

redolog

redolog 是在 InnoDB 的存儲引擎中實現的,它並不是 Mysql 原生的,也就是說,其他的存儲引擎(MySIAM, memory)是可能不存在 redolog 的。在 InnoDB 的存儲引擎中,數據在存儲的過程中,並不是直接落盤的,如果每一次數據操作都從磁盤上取的話會大大降低 Mysql 的使用效率。所以,InnoDB 爲了提高效率,使用 redolog 作爲中間介質來存儲一部分數據。當然,redolog 的實現是基於內存的,這樣才能足夠快,並且 redolog 的空間是有限的,並不是像 binlog 以追加的方式添加日誌數據,是一個循環的數據結構,存儲在內存中。

在存儲數據的過程中,如果 redolog 的內存被沾滿,那麼會將一部分數據先落盤,然後再寫入內存。等數據庫空閒的時候,再將 redolog 中的日誌全部同步到磁盤中。

更新數據的過程(此處以數據引擎爲 InnoDB 爲例)

一個 Mysql 的 update 操作,例如:update T set c = 2 where id = 1,這樣一個簡單的語句,在 Mysql 內部大致分爲以下幾個步驟:

  • 客戶端向 Mysql 服務器發起鏈接
  • Mysql 連接器 對帳號和密碼進行驗證,並賦予權限
  • 進入Mysql 查詢緩存,更新操作會將更新表的查詢緩存全部刪除
  • Mysql 分析器 對語句進行語法和詞法分析
  • Mysql 優化器 對語句進行優化,例如,命中哪個索引,連表操作優化等
  • Mysql 執行氣 對語句進行執行,這個時候打開表,調用數據引擎的數據接口更新數據
  • Mysql 數據引擎(InnoDB) 內存中查詢是否存在需要更新的數據,若存在,則返回,若不存在,則從磁盤讀取並同步至內存後返回給 Mysql 執行器
  • Mysql 執行器 獲取到數據後相應需要更新的數據進行更新操作,發送回數據引擎
  • Mysql 數據引擎(InnoDB)接收到數據後寫入 redolog 日誌並且將本條數據的狀態標記爲 prepare ,告訴 Mysql 執行器 事務隨時可以 commit
  • Mysql 執行器 寫入 binlog 日誌,記錄本條數據的更新記錄,發送數據給數據引擎,提交事務
  • Mysql 數據引擎(InnoDB) 將本條數據的狀態標記爲 commit 已提交,等待空閒時候將數據同步至磁盤中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章