:重做日誌。每當有操作時,在數據變更之前將操作寫入 ,這樣當發生掉電之類的情況時系統可以在重啟後繼續操作 :稱為撤銷日誌,當一些變更執行到一半無法完成時,可以根據撤銷日誌恢復到變更之間的狀態。 位於存儲引擎層, 中有使用。 的`redo log`是固定大小,比如配置一組4個文件,每個文件的大小為1G ...
redo log
redo log
:重做日誌。每當有操作時,在數據變更之前將操作寫入redo log
,這樣當發生掉電之類的情況時系統可以在重啟後繼續操作
undo log
:稱為撤銷日誌,當一些變更執行到一半無法完成時,可以根據撤銷日誌恢復到變更之間的狀態。
redo log
位於存儲引擎層,InnoDB
中有使用。InnoDB
的redo log
是固定大小,比如配置一組4個文件,每個文件的大小為1G,那麼總共可以記錄4GB的操作。從頭開始寫,寫到末尾就又回到開頭迴圈寫。
write pos
:當前記錄的位置,一邊寫一邊後移checkpoint
:當前要擦除的位置,是往後推移並且迴圈的,擦出記錄前要把記錄更新到數據文件
write pos
和checkpoint
之前是日誌還空著的部分,可以用來記錄新的操作。如果write pos
追上checkpoint
,表示日誌滿了,這時候不能再執行新的更新,得停下來先擦掉一些記錄。
有了redo log
,InnoDB
就可以保證即使資料庫發生異常重啟,之前提交的記錄都不會丟失,這個能力成為crash-safe
。
WAL
:Write-Ahead Loggin
,預寫日誌系統。在使用WAL的系統中,所有的修改都先被寫入到日誌中,然後再被應用到系統狀態中。通常包含redo和undo兩部分信息。
具體來說,當有一條記錄需要更新的時候,InnoDB
引擎就會先把記錄寫到redo log
裡面,並更新記憶體,這個時候更新就算完成了。同時,InnoDB
引擎會在適當的時候,將這個操作記錄更新到磁碟裡面,而這個更新往往是系統比較空閑的時候做。
binlog
歸檔日誌,位於Server
層。
為什麼會有兩份日誌?
最開始MySQL
里並沒有InnoDB
引擎。MySQL自帶的引擎是MyISAM,但是MyISAM沒有crash-safe的能力,binlog日誌只能用於歸檔。而InnoDB是另一個公司以插件形式引入MySQL的,既然只依靠binlog是沒有crash-safe能力的,所以InnoDB使用另一套日誌系統也就是redo log來實現crash-safe能力。
和redo log
差別:
redo log
是InnoDB
引擎特有的,binlog
是MySQL的Server層實現的,所有引擎都可以使用。redo log
是物理日誌,記錄的是“在某個數據頁上做了什麼修改”;binlog
是邏輯日誌,記錄的是這個語句的原始邏輯,比如“給ID=2這一行的c欄位加1”。redo log
是迴圈寫的,空間固定會用完,binlog
是可以追加寫入的,指的是寫到一定大小後會切換到下一個,並不會覆蓋以前的日誌。
誤刪表後的操作:
- 找到最近一次的全量備份,從這個備份恢復到臨時庫
- 從備份的時間點開始,將備份的
binlog
依次取出來,重放到刪除誤刪除的時刻
MySQL
的binlog
日誌可以用於誤操作後的數據恢復工作以及主從複製一致性的工作。