一、binlog和redo log的區別
特性 | binlog | redo log |
---|
記錄對象 | 記錄的是 MySQL 服務器的事務操作,針對的是整個數據庫實例。 | 記錄的是 InnoDB 存儲引擎的數據頁變化,針對的是具體的存儲引擎層面。 |
記錄內容 | 記錄的是事務的邏輯操作,例如 SQL 語句(語句型 binlog)或行變化(行型 binlog)。 | 記錄的是數據頁的物理變化,例如某個頁的某個偏移量的修改。 |
記錄時間 | 在事務提交后寫入(即事務提交完成后才寫入 binlog)。 | 在事務執行過程中寫入(即事務提交前會寫入 redo log)。 |
記錄方式 | 寫到一定大小會切換下一個,不會覆蓋之前的日志。 | 依次往幾個Redo log文件中寫入,如果最后一個文件寫滿了,又會回到第一個Redo log中寫入。 |
用途 | 備份,復制 | 保證事務的持久性 |
?二、Redo log和undo log的區別
對比方向 | undo log | redo log |
---|
記錄內容 | 方向的數據修改記錄 | 正向的數據頁變更記錄 |
寫入順序 | 隨機讀寫 | 順序寫 |
作用 | 幫助事務回滾以及實現MVCC | 用保證事務的持久性 |
三、更新數據時,各種日志的寫入時機
舉例:DELETE FROM t1 WHERE id=1
階段 | undo log | redo log | binlog |
---|
事務開始 | 開始記錄事務的舊值,但尚未寫入。 | 未寫入。 | 未寫入。 |
事務執行階段 | 寫入 undo log,記錄?id=1 ?行的舊值。 | 未寫入。 | 未寫入。 |
事務提交判斷 | undo log 已寫入,記錄舊值。 | 未寫入。 | 未寫入。 |
事務提交 | undo log 已寫入,記錄舊值。 | 寫入 redo log,記錄?id=1 ?行被刪除后的物理變化。 | 未寫入(binlog 在事務提交后寫入)。 |
事務提交后 | undo log 已寫入,記錄舊值。 | redo log 已寫入,記錄物理變化。 | 寫入 binlog,記錄?DELETE FROM t1 WHERE id=1 ?的邏輯操作。 |
事務結束(成功) | undo log 已寫入,記錄舊值。 | redo log 已寫入,記錄物理變化。 | binlog 已寫入,記錄邏輯操作。 |
事務回滾(失敗) | 使用 undo log 回滾,恢復?id=1 ?行的舊值。 | 未寫入(redo log 只在事務成功提交時寫入)。 | 未寫入(binlog 只在事務成功提交后寫入)。 |