binlog 與 redo log 的區別

binlog 寫入機制

我們知道 redo log 的寫入機制是事務中有更新操作時就會將更新操作記錄在 redo log buffer 中,在事務提交時,根據相關參數的設定,按照不同邏輯持久化到磁盤文件。由於多個事務共用一個 redo log buffer,當有其他並行事務提交時,未提交的事物的 redo log 也會被持久化到磁盤。這個時候,崩潰恢復時因爲兩階段提交的機制不會導致未提交事務數據被恢復。

binlog 區別於 redo log,每個事務所在的線程都會存在一個 binlog cache,並且只有事務提交時會持久化到磁盤文件(binlog file)。注意磁盤文件是共用的,只有 binlog cache 是單個線程一個。具體流程是事務執行過程中先把日誌寫到 binlog cache 中,在事務提交的時候持久化到磁盤文件。

由於一個事務的 binlog 是不能被拆開的,因此不論這個事務多大,也要確保一次性寫入,這就涉及到了binlog cache保存這個事務binlog 的能力

參數 binlog_cache_size 用於控制單個線程的 binlog cache 大小,當一個事務的 binlog 數據超過了設定的大小,則需要暫存到磁盤,等事務提交的時候,再把 binlog cache 中的完整的事務持久化到磁盤。

與 redo log buffer 持久化到磁盤一樣,binlog cache 也可以設置持久化到磁盤的操作,即可以延遲寫。

binlog 與 redo log 的基本區別

  1. 這兩者使用方式不一樣
    binlog 會記錄表所有更改操作,包括更新刪除數據,更改表結構等等,主要用於人工恢復數據,而 redo log 對於我們是不可見的,它是 InnoDB 用於保證 crash-safe 能力的,也就是在事務提交後MySQL崩潰的話,可以保證事務的持久性,即事務提交後其更改是永久性的
    一句話概括:binlog 是用作人工恢復數據,redo log 是 MySQL 自己使用,用於保證在數據庫崩潰時的事務持久性。
  2. redo log 是 InnoDB 引擎特有的,binlog 是 MySQL 的 Server 層實現的,所有引擎都可以使用。
  3. redo log 文件是固定大小的,是循環寫的,寫滿了會從頭繼續寫,而 binlog 是追加寫的,寫滿了再新建文件接着寫。

binlog 和 redo log 記錄格式的區別

binlog 格式

binlog有三種格式:Statement、Row 以及 Mixed。從安全性來看,ROW(最安全)、MIXED(不推薦)、STATEMENT(不推薦)。

  1. 基於SQL語句的複製(statement-based replication,SBR), 每一條會修改數據的sql都會記錄在binlog中。
  2. 基於行的複製(row-based replication,RBR), binlog中可以不記錄執行的sql語句的上下文相關的信息,僅需要記錄那一條記錄被修改成什麼了。所以rowlevel的日誌內容會非常清楚的記錄下每一行數據修改的細節。
  3. 混合模式複製(mixed-based replication,MBR)。Statement與Row的結合。

redo log 格式

redo log 是物理日誌,記錄的是在某個表做了什麼修改,用於 MySQL 異常重啓時數據恢復,所以恢復速度比 bin log 更快。

與性能相關的參數

binlog 參數

  1. 參數 binlog_cache_size 用於控制單個線程內 binlog cache 所佔內存的大小。
  2. 事務提交的時候,binlog cache write 到文件系統的 page catche 中,在合適的機會進行fsync,將數據持久化到磁盤中。write 階段,指的就是指把日誌寫入到文件系統的 page cache,並沒有把數據持久化到磁盤,所以速度比較快。fsync 階段,是將數據持久化到磁盤的操作。一般情況下,我們認爲 fsync 才佔磁盤的 IOPS。write 和 fsync 的時機,是由參數 sync_binlog 控制的。
sync_binlog=0 的時候,表示每次提交事務都只 write,不 fsync;
sync_binlog=1 的時候,表示每次提交事務都會執行 fsync;
sync_binlog=N(N>1) 的時候,表示每次提交事務都 write,但累積 N 個事務後才 fsync。
  1. 參數binlog_cache_size,用於控制每個線程 binlog cache 的大小

將 sync_binlog 設置爲一個比較大的數,可以有效提升性能,但是同時會帶來一個問題,主機發生異常重啓會丟失一部分 binlog 數據。通常設置爲 100~1000。

redo log 參數

  1. 參數innodb_flush_log_at_trx_commit
    用於控制 redo log 的寫入策略,寫入 redo log buffer 和文件系統緩衝區速度很快,但是數據寫入磁盤會比較慢。
0:表示每次事務提交時都只是把 redo log 留在 redo log buffer 中 ;
1:表示每次事務提交時都將 redo log 直接持久化到磁盤;
2:表示每次事務提交時都只是把 redo log 寫到 page cache。
  1. 參數innodb_log_file_size
    用於調整 redo log 單個文件的大小
  2. 參數innodb_log_files_in_group
    用於調整 redo log 文件數量
  3. 參數innodb_log_buffer_size
    用於調整 redo log buffer 的大小
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章