MySQL undo
標籤: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql undo管理MySql
- MySQL purge 清理undoMySql
- MySQL 日誌 undo | redoMySql
- 深入理解MYSQL undo redoMySql
- mysql 查詢undo空間MySql
- MySQL redo與undo日誌解析MySql
- MySQL InnoDB Undo表空間配置MySql
- MySQL中的redo log和undo logMySql
- MySQL中undo log介紹及清理MySql
- MySQL Undo Log和Redo Log介紹MySql
- 淺析MySQL事務中的redo與undoMySql
- MySQL UNDO表空間獨立和截斷MySql
- MySQL必知必會:簡介undo log、truncate、以及undo log如何幫你回滾事物MySql
- 還不懂mysql的undo log和mvcc?算我輸!MySqlMVC
- 【Mysql】三大日誌 redo log、bin log、undo logMySql
- innodb_undo_tablespaces導致Mysql啟動報錯MySql
- MySQL 5.7新特性之線上收縮undo表空間MySql
- 【MySQL】undo,redo,2PC,恢復思維導圖MySql
- Innodb undo之 undo結構簡析
- mysql日誌:redo log、binlog、undo log 區別與作用MySql
- MySQL中redo log、undo log、binlog關係以及區別MySql
- 深入理解MySQL系列之redo log、undo log和binlogMySql
- MySQL 8.0.2 新特性 UNDO表空間管理的靈活性提升MySql
- 基於Redo Log和Undo Log的MySQL崩潰恢復流程MySql
- 資料庫篇:mysql日誌型別之 redo、undo、binlog資料庫MySql型別
- mysql 5.7啟動報錯"Expected to open undo tablespaces but was able to find only 0"MySql
- MySQL中的undo截斷(r11筆記第89天)MySql筆記
- Oracle Redo and UndoOracle Redo
- Oracle undo 管理Oracle
- Git undo 操作Git
- Oracle Undo SegmentOracle
- oracle undo管理Oracle
- oracle undo一Oracle
- Undo Mode (30)
- 【UNDO】使用重建UNDO表空間方法解決UNDO表空間過大問題
- Innodb undo之 undo物理結構的初始化
- 【undo】undo 意外刪除處理辦法(非歸檔)
- Oracle 12c 新特性 - 臨時表undo(TEMP UNDO)Oracle