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

MySQL?InnoDB?undo?log數(shù)據(jù)結(jié)構(gòu)用法詳解

 更新時間:2025年07月22日 09:19:26   作者:BestRivenCHN  
InnoDB的undolog用于事務(wù)回滾與MVCC,存于共享/獨立表空間,包含insert和update兩種類型,通過參數(shù)配置,由purge線程清理

一、概念解析

1、undo log基本

undo log是InnoDB事務(wù)中特有的結(jié)構(gòu),它的作用有兩個:

  • 一是進行事務(wù)回滾(原子性),舊數(shù)據(jù)先放到undo log中,等rollback時再將舊數(shù)據(jù)里的數(shù)據(jù)回滾回來;
  • 二是MVCC(隔離性),非阻塞讀。

undo能夠避免臟讀:在操作數(shù)據(jù)之前,將數(shù)據(jù)備份到undo頁中,然后在進行數(shù)據(jù)的修改,不能看到其他回話未提交的數(shù)據(jù),當要讀取被修改頁數(shù)據(jù)行時,會指向備份在undo頁中的數(shù)據(jù),避免臟讀。

  • undo回滾段頭物理存儲在ibdata1文件中第6個頁位置。
  • undo log存放在數(shù)據(jù)庫內(nèi)部的一個特殊段中,這個段稱為undo段。undo段位于共享表空間中。回滾段實際上是一種 undo 文件組織方式

在InnoDB存儲引擎中有rollback segment,每個回滾段記錄了1024個undo log segment(slot),每個undo log segment段中進行undo頁的申請。

從1.1版本開始InnoDB支持最大128個rollback segment,所以理論上可以支持的最大的事務(wù)上限為128*1024。

在1.2版本開始,可以通過參數(shù)對rollback segment進行設(shè)置,參數(shù)有:

參數(shù)名稱

含義

innodb_undo_directory

設(shè)置回滾段文件所在的路徑

innodb_undo_logs

設(shè)置回滾段的個數(shù)

innodb_undo_tablespaces

設(shè)置構(gòu)成回滾段文件的數(shù)量

也就是說:

回滾段可以存放在共享表空間以外的地方,即可以設(shè)置獨立表空間,innodb_undo_directory的默認值為“.”,表示當前InnoDB存儲引擎的目錄。

回滾段的個數(shù)默認值為128。

設(shè)置回滾段文件的數(shù)量后,回滾段可以較為平均地分布在多個文件中,在路徑下可以看到undo為前綴的文件,該文件代表回滾段文件。

可用show variables like “innodb_undo%”;查詢:

重新初始化時指定innodb_undo_tablespaces=N來設(shè)置,設(shè)置好后會在data目錄下生成undo獨立表空間(大小10M):

2、事務(wù)系統(tǒng)頭transactionsystemheader

回滾段的管理,在InnoDB共享表空間中,用第6個頁面(5號)來管理的,這個頁面專門用來存儲事務(wù)系統(tǒng)相關(guān)信息的,源代碼位于trx0sys.h,它的格式如下:

這三個參數(shù)的含義分別為:

參數(shù)名稱

含義

TRX_SYS_TRX_ID_STORE

存儲事務(wù)號

TRX_SYS_FSEG_HEADER

存儲事務(wù)段信息

TRX_SYS_RSEGS

數(shù)組,InnoDB有128個rollback segment

3、回滾段頭rollbacksegmentheader

對于每一個回滾段,即上面TRX_SYS_RSEGS數(shù)組中的一個元素,也有其自己的存儲格式,代碼中的宏定義位于trx0rseg.h,格式如下:

這五個信息的含義如下:

參數(shù)名稱

含義

TRX_RSEG_MAX_SIZE

所有undo段頁面之和

TRX_RSEG_HISTORY_SIZE

需要purge的回滾段頁面數(shù)

TRX_RSEG_HISTORY

存儲history list的鏈表首地址

TRX_RSEG_FSEG_HEADER

存儲回滾段的inode位置信息

TEX_RSEG_UNDO_SLOTS

數(shù)組,1024,每個元素是一個頁面號

這五個信息存儲了一個回滾段的信息,最后一個位置的數(shù)組,用來真正存儲回滾段的位置。

這五個信息是從頁面偏移38的位置開始存儲,在TRX_SYS宏定義中可以查看:

