回覆列表
  • 1 # 使用者855260919973

    首先介紹幾個概念:

    REDO 為了重做對資料頁(page)更改儲存的資訊,用於恢復

    UNDO 為了撤銷對資料記錄(tuple)更改儲存的資訊,用於回滾事務

    LSN(Log Sequence NO) 日誌號,一個遞增的64位整數,一個LSN表示一個(redo)Log結構。

    CHECKPOINT表示一個時間點,在CHECKPOINT LSN之前的更改都已經儲存到了持久儲存。恢復時只需從最後一個CHECKPOINT LSN開始。

    下面從update, commit, recovery三個方面簡單說明:

    update(Insert與之類似)

    1.計算更新後tuple到原tuple的delta資訊,把這個delta複製到rollback segment中的undo

    2.寫redo log,記錄對rollback segment的更改

    3.把buffer pool中的對應tuple更新成新值,把新值的rollback pointer寫入undo log

    4.寫redo log,記入對頁(page)的更改

    5.將頁狀態改成dirty

    commit

    force log, flush當前事務的redo log

    recovery

    1.啟動開始時檢測是否發生崩潰

    2.定位到最近的一個checkpoint

    3.定位在這個checkpoint時flush到磁碟的資料頁,檢查checksum。如果不正確,說明這個頁在上次寫入是不完整的,從doublewrite buffer裡把正確的頁讀出來,更新到buffer中的頁

    4.分析redo log,標識出未提交事務

    5.順序執行redo

    6.rollback未提交的事務

    以上是我個人的一些簡單總結,具體細節的可以參考:

    Jeremy Cole的InnoDB: A journey to the core

  • 中秋節和大豐收的關聯?
  • 《瘋狂的賽車》主演是誰?