我是李福春,我在準備面試,今天的題目是: mysql的redolog和binlog有什麼區別? 答: 如下麵的表格, redolog vs binlog 然後我們擴展一下,因為日誌主要是記錄的修改日誌,分別加深分析一下: redolog redolog是innodb存儲引擎特有的物理日誌,記錄的是數 ...
我是李福春,我在準備面試,今天的題目是:
mysql的redolog和binlog有什麼區別?
答: 如下麵的表格,
redolog vs binlog
然後我們擴展一下,因為日誌主要是記錄的修改日誌,分別加深分析一下:
redolog
redolog是innodb存儲引擎特有的物理日誌,記錄的是數據頁做了什麼改動。
它的存儲空間是固定的,類似一個圓環。日誌空間寫完,需要把相關的操作執行,數據刷到磁碟上釋放空間。
redolog可以有效保證mysql的crash-safe; 即mysql系統故障重啟,也可以從redolog中恢復;
一般把innodb_flush_log_at_trx_commit=1,即設置redolog每次事務提交日誌落盤,可以更有效的保證crash-safe
binlog
是一種mysql-server層的邏輯修改日誌,有兩種格式:
1,statement格式,記錄的是sql;
2, row格式,記錄了兩行,更新前和更新後的結果;
為了保證系統可以從奔潰狀態恢復,設置參數 sync_binlog=1,即事務提交,binlog落盤;
如何快速恢復mysql:
1,找到最近的備份,恢復到臨時庫;
2,找到備份的binlog,重放到你需要的時刻。
一條update語句歷程
比如有一張表:
user(id int primarykey auto_increment , age int default 0 )engin=innodb ;
執行一條sql語句:
update user set age=age+1 where id=2 ;
那麼,這條update語句是如何經過mysql的體繫結構和日誌文件呢?
1,執行器首先通過存儲引擎讀介面得到這行數據;(如果記憶體有則返回,不存在從硬碟中取出放入記憶體再返回)
2,執行器把這行數據的age+1,然後調用存儲引擎的寫介面,寫入數據到記憶體;
3,存儲引擎把更新操作寫入redolog,日誌狀態為prepare ,告訴執行器事務完成更新操作;
4, 執行器把這個操作寫入binlog,日誌落盤;
5,執行器提交事務,調用存儲日誌寫到redolog,日誌狀態為commit,
binlog,redolog都可以表示事務的狀態;
兩階段提交:保證了binlog,redolog在系統奔潰重啟之後的事務狀態的一致;
小結
本篇分析了redolog和binlog的區別。
然後分別介紹了binlog,redolog所處的mysql的體繫結構位置,實際運維過程中的配置參數。
最後追蹤了一條update語句的執行歷程,以及兩種日誌的寫入過程,然後點明兩階段提交是為了保證兩種日誌的事務一致性。
原創不易,轉載請註明出處。