欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL之undo日志頁(yè)結(jié)構(gòu)詳解

 更新時(shí)間:2025年06月26日 08:51:40   作者:在成都搬磚的鴨鴨  
這篇文章主要介紹了MySQL之undo日志頁(yè)結(jié)構(gòu),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、背景

之前講過(guò)undo日志類(lèi)型,本篇文章再來(lái)具體講解一下undo日志頁(yè)結(jié)構(gòu)。

2、undo日志頁(yè)結(jié)構(gòu)

【1】FIL_PAGE_UNDO_LOG頁(yè)

InnoDB中最基本的存儲(chǔ)單位是頁(yè),undo日志也是存儲(chǔ)在頁(yè)上的,頁(yè)的類(lèi)型為FIL_PAGE_UNDO_LOG,其頁(yè)面結(jié)構(gòu)如下:

在這里插入圖片描述

其中Undo Page Header是undo日志所特有的,其結(jié)構(gòu)如下:

在這里插入圖片描述

字段含義為:

字段字節(jié)大小含義
TRX_UNDO_PAGE_TYPE2本頁(yè)存儲(chǔ)undo日志類(lèi)型,分為兩大類(lèi):TRX_UNDO_INSET和TRX_UNDO_UPDATE,一個(gè)頁(yè)面只能存儲(chǔ)一種類(lèi)型
TRX_UNDO_PAGE_START2本頁(yè)中第一條undo日志地址
TRX_UNDO_PAGE_FREE2本頁(yè)可以寫(xiě)入undo日志的空閑地址
TRX_UNDO_PAGE_NODE12鏈表節(jié)點(diǎn)

【2】undo頁(yè)面組成的鏈表

通過(guò)Undo Page Header的TRX_UNDO_PAGE_NODE屬性能讓undo頁(yè)組成一個(gè)鏈表,鏈表中的第一個(gè)頁(yè)被稱(chēng)為first undo page,第二個(gè)頁(yè)被稱(chēng)為normal undo page,上面講過(guò)有兩大類(lèi)undo日志類(lèi)型,一個(gè)頁(yè)只能存儲(chǔ)相同的頁(yè)類(lèi)型,所以一個(gè)事務(wù)的所有插入操作可以組成一個(gè)insert undo鏈表,所有刪除和更新操作可以組成一個(gè)update undo鏈表,臨時(shí)表也需要記錄undo日志,所以一個(gè)事務(wù)可能產(chǎn)生四個(gè)undo頁(yè)組成的鏈表,這些鏈表是用到的時(shí)候再分配。

【3】Undo Log Segment

每個(gè)undo日志頁(yè)組成的鏈表都對(duì)應(yīng)一個(gè),叫Undo Log Segment,這個(gè)段存儲(chǔ)在鏈表的第一個(gè)頁(yè)也就是first undo page頁(yè)中,其結(jié)構(gòu)如下:

在這里插入圖片描述

其中Undo Log Segment header用來(lái)存儲(chǔ)段結(jié)構(gòu)信息,其結(jié)構(gòu)如下:

在這里插入圖片描述

字段含義如下:

字段字節(jié)大小含義
TRX_UNDO_STATE2鏈表對(duì)應(yīng)的段狀態(tài):
TRX_UNDO_ACTIVE:活躍狀態(tài),一個(gè)活躍的事務(wù)正在往這個(gè)段里面寫(xiě)入undo日志
TRX_UNDO_CACHED:被緩存的狀態(tài),該undo頁(yè)面對(duì)應(yīng)的來(lái)吧等待被其它實(shí)物重用
TRx_UNOD_To_FREE:對(duì)insert undo鏈表來(lái)說(shuō),在它對(duì)應(yīng)的事務(wù)提交之后,該鏈表不能被重用就處于這種狀態(tài)
TRX_UNDO_TO_PURGE:對(duì)update undo鏈表來(lái)說(shuō),在它對(duì)應(yīng)的事務(wù)提交之后,該鏈表不能被重用就處于這種狀態(tài)
TRX_UNDO_PREPARED:包含處于PREPARE階段的事務(wù)產(chǎn)生的undo日志
TRX_UNDO_LAST_LOG2本undo頁(yè)面鏈表中最后一個(gè)Undo Log header的位置
TRX_UNDO_FSEG_HEADER10本undo頁(yè)鏈表對(duì)應(yīng)的段信息
TRX_UNDO_PAGE_LIST16undo頁(yè)鏈表基節(jié)點(diǎn),這個(gè)基節(jié)點(diǎn)就存在于first undo page頁(yè)中

【4】Undo Log Header

同一個(gè)事務(wù)向同一個(gè)undo頁(yè)面鏈表中寫(xiě)入的undo日志算一個(gè)組,組信息存儲(chǔ)在鏈表第一個(gè)頁(yè)的Undo Log Header屬性中,first undo page頁(yè)可以這樣表示:

在這里插入圖片描述

Undo Log Header結(jié)構(gòu)如下:

在這里插入圖片描述

字段含義如下:

字段字節(jié)大小含義
TRX_UNDO_TRX_ID8生成本組undo日志的事務(wù)id
TRX_UNDO_TRX_NO8事務(wù)提交后生成的序號(hào),用來(lái)標(biāo)記事務(wù)的提交順序
TRX_UNDO_DEL_MARKS2標(biāo)記本組undo日志是否包含由于Delete mark操作產(chǎn)生的undo日志
TRX_UNDO_LOG_START2本組undo日志第一條undo日志在頁(yè)面中的地址
TRX_UNDO_XID_EXISTS1本組undo日志是否包含XID信息
TRX_UNDO_DICT_TRANS1標(biāo)記本組undo日志是不是由DDL語(yǔ)句產(chǎn)生
TRX_UNDO_TABLE_ID8DDL語(yǔ)句操作的表table_id
TRX_UNDO_NEXT_LOG2下一組undo日志在頁(yè)面中開(kāi)始的偏移量
TRX_UNDO_PREV_LOG2上一組undo日志在頁(yè)面中開(kāi)始的偏移量
TRX_UNDO_HISTORY_NODE12History鏈表的節(jié)點(diǎn)

【5】重用undo頁(yè)面

為了節(jié)省空間就有了重用undo頁(yè)面,重用undo頁(yè)面需要滿足以下條件:

  • 1、undo頁(yè)面鏈表只包含一個(gè)undo頁(yè)面
  • 2、該undo頁(yè)面鏈表使用空間超過(guò)該頁(yè)面空間的3/4
  • 3、insert undo鏈表是覆蓋寫(xiě)入
  • 4、update undo鏈表是追加寫(xiě)入

3、總結(jié)

通過(guò)undo日志能保證事務(wù)回滾,也就是原子性,上面講過(guò)insert操作對(duì)應(yīng)的undo日志可以直接刪除,update和delete操作的不能,就是為了MVCC,多版本并發(fā)控制,后面再來(lái)講解MVCC。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論