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