4、回滾頁頭undologpageheader

定義在trx0undo.h,事務(wù)undo日志頁面頭偏移量:

其中各個參數(shù)的含義為:

參數(shù)名稱

含義

TRX_UNDO_PAGE_TYPE

類型,TRX_UNDO_INSERT\UPDATE

TRX_UNDO_PAGE_START

開始存儲undo日志的位置

TRX_UNDO_PAGE_FREE

結(jié)束標志

TRX_UNDO_PAGE_NODE

雙向鏈表的指針

第一個頁在undo log段的回滾日志段頭:

其中各個參數(shù)的含義為:

參數(shù)名稱

含義

TRX_UNDO_STATE

undo段五種狀態(tài),包括TRX_UNDO_ACTIVE\CACHED\TO_FREE\TO_PURGE\PREPARED

TRX_UNDO_LAST_LOG

最后一個undo日志的偏移位置

TRX_UNDO_FSEG_HEADER

undo段inode信息

TRX_UNDO_PAGE_LIST

段鏈表的首地址

其中undo log段的狀態(tài)有五種:

5、回滾日志頭undologheader

這是回滾日志的頭,在第一頁的update undo log中有幾個undo log headers。同樣定義在trx0undo.h中,它的宏定義如下:

整理并解釋其中的含義:

參數(shù)名稱

含義

TRX_UNDO_TRX_ID

存儲當前undo日志對應(yīng)事務(wù)的事務(wù)id

TRX_UNDO_TRX_NO

事務(wù)序列號

TRX_UNDO_DEL_MARKS

刪除記錄標記

TRX_UNDO_LOG_START

存儲當前頁面中第一個undo日志的開始位置

TRX_UNDO_XID_EXISTS

標記的當前日 志中有沒有包含xid事務(wù)

TRX_UNDO_DICT_TRANS

標記當前事務(wù)是不是DDL,在回滾時判斷如何操作

TRX_UNDO_TABLE_ID

表id

TRX_UNDO_NEXT_LOG

鏈接指向下一個undo日志

TRX_UNDO_PREV_LOG

指向上一個undo日志,構(gòu)成雙向鏈表

TRX_UNDO_HISTORY_NODE

存儲history list中的雙向鏈表,鏈表首地址

6、兩種undolog格式

undo log格式有兩種:

  • insert undo log
  • update undo log

其中,insert操作會產(chǎn)生insert undo log。因為隔離性的要求,insert操作只對事務(wù)本身可見,對其他事務(wù)不可見。并且undo log可以在事務(wù)提交后直接刪除,不需要進行purge操作。

update和delete操作都會產(chǎn)生update undo log。對于update操作很簡單,就是將舊版本的值修改為新版本的值,并且將舊版本的記錄保存到undo log中;對于delete操作完后并不是真正的刪除該行數(shù)據(jù),而是將該行的數(shù)據(jù)存在undo log中,并且將標記位delete置為true,以備回滾時可以根據(jù)標記位進行逆操作,這樣就能夠找回之前的舊數(shù)據(jù),起到回滾的作用。

在delete中又分為三種情況:

purge線程兩個主要作用是:清理undo頁和清除page里面帶有delete_bit標識的數(shù)據(jù)行。在InnoDB中,事務(wù)中的delete操作實際上并不是真正的刪除掉數(shù)據(jù)行,而是在記錄上標識delete_bit,而不是真正刪除記錄,真正的刪除工作需要后臺purge線程去完成。

下面是兩種undo log記錄的具體的結(jié)構(gòu):

二、數(shù)據(jù)結(jié)構(gòu)

與undo log相關(guān)的數(shù)據(jù)結(jié)構(gòu)有trx_sys_t、trx_rsegs_t 、trx_t、trx_rseg_t、trx_undo_t、trx_undo_ptr_t等結(jié)構(gòu),其中比較重要的結(jié)構(gòu)有兩個:trx_rseg_t和trx_undo_t。trx_rseg_t保存回滾段的信息,trx_undo_t保存關(guān)于回滾日志的信息。

通過兩種方式找到回滾日志:

結(jié)論:

