Innodb Undo Record Insert Update


赵明寰 https://whoiami.github.io/


0, Basic

本文主要介绍Undo Segment 的申请流程,以及后续的Insert Undo Record 和Update Undo Record 的写入流程。Innnodb 内部对于Undo Record 分为 Insert 类型和Update 类型, 对于Delete 操作是包含在Update 类型当中的。Undo Record 的格式由于历史原因修改的版本比较多,看起来比较繁琐,这里基于8.0.27统一整理Undo Insert Update Record 格式,方便更好理解Undo的内部逻辑。


1, Undo Segment 的内存结构

每个事务内部会有trx_rsegs_t 这样一个结构来存放分配的rollback segment 和分配的undo segments。

trx_rsegs_t 内部给了两个结构,trx_undo_ptr_t m_redo是为非临时表提供的指针。trx_undo_ptr_t m_noredo 是临时表提供的指针。

trx_undo_ptr_t 内部是rollback segment 和undo segments 指针。如果一个事物既有insert 操作,又有update 操作,那么其内部会被分配两个undo segment, 分别存放insert undo record 和update undo record。这样操作主要是为了后续清理undo record方便。

struct trx_t { ... trx_rsegs_t rsegs; /* rollback segments for undo logging */ } /** Rollback segments assigned to a transaction for undo logging. */ struct trx_rsegs_t { /** undo log ptr holding reference to a rollback segment that resides in system/undo tablespace used for undo logging of tables that needs to be recovered on crash. */ trx_undo_ptr_t m_redo; /** undo log ptr holding reference to a rollback segment that resides in temp tablespace used for undo logging of tables that doesn't need to be recovered on crash. (临时表分配)*/ trx_undo_ptr_t m_noredo; }; /**Represents an instance of rollback segment along with its state variables.*/ struct trx_undo_ptr_t { trx_rseg_t *rseg; /*!< rollback segment assigned to the transaction, or NULL if not assigned yet */ trx_undo_t *insert_undo; /*!< pointer to the insert undo log, or NULL if no inserts performed yet */ trx_undo_t *update_undo; /*!< pointer to the update undo log, or NULL if no update performed yet */ };