首先介紹幾個概念:
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
首先介紹幾個概念:
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