1、從全局變量trx_sys中的回滾段數(shù)組rseg_array中的回滾鏈表update-undo_list中指針(trx_sys->rseg_array[N]->update_undo_list->start)以及當前事務(wù)trx中的回滾段指針rsegs中的slot槽區(qū)m_redo中的undo log(trx->rsegs->m_redo->update_undo)都可以找到相應(yīng)的回滾段中的回滾日志。

2、事務(wù)id、回滾段id、page_no遞增。

1、trx_rseg_t

回滾段的內(nèi)存對象的類型是一個叫trx_rseg_t的結(jié)構(gòu),它定義在trx0rseg.h文件中,它的各成員有:

成員變量

解釋

ulint id;

回滾段id

RsegMutex mutex;

回滾段mutex,保護

ulint space;

回滾段頭空間

ulint page_no;

回滾段頁碼

page_size_t page_size;

頁面大小

ulint max_size;

允許的最大頁大小

ulint curr_size;

當前頁的大小

UT_LIST_BASE_NODE_T(trx_undo_t) update_undo_list;

update回滾日志鏈表

UT_LIST_BASE_NODE_T(trx_undo_t) update_undo_cached;

為快速重用而緩存的update回滾日志鏈表

UT_LIST_BASE_NODE_T(trx_undo_t) insert_undo_list;

insert回滾日志的字段

UT_LIST_BASE_NODE_T(trx_undo_t) insert_undo_cached;

為快速重用而緩存的insert undo log鏈表

ulint last_page_no;

最后一個尚未清除的日志頁碼

ulint last_offset;

最后一個尚未清除的日志頭的字節(jié)偏移量

trx_id_t last_trx_no;

最后一個尚未清除的日志的事務(wù)號

ibool last_del_marks;

判斷最后一個尚未清除的日志是否要清除

ulint trx_ref_count;

跟蹤rseg分配事務(wù)的參考計數(shù)器

bool skip_allocation;

如果為真,則跳過分配此rseg

update\insert_undo_list 用于保存產(chǎn)生的回滾日志,update\insert_undo_cached用于快速重用而緩存的回滾日志鏈表。當確定回滾日志無用時,會將回滾日志從update\insert_undo_list中摘除,放到相應(yīng)的cached鏈表中。

2、trx_undo_t

回滾日志的內(nèi)存對象的類型是一個叫trx_undo_t的結(jié)構(gòu),它定義在trx0undo.h文件中,它的各成員有:

成員變量

解釋

ulint     id;

回滾段內(nèi)的回滾日志槽號(slot)

ulint     type;

類型。TRX_UNDO_INSERT\UPDATE

ulint     state;

相應(yīng)的回滾日志段的狀態(tài)

ibool del_marks;

刪除標記

trx_id_t     trx_id;

事務(wù)id

XID     xid;

open XA事務(wù)識別

ibool dict_operation;

是否是dict操作

table_id_t table_id;

設(shè)置表ID

trx_rseg_t* rseg;

回滾日志所屬的rseg回滾段

ulint     space;

放置回滾日志的空間id

page_size_t page_size;

回滾日志中標題頁的大小

ulint     hdr_page_no;

回滾日志中標題頁的頁碼

ulint      hdr_offset;

頁面上回滾日志的header偏移量

ulint     last_page_no;

登錄日志中最后一頁的頁碼

ulint     size;

當前頁的大小

ulint     empty;

回滾日志記錄堆棧當前是否為空

ulint     top_page_no;

鏈接最近撤消日志記錄的頁碼

ulint     top_offset;

最新回滾記錄的偏移量

undo_no_t top_undo_no;

最新的回滾記錄的編號

buf_block_t* guess_block;

猜測可能位于首頁的緩沖區(qū)

ulint     withdraw_clock;

存儲guess_block時緩沖池的退出時鐘值

UT_LIST_NODE_T(trx_undo_t) undo_list;

回滾段中的回滾日志對象鏈表

回滾段指針包括回滾段的id、日志所在的page no、以及page內(nèi)偏移量。通過回滾段的指針就能夠找到這個回滾段,通過回滾日志的槽號、頁碼、回滾記錄編號和偏移量就能定位到這條回滾日志。

undo_list用于將此類型的undo log鏈接到undo log list中。

UT_LIST_NODE_T(trx_undo_t) undo_list鏈表中有兩個指針,分別為prev和next,用于將此undo log鏈接到undo log list中。

總結(jié)

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

相關(guān)文章

最新評論