理解mysql的undo log,已經自動truncate undo log


一.什么是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日志和pagelsn是否相同,相同說明最后一條執行的語句已經commit,無需處理,如果redo日志的lsn大於pagelsn說明,最后一條語句沒有commit,那么把page的數據和redo日志的數據再次提交到內存中來進行數據的恢復,恢復后再次commit,保證了斷電后數據的一致性。這種技術就叫做WAL redo日志優先存入磁盤來保證數據的一致性。

   5.redo日志先存入磁盤,數據后存入磁盤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM