廢話很少說先來張圖解釋sql
update T set value = value+1 where ID =2
複製代碼
我想可能大部分人看完這圖,思考片刻,接下來的就不須要在繼續看了,可是考慮到部分朋友仍是新手(包括本身)以及後面複習,仍是稍微嘮叨一段。數據庫
首先,上圖中深色背景的表示在執行器中執行,也就是Server層,淺色的是在InnoDB引擎中執行。
因爲不少朋友並非專業的DBA或者對MySQL內部原理並非特別清晰,因此先對redolog和binlog作簡單的介紹。bash
redologui
重作日誌,屬於物理日誌,上面存儲的是數據庫中最終的內容,有固定的大小,能夠循環讀寫,通常設置innodb_flush_log_at_trx_commit爲1,表示commit事務時將redolog上面的數據刷入到磁盤(具體的能夠自行研究redolog file 和redolog buffer)。具備兩個狀態分別是prepare和commit,在MySQL重啓恢復時會根據commit狀態恢復數據。spa
binlog日誌
歸檔日誌,屬於邏輯日誌,上面存儲的是最初的修改邏輯能夠簡單的理解爲sql語句,能夠追加寫,通常設置sync_binlog爲1,表示commit事務時將binlog上面的數據刷入到磁盤進行歸檔。數據恢復和同步都是經過binlog來實現的。code
下面以文字的方式再次描述一下update T set value = value+1 where ID =2的過程。cdn
以上就是比較簡單的過程理解,那麼爲啥要分開寫redolog呢?即傳說中的兩階段提交?這裏再作個簡單的分析。
blog
首先對這種方式的好處作個總結:保證以上全部的過程若是出現MySQL實例奔潰都不會致使事務的丟失或異常。事務
接下來分析一下這麼作的具體緣由:
redolog只出如今InnDB中,並且是循環寫的,不能持久保存,因此暫時不能用redolog來作主從或者數據備份
以上的是總結了不少博客和書上的內容,並非徹底的原創,本身也是在整理,但願你們能指正不對之處。