一條更新語句的執行跟查詢執行的流程是一樣的,也是如下圖:
不一樣的地方,會寫兩個日誌,兩段式提交:
redo log:在innodb寫,通過creach-safe模式寫。
bin log:在service寫,任何引擎都可以用,mysql公共執行日誌,記錄每一條語句執行。
redo log
redolog日誌在內存中是固定大小的,一個組redo寫版是一個1g,可以配置多組寫版。redo log是邊寫日誌到內存邊同步到磁盤。寫的指針爲writepos,同步到磁盤的指針是checkpoint。當writepos要追趕checkpoint上時,這個時候就會停止下來擦除一些記錄,把checkpoint向前推。
bin log
bin log 是mysql serve層實現的,所有的引擎都可以用,記錄操作記錄。
兩段式提交
當一條更新語句進入執行器後,先調用引擎接口,如果innodb判斷是否存在內存,如果存在就返回數據行,如果不存在就從磁盤讀入數據頁,然後返回行數。
Server對行進行update操作。
通過引擎接口寫入新行,寫日rido日誌,此刻日誌處於prapare狀態。
Server此時再寫bin log
提交事務,redo log處於commit狀態。
爲什麼要兩段式提交
保證數據和日誌一致性