02|日誌系統 一條更新語句是如何執行的
與查詢流程不一樣,更新流程涉及兩個重要的日誌模組:redo log(重做日誌)和binlog(歸檔日誌)
- redo log
當有一條記錄需要更新的時候,InnoDB引擎會先將記錄寫入redo log裡,並更新記憶體,這個時候更新就算完成了。同時,InnoDB引擎會在適當的時候,將這個記錄更新到磁盤裡,這個更新往往是在系統比較空閒的時候做。redo log是有大小限制的,當檔案被寫滿,此時需要先將redo log中的記錄部分更新到磁碟,為後續更新操作騰出空間。
- binlog
是server層維護的一種二進位制日誌,主要是用來記錄對mysql資料更新或潛在發生更新的sql語句,並以“事務”的形式儲存在磁碟。主要用於主從複製、資料恢復以及增量備份。
- 兩者區別
1.redo log是InnoDB引擎特有的;binlog是由mysql的server層實現的,所有引擎都可使用。
2.redo log是物理日誌,記錄的是“在某個資料頁上做了什麼修改”;binlog是邏輯日誌,分為兩種模式:statement記sql語句,row記錄行的更新內容,包括更新前與更新後。
3.redo log是迴圈寫,空間固定大小會用完;binlog是追加寫入的,寫到一定大小會切換到下一個,不會覆蓋以前的日誌。
- 更新語句執行流程圖
淺色框表示在InnoDB內部執行,深色框表示在執行器中執行。
redo log的寫入分成了兩步:prepare和commit,所謂兩階段提交,用於保證兩份日誌的一致性。
- 相關配置
innodb_flush_log_at_trx_commit:設定成1,表示每次事務的redo log都直接持久化到磁碟。建議設為1,保證mysql異常重啟之後的資料不丟失
sync_binlog: 設定成1,表示每次事務的binlog都持久化到磁碟。建議設為1,保證異常重啟之後binlog不丟失。