一.什么是undo log ?
1.定義
undo,顧名思義“回滾日志”,是事務日志的一種。記錄內存數據頁修改之前的狀態(類似於快照)在故障自動恢復過程中實現回滾的操作。
存儲位置:默認存放在共享表空間中
如果開啟了 innodb_file_per_table ,將放在每個表的.ibd文件中。在MySQL5.6中,undo的存放位置還可以通過變量 innodb_undo_directory 來自定義存放目錄,默認值為"."表示datadir。
ibdata文件默認只有一個,默認大小為1024M
默認了話undo log是無法自動清除,數據庫的上線時間越長,就會越來越大,可能會使磁盤空間使用越來越大,並且備份也會越來越長。
mysql 5.7支持設置ibdata自定義設置存儲路徑,已經指定數據量truncate
mysql的參數配置:
innodb_undo_log_truncate =on 開啟自動清理undo log的功能
innodb_max_undo_log_size =1024M undo log達到多大時truncat
innodb_undo_tablespaces =3 至少指定三個,以防truncate日志的時候,ibdata無法使用
注意配置需要,在配置文件定義好之后,需要初始化安裝的時候實現,直接修改配置文件,重啟數據庫會報錯。
2.作用:
在事務ACID過程中,實現的是“ACI”原子性,一致性的作用。通過隔離級別實現
1)rollback
2)CSR過程中,實現回滾
3)多個行版本控制(MVCC)
3.undo記錄了什么
數據頁修改之前的狀態,TXID
二.redo和undo日志的工作原理
1.需要被修改的數據從磁盤page調取到內存的buffer page進行處理,並且把修改前的數據存儲到undo buffer中,以用於在commit前的數據進行回滾
2.redo buffer記錄被修改數據的過程
3.直接把修改后的數據在commit后寫入磁盤工作量太大,浪費磁盤的大量io ,所以把redo buffer寫入到redo日志里去,用於突然地斷電,內存丟失可以進行數據的恢復,而磁盤的數據真正的寫入是在buffer pool達到上限的時候來進行一次性把數據寫入磁盤中去。
4.突然地宕機導致內存數據丟失,可以根據磁盤的page原始數據和ib_logfile日志重回內存;來進行數據的恢復,保證數據的一致性。那么如何在宕機后確保宕機后redo日志的記錄和page的記錄一致呢?可以通過增加lsn ,日志序列號,在宕機后,對比redo日志和page的 lsn是否相同,相同說明最后一條執行的語句已經commit,無需處理,如果redo日志的lsn大於page的lsn說明,最后一條語句沒有commit,那么把page的數據和redo日志的數據再次提交到內存中來進行數據的恢復,恢復后再次commit,保證了斷電后數據的一致性。這種技術就叫做WAL redo日志優先存入磁盤來保證數據的一致性。
5.redo日志先存入磁盤,數據后存入磁盤