1、MySQL日誌系統
阿新 • • 發佈:2021-11-06
redo log(重做日誌)
Innodb引擎持有
WAL技術
Write-Ahead Logging,先寫日誌再寫磁碟。當一條記錄需要更新時,InnoDB引擎先把記錄寫到redo log裡面,並更新記憶體,這次更新就算完成了。InnoDB引擎會在適當時候將這個操作記錄更新到磁碟。
執行過程
write pos:當前記錄位置,一遍寫一遍後移。
check point:當前要擦除的位置(更新到磁碟),往後推移。
write pos和check point之間可以用來記錄新的操作;當write pos追上check point時,此時不能再執行新的更新;需要等待check point擦除一部分記錄再執行更新。
基於redo log,InnoDB可以保證資料庫發生異常重啟,之前提交的記錄都不會丟失,即crash-safe。
binlog日誌(server層日誌)
redo log與binlog日誌不同點
適用範圍 | 記錄型別 | 寫入方式 | |
---|---|---|---|
redo log | InnoDB引擎特有 | 物理日誌;記錄“在某個資料頁做了什麼修改” | 迴圈寫;空間固定會用完 |
binlog | Server層實現,所有引擎都可以使用 | 邏輯日誌;記錄語句的原始邏輯 | 追加寫; |
Update語句執行過程
mysql> update T set c=c+1 where ID=2;
深色:執行器中執行;淺色:InnoDB中執行
此處將redo log的寫入拆分為兩個步驟:prepare和commit。——兩階段提交
兩階段提交可以保證redo log和binlog的狀態保持邏輯一致。(事務性)——可以保證資料恢復
相關設定
- innodb_flush_log_at_trx_commit:設定為1,每次事務的redo log都直接持久化到磁碟;保證mysql異常重啟資料不丟失;
- sync_binlog:設定為1,每次事務的binlog都持久化到磁碟;保證mysql異常重啟後binlog不丟失。
MySQL如何判斷binlog完整
一個事務的binlog是有完整格式的:
- statement格式的binlog,最後會有COMMIT;
- row格式的binlog,最後會有一個XID event。
5.6.2版本以後,引入了binlog-checksum引數,用來驗證binlog內容的正確性。
redolog和binlog如何關聯
他們有一個共同的資料欄位XID。崩潰恢復的時候,會順序掃描redo log:
- 如果碰到既有prepare,又有commit的redo log,就直接提交;
- 如果碰到只有prepare,沒有commit的redo log,就拿著XID去binlog找對應的事務。