最近復習了一下Mysql事務,看到網上很多博客都把這里講的很亂,將有些概念和名詞混淆一談,於是順便將redo log,redo log buffer 以及buffer pool在事務處理中的詳細過程和原理總結了一下。
首先數據修改操作(updata)是從磁盤將數據先加載到內存的buffer pool當中進行更改,然后再通過隨機IO寫入到磁盤當中更新數據
但是,由於從內存將修改后的數據寫入到磁盤是隨機IO,效率極低,所以為了提高效率,redo log buffer和redo logo誕生了。
下圖就是后來優化加入redo log和redo buffer后的事務處理流程
為了提高效率,當數據在內存中修改完成時,會先將數據的變化日志寫入到redo log buffer當中,然后再將redo log buffer當中記錄的數據變化日志寫入到磁盤的redo log當中。
這樣的話,由於磁盤當中有原數據,redo log記錄的數據的變化,那么如果意外宕機,只要redo log已經更新,那么數據就不會丟失。
這樣不但提高了事務並發的效率(因為日志的寫入是順序IO,極大地提高了事務並發的效率,且減輕了磁盤IO的壓力
),還大大提高了安全性(宕機時由於順序IO寫入日志效率高,極大的減少了數據丟失的可能性)
下面講講當意外宕機后重啟mysql數據恢復的全過程:
重啟后通過redo log和數據文件當中的LSN對比發現,redo log日志中記錄的數據變化版本要高於數據文件記錄的數據版本,因此存儲引擎會將redo log加載到redo log buffer中,再將數據文件中的舊數據加載到buffer pool當中,然后內存當中的buffer pool會根據redo log buffer記錄的新版本數據變化進行數據更新,最后再將最新版本的數據寫入到mysql的磁盤數據文件當中,完成數據的更新,極大地保證的數據的安全性。