mysql中常見的三種log,分別是重做日志(redo log),回滾日志(undo log),以及二進制日志(binlog)
1. redo log
作用:當數據庫對數據做修改的時候,需要把數據頁從磁盤讀到buffer pool中,然后在buffer pool中進行修改,那么這個時候buffer pool中的數據頁就與磁盤上的數據頁內容不一致,稱buffer pool的數據頁為dirty page 臟數據,如果這個時候發生非正常的DB服務重啟,那么這些數據還沒在內存,並沒有同步到磁盤文件中(注意,同步到磁盤文件是個隨機IO),也就是會發生數據丟失,所以在重啟mysql服務的時候,可以根據redo log進行重做,從而達到事務的持久性
內容:物理日志,即記錄修改后的數據行
什么時候產生:事務開始之后產生redo log
什么時候釋放:當對應事務的臟頁寫入到磁盤之后,redo log即可被覆蓋
什么時候寫入磁盤:
Master Thread每秒一次執行刷新Innodb_log_buffer到重做日志文件
每個事務提交時將重做日志刷新到重做日志文件
當重做日志緩存可用空間少於一半時,重做日志緩存被刷新到重做日志文件
2. undo log
作用:保存了事務發生之前的數據的一個版本,可以用於回滾,同時可以提供多版本並發控制下的讀(MVCC)
內容:物理日志,修改前的數據行
什么時候產生:事務開始之前,將當前版本生成undo log,undo也會產生redo來保證undo log的可靠性
什么時候釋放:當事務提交之后,undo log並不能立馬被刪除,而是放入待清理的鏈表,由purge線程判斷是否由其他事務在使用undo段中表的上一個事務之前的版本信息,決定是否可以清理undo log的日志空間
3. binlog
作用:用於復制,在主從復制中,從庫利用主庫上的binlog進行重播,實現主從同步;用於數據庫的基於時間點的還原
什么時候產生:事務提交的時候,一次性將事務中的sql語句或者是修改過后的語句按照一定的格式記錄到binlog中
什么時候釋放:由參數expire_logs_days決定
與redo log的不同點:
作用不同:redo log用來保證事務的持久性,binlog則用來復制數據庫
內容不同:redo log是物理日志,binlog通常是邏輯日志
生命周期不同
效率不同:基於物理日志的redo log回復數據的效率高於binlog
