圖解 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 的作用
-
數據恢復和故障恢復:通過分析和回放 Bin log,可以將數據庫恢復到故障發生之前的狀態。當數據庫發生故障或數據丟失時,可以利用 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,以滿足對數據庫的需求。
這三種模式的選型參考思路:
-
使用 MySQL 特殊功能較少,例如存儲過程、觸發器、函數等,用 Statement 模式。
-
使用 MySQL 特殊功能較多,用 Mixed 模式。
-
使用 MySQL 特殊功能較多,同時希望數據最大化一致,用 Row 模式。
詳見:喫透 3 大 Binlog 模式,MySQL 數據零丟失
什麼時候寫入 Bin Log ?
Bin Log 採用預寫日誌 WAL,即先寫日誌,再寫磁盤。
寫入 Bin Log 之後的事務流程:第 5 步箭頭下是 binlog buffer
先寫處於 prepare 狀態的 Redo Log,事務提交後,再寫處於 commit 狀態的 Redo Log,即二階段提交。
那爲什麼不直接持久化到磁盤呢?
直接寫入磁盤會嚴重影響到性能:
-
InnoDB 在磁盤中存儲的基本單元是頁,可能本次修改只變更一頁中幾個字節,但是需要刷新整頁的數據,就很浪費資源。
-
一個事務可能修改了多頁中的數據,頁之間又是不連續的,就會產生隨機 IO,性能更差。
在使用 Bin log 時,需要注意:
-
Bin log 的開啓和配置:需要確保 Bin log 已經開啓,並根據實際需求配置相關參數,如 Bin log 格式、Bin log 大小和保留時間等。
-
定期備份 Bin 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 時,需要注意:
-
Redo log 的大小和數量配置:根據實際需求和系統負載,配置合適的 Redo log 大小和數量,以確保足夠的持久化能力和性能。
-
定期刷寫 Redo log :爲了保證已提交的事務能夠及時寫入磁盤,需要配置合理的 Redo log 刷寫策略,以避免數據丟失。
-
監控 Redo log 的使用情況:定期監控 Redo log 的使用情況,以便及時調整配置參數,並確保數據庫的可靠性和性能。
1.3 Undo log
Undo log 以邏輯方式記錄數據庫事務的修改操作,它記錄了事務執行過程中舊值的備份,以便在事務回滾或併發控制需要時能夠恢復數據。
例如:當我們執行一條 insert 語句時,Undo Log 就會記錄一條相反的 delete 語句。
Undo log 的作用:
-
事務回滾:在事務執行過程中,如果出現錯誤或需要回滾操作,Undo log 可以恢復事務執行之前的數據狀態,實現事務的回滾操作。
-
併發控制:通過 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 時,需要注意:
-
Undo log 的管理和清理:由於 Undo log 會佔用存儲空間,需要定期清理不再需要的 Undo log,以釋放存儲空間。
-
配置 Undo log 的大小:根據數據庫的併發事務量和數據修改量,合理配置 Undo log 的大小,以確保足夠的空間來存儲 Undo log 信息。
-
定期備份 Undo log:爲了避免數據丟失,定期備份 Undo log 文件,以便在需要恢復數據時使用。
02 Bin log、Redo log 和 Undo log 的區別
2.1 數據記錄方式
-
Bin log:以二進制格式記錄數據庫的修改操作。
-
Redo log:以固定大小的物理日誌文件記錄數據庫頁的物理修改。
-
Undo log:以邏輯方式記錄事務執行過程中舊值的備份。
2.2 應用場景
-
Bin log:用於數據恢復、主從複製、數據審計和數據備份等。
-
Redo log:用於保證事務的持久性和故障恢復。
-
Undo log:用於事務的回滾和併發控制。
03 總結
通過本文,我們掌握了 Bin log、Redo log 和 Undo log 的概念、作用及其區別。
Bin log、Redo log 和 Undo log 都是 MySQL 中最爲重要的日誌機制。MySQL 實現事務、崩潰恢復、集羣的主從複製等,底層都離不開日誌,可以說日誌是 MySQL 的內核所在。
-
MySQL InnoDB 引擎使用 Redo log (重做日誌)保證事務的持久性。
-
使用 Undo log (回滾日誌))來保證事務的原子性。
-
MySQL 數據庫的數據備份、主備、主主、主從都離不開 Bin log,需要依靠 Bin log 來同步數據,保證數據一致性。
只有瞭解 MySQL 日誌,纔算是徹底搞懂 MySQL。
我是愛分享的程序員寶妹兒,分享即學習。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/unUdIoa-GAYhx_ct3dmQUA