目錄
- 一、bin log 與 redo log 的區別
- 1)實現方式不同:
- 2)日志內容不同:
- 3)記錄方式不同:
- 4)使用場合不同:
- 二、為什么快速恢復使用 redo log 而不用 bin log?

面試題:bin log 和 redo log 都是作為數據恢復使用的日志文件,二者有什么區別?
一、bin log 與 redo log 的區別
bin log
和 redo log
的作用雖然都是數據恢復,但是二者實際上大不相同,整體可以概括為 四點區別。
1)實現方式不同:
- 實現 redo log 是 InnoDB 引擎特有的;
- 而 binlog 是 MySQL 的 Server 層實現的,所有引擎都可以使用。
2)日志內容不同:
- redo log 是
物理日志
,記錄的是 “在XXX數據頁上做了XXX修改”; - 而 binlog 是
邏輯日志
,記錄的是原始邏輯,即對應的 SQL 語句。
什么是 物理日志 和 邏輯日志?
物理日志
:記錄的是每一個 page 頁中 具體存儲的值是多少,在這個數據頁上做了什么修改。比如:某個事物將系統表空間中的第 100 個頁面中偏移量為 1000 處的那個 字節的值從1改為2。邏輯日志
:記錄的是每一個 page 頁中具體數據是怎么變動的,它會記錄一個 變動的過程 或 SQL 語句的邏輯。比如:把一個 page 頁中的第一個數據從 1 改為 2,再從 2 改為 3,邏輯日志就會記錄整個過程:1->2, 2->3。
3)記錄方式不同:
- redo log 是 循環寫入文件,空間大小是固定的,需要 寫入點(write pos)和 檢查點(check point)搭配使用;
- binlog 是 追加寫,空間大小是不固定的,寫到一定大小會切換到下一個,并不會覆蓋以前的日志。
注意: redo log 文件空間大小雖然是固定的,但一般不止一個文件,當最后一個文件寫滿時則回溯到第一個文件,進行覆蓋寫。
為了方便理解 redo log 循環寫的實現方式,可以參考下圖:

寫入點(write point)
:表示日志當前記錄的位置,當 ib_logfile_4 寫滿后,會從 ib_logfile_1 從頭開始記錄。檢查點(check point)
:表示將日志記錄的修改寫進磁盤,完成 數據落盤。數據落盤后 check point 會將日志上的相關記錄擦除掉,即:write pos -> check point
之間的部分是 redo log 空著的部分,用于記錄新的日志;check point -> write pos
之間是 redo log 中待落盤的數據修改記錄。
注意: 如果 write pos 追上了 check point,表示 redo log 日志寫滿,這時候不能再執行新的更新,得停下來先擦掉一些記錄,把 check point 推進一下。
4)使用場合不同:
- redo log 作為服務器異常宕機后事務數據自動恢復使用;
- binlog 可以作為主從復制和數據恢復使用,binlog 沒有自動
crash-safe
能力。
CrashSafe 指 MySQL 服務器宕機重啟后,能夠保證:
- 所有已經提交的事務數據仍然存在;
- 所有沒有提交的事務數據自動回滾。
二、為什么快速恢復使用 redo log 而不用 bin log?
最核心的一點就是 兩者記錄的數據變更粒度是不一樣 的。
以修改數據為例:
- binlog 是以 表 為記錄主體,在 ROW 模式下,binlog 保存的表中每行的變更記錄。
- 由于 MySQL 是以頁為單位進行刷盤的,每一頁的數據單位為 16K,所以在刷盤的過程中需要把數據刷新到磁盤的多個扇區中去。而把 16K 數據刷到磁盤的每個扇區里這個過程是 無法保證原子性的,如果數據庫宕機,那么就可能會造成一部分數據成功過,而一部分數據失敗的情況。而通過 binlog 這種級別的日志是無法恢復的,因為一個 update 可能更改了多個磁盤區域的數據,所以這個時候得需要通過 redo log 這種 記錄到磁盤數據級別 的日志進行數據恢復。
整理完畢,完結撒花~ 🌻
參考地址:
1.MySQL面試 | bin log與redo log的區別?https://www.bilibili.com/video/BV1h4AkeKENf