MySQL undo

caohongfeng666發表於2021-01-04

標籤:MySQL

標籤:MySQL結構

標籤:MySQL undo


一、undo結構:


rseg0預留在系統表空間ibdata中;

rseg 1~rseg 32這32個回滾段存放於臨時表的系統表空間中;

rseg33~ 則根據配置存放到獨立undo表空間中(如果沒有開啟獨立Undo表空間,則存放於ibdata中)


1. trx_sys->rseg_array

表空間的第4個page(page-3)內主要儲存該表空間內的每個回滾段的header page no,構成一個陣列,陣列大小為回滾段數量,陣列的每一項佔據4B.

所有回滾段都記錄在trx_sys->rseg_array,陣列大小為128,用於維護回滾段相關資訊;


2. purge_sys->purge_queue

事務提交後,需要purge的回滾段會被放到purge佇列上(purge_sys->purge_queue)。


3. 回滾段的管理結構,Header Page

Rollback Segment的Header Page內有undo log slot陣列,該陣列大小為1024,陣列的每一項代表一個undo log。

事務執行需要記錄undo log時會尋找當前空閒slot分配undo log。

   

4. trx_undo_t的管理結構UNDO PAGE HEADER,還有幾個負責分配資源的list

TRX_UNDO_STATE:標記事務狀態,有TRX_UNDO_ACTIVE/TRX_UNDO_PREPARED等狀態

TRX_UNDO_LAST_LOG:最後一個undo日誌的在undo page中的偏移,透過該欄位可快速定位最新undo日誌的位置

TRX_UNDO_FSEG_HEADER:header page內的TRX_UNDO_FSEG_HEADER為undo page連結串列的頭部,每個undo page透過其TRX_UNDO_PAGE_NODE將自身串聯在連結串列中。

TRX_UNDO_PAGE_LIST:該trx_undo_t所有的PAGE構成的雙向連結串列頭部。佔據16個位元組。透過它就可以遍歷該trx_undo_t的所有undo page,進而找到所有的undo log內容,設計得還是很巧妙的.


5. UNDO_PAGE_HDR (undo log連結串列的節點)

TRX_UNDO_PAGE_TYPE:該undo page記錄的undo型別,佔據2個位元組,目前有TRX_UNDO_INSERT、TRX_UNDO_UPDATE兩種型別

TRX_UNDO_PAGE_START:該undo page記錄的資料起始位置,undo log從page內的該偏移處寫入,就是指圖中的Data Region的起始偏移

TRX_UNDO_PAGE_FREE:該undo page記錄的資料起始位置,undo log從page內的該偏移處寫入,就是指圖中的Data Region的起始偏移

TRX_UNDO_PAGE_NODE:這裡是前後向指標,用於串聯一個trx_undo_t內的所有UNDO PAGE,每個指標大小為6B,總大小12B


6. UNDO LOG格式




二、事務回滾段分配和使用:

1.分配回滾段

根據操作型別決定分配哪種型別的回滾段,採用round-robin的輪詢方式來賦予回滾段給事務。

臨時表回滾段被賦予trx->rsegs->m_noredo,普通讀寫操作的回滾段被賦予trx->rsegs->m_redo。


2.在回滾段中分配undo slot

(1).判斷型別選擇對應的list ,insert 和 delete/update 分開記錄undo,因此需要從回滾段單獨分配Undo slot。

(2).總是從cahced list上分配trx_undo_t,如果沒有cache的trx_undo_t,則需要從回滾段上分配一個空閒的undo slot(trx_undo_create),並建立對應的undo頁,進行初始化;

(3).已分配給事務的trx_undo_t會加入到連結串列trx_rseg_t::insert_undo_list或者trx_rseg_t::update_undo_list上;

(4).初始化trx_undo_t相關資訊(trx_undo_mem_init_for_reuse),將trx_undo_t::state設定為TRX_UNDO_ACTIVE;



三、修改過程:

1. 將原狀態資訊寫undo log buffer 

2. 寫undo log對應的redo log buffer -> redo log file

3. 修改db buffer中的data block,透過回滾指標指向undo log構建一致性檢視

4. 寫data block對應的redo log buffer -> redo log file

5. undo log寫入undo表空間

6. 刷髒data block 到 double write buffer

7. double write buffer 寫入到ibdata檔案

8. 刷髒data block寫入表空間檔案


四、事務Commit:

如果當前的undo log只佔一個page,且佔用的header page大小使用不足其3/4時(TRX_UNDO_PAGE_REUSE_LIMIT),則狀態設定為TRX_UNDO_CACHED,該undo物件會隨後加入到undo cache list上;

如果是Insert_undo(undo型別為TRX_UNDO_INSERT),則狀態設定為TRX_UNDO_TO_FREE;

如果不滿足a和b,則表明該undo可能需要Purge執行緒去執行清理操作,狀態設定為TRX_UNDO_TO_PURGE。



五、前滾和回滾的恢復:

事務系統初始化(回滾段初始化)

從最近的Checkpoint 往後掃描到的Redo Log記錄將被應用到各個資料檔案中

從Undo Log中恢復處於'ACTIVE'狀態的事務,重新生成read view

使用Undo Log回滾未提交的'ACTIVE'狀態的事務

處於PREPARE狀態的事務,如果開啟了binlog且在binlog有找到對應事務的日誌則重新提交,否則回滾


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

相關文章