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日志可以用于誤操作后的資料恢復作業以及主從復制一致性的作業,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/62708.html
標籤:MySQL
上一篇:基礎架構(1)
下一篇:事務隔離(3)
