MySQL重做日誌恢復資料的流程

chenfeng發表於2018-06-07
1.當MySQL啟動的時候,先會從資料庫檔案中讀取出上次儲存最大的LSN。
2.然後呼叫recv_recovery_from_checkpoint_start,並將最大的LSN作為引數傳入函式當中。
3.函式會先最近建立checkpoint的日誌組,並讀取出對應的checkpoint資訊。
4.通過checkpoint lsn和傳入的最大LSN進行比較,如果相等,不進行日誌恢復資料,如果不相等,進行日誌恢復。
5.在啟動恢復之前,先會同步各個日誌組的archive歸檔狀態。
6.在開始恢復時,先會從日誌檔案中讀取2M的日誌資料到log_sys->buf,然後對這2M的資料進行scan,校驗其合法性,而後將去掉block header的日誌放入recv_sys->buf當中,這個過程稱為scan,會改變scanned lsn.
7.在對2M的日誌資料scan後,innodb會對日誌進行mtr操作解析,並執行相關的mtr函式。如果mtr合法,會將對應的記錄資料按space page_no作為KEY存入recv_sys->addr_hash當中。
8.當對scan的日誌資料進行mtr解析後,innodb對會呼叫recv_apply_hashed_log_recs對整個recv_sys->addr_hash進行掃描,並按照日誌相對應的操作進行對應page的資料恢復。這個過程會改變recovered_lsn。
9.如果完成第8步後,會再次從日誌組檔案中讀取2M資料,跳到步驟6繼續相對應的處理,直到日誌檔案沒有需要恢復的日誌資料。
10.innodb在恢復完成日誌檔案中的資料後,會呼叫recv_recovery_from_checkpoint_finish結束日誌恢復操作,主要是釋放一些開闢的記憶體。並進行事務和binlog的處理。

上述過程的示意圖如下:


恢復日誌主要的介面函式:
   recv_recovery_from_checkpoint_start    從重做日誌組內的最近的checkpoint開始恢復資料


    recv_recovery_from_checkpoint_finish  結束從重做日誌組內的checkpoint的資料恢復操作


    recv_recovery_from_archive_start           從歸檔日誌檔案中進行資料恢復


    recv_recovery_from_archive_finish         結束從歸檔日誌中的資料恢復操作


    recv_reset_logs                  擷取重做日誌最後一段作為新的重做日誌的起始位置,可能會丟失資料。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2155757/,如需轉載,請註明出處,否則將追究法律責任。

相關文章