圖解 bin log、redo log 及 undo log 區別,2 分鐘喫透!

Bin log、Redo log 和 Undo log 的區別,是 MySQL 的高頻面試題,大廠校招面試 90% 會問。

在 MySQL 數據庫中,Bin log、Redo log 和 Undo log 都是極爲重要的日誌文件。

MySQL 實現事務、崩潰恢復、集羣的主從複製等,底層都離不開日誌,可以說日誌是 MySQL 的內核所在。

只有瞭解 MySQL 日誌,纔算是徹底搞懂 MySQL。

本文主要探討 Bin log、Redo log 和 Undo log 的區別。

01 Bin log、Redo log 和 Undo log 的概述

1.1 Bin log

Bin log 是什麼

Bin log 記錄的是邏輯日誌,它以追加的方式記錄數據庫的修改操作,採用二進制格式進行存儲。

Bin log 包含了操作語句、或語句集合的原始二進制數據,可以通過解析和回放 Bin log,來重新執行其中的操作。

Bin log 的作用

假設我們有一個名爲 products 的商品表,其中包含商品的名稱和價格。

現在,我們發現商品價格發生了錯誤的修改,並且需要通過 Bin log 記錄來定位和修復這個問題。

UPDATE products SET price = 2000 WHERE id = 1;

通過查看 Bin log 記錄,我們可以定位到這個修改操作,並通過恢復正確的價格來修復數據。

Bin log 的三種日誌格式

針對不同的應用場景,Binlog 推出了三種工作模式 Statement、Row、Mixed,以滿足對數據庫的需求。

這三種模式的選型參考思路:

詳見:喫透 3 大 Binlog 模式,MySQL 數據零丟失

什麼時候寫入 Bin Log ?

Bin Log 採用預寫日誌 WAL,即先寫日誌,再寫磁盤。

寫入 Bin Log 之後的事務流程:第 5 步箭頭下是 binlog buffer

先寫處於 prepare 狀態的 Redo Log,事務提交後,再寫處於 commit 狀態的 Redo Log,即二階段提交。

那爲什麼不直接持久化到磁盤呢?

直接寫入磁盤會嚴重影響到性能:

在使用 Bin log 時,需要注意:

1.2 Redo log

Redo log 以循環寫入的方式記錄數據庫的修改操作,採用固定大小的物理日誌文件進行存儲。

Redo log 記錄了數據庫頁的物理修改,而非語句級別的邏輯操作。

Redo log 的作用:

示例:

假設用戶在下訂單後,數據庫發生了突然的崩潰,我們可以使用 Redo log 來恢復用戶的訂單信息。

-- 在事務中創建訂單
BEGIN;
INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 100, 2);
COMMIT;

當數據庫發生崩潰時,使用 Redo log 中的內容重新應用這個事務,就能恢復用戶的訂單信息了。

那在啥時候寫入 Redo log 呢?

Redo log 同樣採用預寫日誌 WAL 的方式。

在使用 Redo log 時,需要注意:

1.3 Undo log

Undo log 以邏輯方式記錄數據庫事務的修改操作,它記錄了事務執行過程中舊值的備份,以便在事務回滾或併發控制需要時能夠恢復數據。

例如:當我們執行一條 insert 語句時,Undo Log 就會記錄一條相反的 delete 語句。

Undo log 的作用:

示例:

假設在用戶付款過程中,發現付款金額錯誤,我們需要回滾事務並使用 Undo log 中記錄的舊值來恢復正確的付款金額。

-- 在事務中更新付款金額
BEGIN;
UPDATE payments SET amount = 100.00 WHERE id = 1;

-- 假設發現付款金額錯誤,需要回滾事務並恢復舊值
ROLLBACK;

通過回滾事務並使用 Undo log 中記錄的舊值,我們可以將數據庫中的付款金額恢復到事務開始之前的狀態,保證數據的一致性。

Undo Log 如何回滾到上一個版本

首先,通過兩個隱藏列 trx_id(最近一次提交事務的 ID)和 roll_pointer(上個版本的地址),建立一個版本鏈。

然後,在事務中讀取時生成一個 ReadView(讀視圖),在 Read Committed 隔離級別下,每次讀取都會生成一個讀視圖,而在 Repeatable Read 隔離級別下,只會在第一次讀取時生成一個讀視圖。

在使用 Undo log 時,需要注意:

02 Bin log、Redo log 和 Undo log 的區別

2.1 數據記錄方式

2.2 應用場景

03 總結

通過本文,我們掌握了 Bin log、Redo log 和 Undo log 的概念、作用及其區別。

Bin log、Redo log 和 Undo log 都是 MySQL 中最爲重要的日誌機制。MySQL 實現事務、崩潰恢復、集羣的主從複製等,底層都離不開日誌,可以說日誌是 MySQL 的內核所在。

只有瞭解 MySQL 日誌,纔算是徹底搞懂 MySQL。

我是愛分享的程序員寶妹兒,分享即學習。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/unUdIoa-GAYhx_ct3dmQUA