MySQL之undo日志頁結構詳解
1、背景
之前講過undo日志類型,本篇文章再來具體講解一下undo日志頁結構。
2、undo日志頁結構
【1】FIL_PAGE_UNDO_LOG頁
InnoDB中最基本的存儲單位是頁,undo日志也是存儲在頁上的,頁的類型為FIL_PAGE_UNDO_LOG,其頁面結構如下:
其中Undo Page Header是undo日志所特有的,其結構如下:
字段含義為:
字段 | 字節(jié)大小 | 含義 |
---|---|---|
TRX_UNDO_PAGE_TYPE | 2 | 本頁存儲undo日志類型,分為兩大類:TRX_UNDO_INSET和TRX_UNDO_UPDATE,一個頁面只能存儲一種類型 |
TRX_UNDO_PAGE_START | 2 | 本頁中第一條undo日志地址 |
TRX_UNDO_PAGE_FREE | 2 | 本頁可以寫入undo日志的空閑地址 |
TRX_UNDO_PAGE_NODE | 12 | 鏈表節(jié)點 |
【2】undo頁面組成的鏈表
通過Undo Page Header的TRX_UNDO_PAGE_NODE屬性能讓undo頁組成一個鏈表,鏈表中的第一個頁被稱為first undo page,第二個頁被稱為normal undo page,上面講過有兩大類undo日志類型,一個頁只能存儲相同的頁類型,所以一個事務的所有插入操作可以組成一個insert undo鏈表,所有刪除和更新操作可以組成一個update undo鏈表,臨時表也需要記錄undo日志,所以一個事務可能產生四個undo頁組成的鏈表,這些鏈表是用到的時候再分配。
【3】Undo Log Segment
每個undo日志頁組成的鏈表都對應一個段,叫Undo Log Segment,這個段存儲在鏈表的第一個頁也就是first undo page頁中,其結構如下:
其中Undo Log Segment header用來存儲段結構信息,其結構如下:
字段含義如下:
字段 | 字節(jié)大小 | 含義 |
---|---|---|
TRX_UNDO_STATE | 2 | 鏈表對應的段狀態(tài): TRX_UNDO_ACTIVE:活躍狀態(tài),一個活躍的事務正在往這個段里面寫入undo日志 TRX_UNDO_CACHED:被緩存的狀態(tài),該undo頁面對應的來吧等待被其它實物重用 TRx_UNOD_To_FREE:對insert undo鏈表來說,在它對應的事務提交之后,該鏈表不能被重用就處于這種狀態(tài) TRX_UNDO_TO_PURGE:對update undo鏈表來說,在它對應的事務提交之后,該鏈表不能被重用就處于這種狀態(tài) TRX_UNDO_PREPARED:包含處于PREPARE階段的事務產生的undo日志 |
TRX_UNDO_LAST_LOG | 2 | 本undo頁面鏈表中最后一個Undo Log header的位置 |
TRX_UNDO_FSEG_HEADER | 10 | 本undo頁鏈表對應的段信息 |
TRX_UNDO_PAGE_LIST | 16 | undo頁鏈表基節(jié)點,這個基節(jié)點就存在于first undo page頁中 |
【4】Undo Log Header
同一個事務向同一個undo頁面鏈表中寫入的undo日志算一個組,組信息存儲在鏈表第一個頁的Undo Log Header屬性中,first undo page頁可以這樣表示:
Undo Log Header結構如下:
字段含義如下:
字段 | 字節(jié)大小 | 含義 |
---|---|---|
TRX_UNDO_TRX_ID | 8 | 生成本組undo日志的事務id |
TRX_UNDO_TRX_NO | 8 | 事務提交后生成的序號,用來標記事務的提交順序 |
TRX_UNDO_DEL_MARKS | 2 | 標記本組undo日志是否包含由于Delete mark操作產生的undo日志 |
TRX_UNDO_LOG_START | 2 | 本組undo日志第一條undo日志在頁面中的地址 |
TRX_UNDO_XID_EXISTS | 1 | 本組undo日志是否包含XID信息 |
TRX_UNDO_DICT_TRANS | 1 | 標記本組undo日志是不是由DDL語句產生 |
TRX_UNDO_TABLE_ID | 8 | DDL語句操作的表table_id |
TRX_UNDO_NEXT_LOG | 2 | 下一組undo日志在頁面中開始的偏移量 |
TRX_UNDO_PREV_LOG | 2 | 上一組undo日志在頁面中開始的偏移量 |
TRX_UNDO_HISTORY_NODE | 12 | History鏈表的節(jié)點 |
【5】重用undo頁面
為了節(jié)省空間就有了重用undo頁面,重用undo頁面需要滿足以下條件:
- 1、undo頁面鏈表只包含一個undo頁面
- 2、該undo頁面鏈表使用空間超過該頁面空間的3/4
- 3、insert undo鏈表是覆蓋寫入
- 4、update undo鏈表是追加寫入
3、總結
通過undo日志能保證事務回滾,也就是原子性,上面講過insert操作對應的undo日志可以直接刪除,update和delete操作的不能,就是為了MVCC,多版本并發(fā)控制,后面再來講解MVCC。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
mysql8報錯:ERROR?1410?(42000):?You?are?not?allowed?to?
電腦新裝的mysql,版本為8.0以上,分配權限時直接帶密碼和賬號會報錯,這篇文章主要給大家介紹了關于mysql8報錯:ERROR?1410?(42000):?You?are?not?allowed?to?create?a?user?with?GRANT的解決辦法,需要的朋友可以參考下2022-06-06dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置
這篇文章主要介紹了dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01Mysql數(shù)據(jù)庫從5.6.28版本升到8.0.11版本部署項目時遇到的問題及解決方法
這篇文章主要介紹了Mysql數(shù)據(jù)庫從5.6.28版本升到8.0.11版本過程中遇到的問題及解決方法,解決辦法有三種,每種方法給大家介紹的都很詳細,感興趣的朋友跟隨腳本之家小編一起學習吧2018-05-05