淺聊 Bin Log、Redo Log、Undo log
在 MySQL 數據庫中,binlog、redo log 和 undo log 皆屬于日志類型文件,然而,它們的功能與實現方式存在著微妙的差異。
binlog 主要用于數據庫的數據備份、崩潰恢復以及數據復制等操作;而 redo log 和 undo log 則主要用于事務管理,分別記錄了數據修改操作和回滾操作的細節。redo log 用于數據恢復,而 undo log 則用于回滾事務。
崩潰恢復是指在數據庫系統因各種原因而發生崩潰或非正常關閉后,通過一系列機制和步驟來將數據庫恢復到一個一致性和可用的狀態。這是數據庫管理系統的重要功能之一,它確保在異常情況下數據庫能夠自動恢復,從而避免數據丟失或數據庫狀態不一致的問題。
在 MySQL 中,redo log 和 undo log 僅適用于 InnoDB 存儲引擎,因為其支持事務特性,而不適用于其他存儲引擎如 MyISAM 等。而 binlog 則適用于所有存儲引擎。
binlog 是 MySQL 用于記錄數據庫中所有 DDL 語句和 DML 語句的二進制日志。它記錄了對數據庫結構和數據的所有修改操作,例如 INSERT、UPDATE 和 DELETE 等。binlog 主要用于數據庫的數據備份、災難恢復和數據復制等操作。binlog 的格式包括基于語句的格式和基于行的格式。
Redo Log 是 MySQL 用于實現崩潰恢復和數據持久性的機制。在事務進行過程中,MySQL 會將事務所做的修改記錄到 Redo Log 中。當系統發生崩潰或異常情況時,MySQL 利用 Redo Log 中的記錄信息進行恢復操作,將事務所做的修改持久化到磁盤中。
Undo Log 用于在事務回滾或系統崩潰時撤銷(回滾)事務所做的修改。當一個事務執行時,MySQL 會將事務修改前的數據記錄到 Undo Log 中。如果事務需要回滾,則會從 Undo Log 中找到相應的記錄來撤銷事務所做的修改。此外,Undo Log 還支持 MVCC(多版本并發控制)機制,用于在并發事務執行時提供一定的隔離性。
很多人不知道該怎么記憶,可以參考網友的建議,可以這么記憶:
- undo 就是回退的意思,就跟在文本編輯器里面有一個 undo 按鈕一樣,你編輯的東西,按一下這個 undo 按鈕就回退到上一個版本了。
- redo 是“re”+"do","re"就是重來一次的意思,“do”就是做的意思。所以連在一起,就是重新再做一遍,也就是重新再執行一次 sql。那么什么時候需要重新再執行一次 sql 呢?執行的數據丟了嘛,自然就需要重新執行一次。
- bin 就是“binary”的縮寫,"binary"就是二進制的意思,可以引申為“原始”的意思,所以 bin log 就是最全最原始的東西,里面包含了一切,所以可以用來做備份,有了它,就有了一切。
undolog 和 redolog 在功能和記錄內容上有著明顯的區別:
- 目的:Redo log 的目的是確保事務的持久性,主要用于崩潰恢復。而 Undo log 的目的是確保事務的原子性和一致性,主要用于事務回滾。
- 記錄內容:Redo Log 記錄了事務的所有數據更改,不僅記錄了數據更改的最終結果,還記錄了實現這些更改的具體操作。而 Undo log 記錄的是事務執行前的內容,即事務所做的修改前的狀態。