当前位置: 首页 > 网络应用技术

d庖庖innodb撤消日志

时间:2023-03-07 00:15:28 网络应用技术

  简介:撤消日志是InnoDB的重要组成部分。它的角色贯穿InnoDB的两个主要部分,并并发控制和崩溃恢复。本文将从其角色,设计思想,记录内容,组织结构和各种功能中引入InnoDB中的撤消日志。

  作者|汉的来源|阿里技术公共帐户

  撤消日志是InnoDB非常重要的一部分。它的角色贯穿InnoDB的两个最重要的部分,并提供并发控制和崩溃恢复。本文将在其角色,设计思想,记录内容,组织结构和各种功能方面介绍撤消日志。替换特定的代码。本文章基于MySQL 8.0,但是在大多数设计思想中,MySQL的版本是一致的。考虑有限的空间并避免了过多信息的干扰,它可以集中于撤消日志本身的内容。本文具有中风或有意省略了一些内容,包括索引,事务系统,临时表,XA事务,虚拟列,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录,外部记录和外部记录,外部记录,外部记录以及外部记录以及外部记录记录,外部记录和外部记录以及外部记录。

  过去和现在的生命中提到的数据库故障恢复机制用于在每次修改之前记录历史值,并将重做日志用于故障恢复。这是Innodb中撤消日志的第一角色:

  1交易回滚

  在设计数据库时,我们假设数据库可能由于硬件故障,软件错误,操作和维护操作以及其他原因而突然崩溃。这次,一些尚未提交的数据可能已将其写入磁盘中。如果未经处理,它将违反原子的保证,也就是说,任何交易的修改要么提交或取消。提交的,即无知的策略。一方面,这种方法会导致大量的记忆空间压力,另一方面,在提交时,大量随机IO将极大地影响性能。因此,在数据库实现中,撤消日志是在正常交易中连续编写的,以记录此修改之前的历史值。当崩溃确实发生时,您可以在恢复过程中清除通过撤消日志的未扰动交易的修改。INNODB使用这种方式。

  由于已经有一个撤消日志,该日志在正常操作中自然而然地恢复崩溃时支持交易滚动,因此也可以完成交易的这一部分的滚动。

  2 MVCC(多反之亦然控制)

  在浅层数据库并发控制机制中,为了避免交易和交易书写之间的冲突,避免写作操作并等待读取操作,几乎所有主流数据库都使用多个并发控制(MVCC)。是为每个记录保存多个历史数据以读取交易。新写作只需要添加新版本,无需等待。InNODB已重复使用撤消日志中记录的历史版本以满足MVCC的需求。

  基于页面的重做日志在InnoDB的重做日志中说明可以更好地支持并发重做应用程序,从而缩短数据库的崩溃恢复时间。对于撤消日志,InnoDB使用撤消日志来实现MVCC。DB在DB的操作过程中可以存在于历史版本中。因此,当崩溃恢复使用撤消日志事务时,可以在背景中滚动背景,并且在正常运行时是异步的,以便还原数据库首先要进行服务。因此,撤消日志的设计思想与重做日志不同。撤消日志需要交易之间的并发性和方便的多次数据维护。替换逻辑不想由于DB的物理存储而更改。因此,InnoDB中的撤消日志使用基于事务的逻辑日志记录。

  同时,更多的责任意味着更复杂的管理逻辑。InnoDB实际上使用undo作为数据来维护和使用,也就是说,撤消日志本身就像其他数据库数据一样,它将编写自己的通信。应该是撤消数据。

  每当InnoDB需要修改记录时,其历史版本都会写入撤消日志中,相应的撤消记录是更新类型。当插入新记录时,没有历史版本,但是为了方便交易的方便,当交易向后回滚时,反向操作仍将编写插入式启动记录。

  1个插入类型撤消记录

  此撤消记录对应于代码中的TRX_UNDO_INSERT_REC类型。从撤消记录,更新类型,Insert undo记录仅准备可能进行交易,并且它在MVCC函数中不扮演角色。因此,您只需要记录相应记录的钥匙是在回滚时找到记录位置。

  撤消数字是撤消数量的增加数量,该数字用于指示哪个表修改是尚不确定的。在这里,您需要记录记录的完整主要密钥信息。回滚时,您可以通过此信息在索引中找到相应的记录。此外,两个字节用户记录了他们的序幕,并在撤消记录的头部和结尾处记录了撤消记录。

  2更新类型撤消记录

  由于MVCC需要保留多个记录的历史版本,因此当记录的历史版本仍在使用时,该记录无法真正删除。因此,当删除时,实际上只是在修改相应记录的删除标记。,如果此时重新插入此记录,实际上,它只是为了修改删除标记,即,将这两种情况的删除和插入转换为更新操作。与常规记录修改相结合,此处的“更新撤消记录”将对应于trx_undo_upd_exist_rec,trx_undo_del_mark_rec和trx_undo_undo_upd_del_rec.their存储内容相似的三种类型。

  除了与插入启动记录和主要密钥归档的同一头和尾部信息外,更新撤消记录也增加了:

  上面介绍了撤消记录中商店的内容。每个修改将至少生成一个撤消记录。因此,您如何组织大量的撤消记录以支持有效的访问和管理。我们将从几个级别中来自多个级别。引言:首先,逻辑组织方法而不考虑物理存储;之后,物理组织方法介绍了如何将其存储到实际的16KB物理块中;然后,文件组织方法介绍了整体文件结构;最终将其引入IT。在内存中组织。

  1逻辑组织方法-Undo日志

  每个交易实际上将修改一组记录,相应的集合将产生一组撤消记录。这些撤消记录的结局将形成此事务的撤消日志。在撤消记录外,还添加了撤消日志标头以记录一些必要的控制信息。因此,撤消日志的结构如下所示:

  在撤消日志标头中,记录了此撤消日志事务的TRX ID;TRX NO是提交交易的顺序,这也将使用它来确定是否可以放置。这将在稍后详细介绍; TRX_UNDO_DEL_MARK_REC类型撤消记录,以避免清除时不必要的扫描;在日志起始办公室记录撤消日志标头的末端,当标头添加内容时,它是兼容的;然后一些标志信息;下次和之后的下一个撤消日志和上一条撤消日志undo undo日志,接下来将介绍这一点;最终将自己安装在历史列表节点上准备的历史列表。

  指数中的相同记录通过不同的交易来修改,这将产生不同的历史版本。这些历史版本通过MVCC的RollPTR列入链接列表。如下所示:

  在示例中,表t上有三个交易。主要密钥ID是1的记录。首先,所有归档的价值改革是B和C.I,J和K具有其自己的三个连续撤消日志的逻辑,每个撤消日志都有自己的撤消日志标头。从沿Rollptr的索引,您可以在序列中的撤消日志中找到此记录的历史版本。在同一时间,可以看出只有相应的主钥匙值记录在插入类型撤消记录中:id = 1,更新类型的撤消记录还记录了生成事务TRX_ID的相应历史版本,并且历史修改的字段是历史记录值。

  2个物理组织格式-Undo细分

  以上描述了撤消日志结构。将无法控制的将产生交易本身的撤消日志,但磁盘最终被写成固定大小。携带不规则的撤消日志的大小以实现有效的空间分配和重用以避免空间浪费。innodb的基本思想是在撤消页面中制作多个较小的撤消日志紧凑型,并且较大的撤消日志是连续编写的,需要分发足够的撤消页面。LET查看此部分的物理存储方法:

  如上所示,它是撤消段的图表。在每次交易开始写操作之前,您需要保留一个撤消段,磁盘空间分配和释放撤消段中的所有磁盘空间,即16KB页面的应用和发布,Allit由FSP段管理,该段是由FSP段管理的与索引中的叶节点段和非叶流节段的管理方法一致。此部分将在此部分之后单独引入。

  撤消片段将至少保存一个撤消页面,每个撤消页面将以38个字节至56字节的启动页面标头开始,该字节记录了撤消页面的类型,最后一个撤消记录的位置,并且当前页面也是空闲的。也就是说,下一个撤消记录是编写的。撤消段中的第一个撤消页面还将在56个字节至86字节中记录撤消段标头。这是该撤消细分市场中磁盘空间管理管理的手柄;记录该撤消段的地方,例如等待;这个撤消部门的最后一个撤消记录位置;此FSP段的标题以及当前分配的所有撤消页面的链接列表。

  撤消页面的其余空间用于存储撤消日志。对于简短的撤消日志,例如撤消log 1,撤消日志2作为上述log log和undo log 3之类的长撤消日志可能会分配多个撤消页面以存储它。在第一页。

  3文件组织-Undo Tabrespace

  每当撤消细分市场都通过交易垄断时,每个写作交易至少有一个撤消细分市场。当有大量交易时,会有多个撤消段。InnoDB中的撤消文件会准备大量的撤消段插槽,并根据1024 set将其分为回滚片段。eastundo tablespace最多包括128个回滚段,并且撤消tabrespace文件中的第三页将被固定为这128个回滚段的目录,即回滚段arrary heode.head.head.header。帐户为四个字节,指向撤消段的第一页。此外,它还将记录在回滚段中提交的历史记录列表。随后的清除过程将从此处开始回收。

  可以看出,回滚段的数量将直接影响InnoDB支持的最大交易数。撤回空间的回收。number。如下所示:

  4记忆组织结构

  上面的描述是磁盘上撤消数据的组织结构。此外,相应的数据结构还将在内存中维护以管理撤消日志,如下图所示:

  对应于每个磁盘撤消表空间,将有一个下::表空间内存结构。主要的是一组TRX_RSEG_T。TRX_RSEG_T对应于上面引入的回滚段头。除了一些基本的元信息外,TRX_RSEG_T还维护四个trx_undo_t的链接列表。在“更新列表”中,用于编写更新类型撤消的撤消段;更新缓存列表中有更多的可用空间。相应的,插入列表和插入缓存列表是正在使用的插入类型启动段,并且插入类型undo segment的许多空格可以通过后续重复使用来重复使用因此,trx_undo_t对应于上面引入的撤消段。接下来,我们将介绍Innodo的字符和功能,从undo的写作,dumo for for for for for Rollback,MVCC,MVCC,Crash Recovery和如何清理撤消。

  在撰写交易开始时,它将首先通过TRX_ASSIGN_RSEG_DU护士分配回滚段。事务的内存结构还将通过RSEGS指针指向相应的TRX_RSEG_T存储器结构。这里的分配策略很简单,也就是说,尝试下一个活动的回滚segmennanennent。首次真正生成修改后,它需要编写撤消记录,您将调用TRX_UNDO_ASSIGN_UNDO来获取撤消段。将优先考虑在trx_rseg_t中重用trx_undo_t,这是已分配但未使用的撤消段。如果您不调用trx_undo_create创建一个新的撤消段,则在trx_undo_create中,您可以选择可用的当前回滚段。Slot也值得fil_nul的插槽,申请新的撤消页面,初始化dopo page header,upo undo header,uto undo header,undo段标题和其他信息。创建一个新的TRX_UNDO_T内存结构,然后将其挂在TRX_RSEG_T的相应列表中。

  在获得可用的撤消段后,交易将在正确位置初始化其撤消日志标头。之后,所有修改后的撤消记录将通过trx_undo_report_report_operation..或更新类型的顺序写入当前的撤消日志中主键插入记录。除了主钥匙的记录外,还将有一个更新的历史值和索引值的记录。当前撤消记录位置的RollPTR将返回到索引索引的记录。

  页面已满时,将调用TRX_UNDO_ADD_PAGE,以在当前的撤消段中添加新页面。新页面写入撤消页面标题以继续交易并将其写入撤消记录。为了促进维护,这里有一个限制。不要跨页面,如果您不能放手,整个撤消记录将写入下一页。

  交易结束后,如果仅占用一个撤消页面,并且当前的撤消页面使用空间小于该页面的3/4,则此撤消段将保留并添加到相应的插入/更新cached list.Otherwise.thise.ch.otherwise.,将直接回收插入类型撤消段,并且更新类型的撤消段将在清除完成后等待清除。您可以返回用户结果,并且不会再次处理崩溃恢复。

  InnoDB中的交易可能会触发用户的回滚;这也可能是由于死亡锁的异常。或者,如果发生崩溃,则在重新启动后,未构成的事务会滚回去。在撤消级别,这些滚动操作是相同的。基本过程是从背面的交易的撤消日志中读取撤消记录,并根据内容进行反向操作以还原索引记录。

  滚动入口是函数row_undo,其中将调用TRX_ROLL_POP_TOP_REC_OF_TRX的第一个撤消记录并删除交易问题。如示例所示,撤消日志包括三个撤消记录。其中,记录1在撤消第1页中,在撤消第2页中,首先使用从撤消段标头录制的页面列表来查找当前事务的最后一个撤消页面。在撤消第2页的标题上的自由空间办公室的位置。当然,这两个值在top_page_no和trx_undo_t.use prev记录办公室的top_page_no和top_offset中找到撤消记录3.完成相应的回滚操作后,您可以找到先前通过以前的订单指针录制办公室进行撤消记录,并按顺序进行处理。处理当前页面中的所有撤消记录后,然后在撤消页面标题中的列表中找到上一个撤消页面,重复上一个过程,并完成所有交易中所有撤消记录的回滚。

  在获得撤消记录后,自然而然地,对其内容的分析。在这里,您将调用Row_undo_ins_parse_undo_rec。获取从撤消记录的修改线,以分析IT中记录的主要密钥信息。

  删除当前行。

  对级别索引的影响可能包括删除的第二级索引记录,删除删除标记,或在修改之前使用Update Vector中的DIFF信息修改上一个值。经过调用row_undo_mod_mod_clust,它还使用diff信息。记录在更新矢量中,以将上一个值修改为上一个值。

  完成滚动撤消日志部分后,将要求trx_roll_try_truncate进行回收,并且不再使用trx_undo_free_last_page的页面将磁盘空间返回到撤消段。

  多个版本的目的是避免等待写作和阅读事务,然后每个阅读交易都需要找到相应的历史版本,应在没有记录和锁定的情况下看到。SO所谓的历史版本假设在交易开始时,拍摄了整个DB的快照,并从该快照中获得了所有交易的读数。这次是太高的。INNODB的方法是在第一次阅读交易时获得ReadView,并且它一直保持它,该方法记录了所有当前活动的写作交易ID。由于交易的ID是自我提出的,因此通过此时刻,我们可以通过此读取浏览,这是提交交易并仍在运行的。根据阅读社区的要求,不应看到不交易的修改。相应地,应看到传输交易的修改。

  作为存储历史版本的撤消记录,记录的TRX_ID是由此可见判断做出的,相应的主索引记录也具有此值。当交易用于使用自己的ReadView访问手表索引上的记录时,您将通过比较记录中的TRX_ID来确定是否是可见版本。如果您不可见,您可以找到Moreold历史版本。如下图所示,交易R需要查询T。T上的ID上的记录。在T的开头。在R的开头,交易I已提交,交易j仍在运行,交易k尚未开始,信息记录在事务r.in readview中。事务r从索引找到相应的记录[1,c],并相应trx_id是k,它是不可见的。请沿rollptr沿uno [1,b]的先前版本,相应的trx_id是j,j不见。,结果返回。

  如前所述,作为逻辑日志,撤消中两个版本的两个版本的记录实际上是完整的记录内容。在撤消记录中的DIFF内容依次构建相应的历史版本。此过程在函数row_search_mvcc中。其中,trx_undo_prev_version_build将根据当前的rollptr.purge的位置找到相应的撤消记录位置,表明它将直接返回。主密钥信息,diff信息更新向量和其他信息。在通过row_upd_rec_in_place之后,使用更新矢量来修改当前持有的当前记录中的信息,并获取记录的历史版本。ReadView。如果您可以看到它,请返回user.com,完整阅读此历史版本。

  当崩溃恢复时,您需要使用撤消中的信息来滚动未构成交易的所有影响,以确保数据库的失败原子。如前所述,InnoDB中的UNO实际上是像数据一样处理的,可以从上述撤消本身的组织结构比重做日志复杂得多,这在交易中更复杂,不是在组织的顺序中,而不是按顺序而不是顺序进行。它像Innodb中的其他数据一样,需要如在Innodb的重做日志中所描述的那样,可以由Redo保证。在某些MLOG_2Bytes中,MLOG_4BYTES类型,撤消本身还具有自己的重做日志类型:MLOG_UNDO_INIT类型类型记录初始化nuffo Page usix usix neuck usix neuck juilts nipply;分配撤消日志时,您需要重复使用撤消日志标头或需要创建一个新的新Ones时,它将记录MLOG_UNDO_HDR_REUSE和MLOG_UNDO_UNDO_HDR_CREATE的重做记录;MLOG_UNDO_INSERT是最常见的。新的撤消记录以撤消日志中的undo编写; mlog_undo_erase_end对应于撤消页面的撤消日志。

  如果数据库故障恢复机制的上一世中提到的白羊座过程,崩溃恢复过程将首先替换所有重做日志,并且整个撤消磁盘组织结构也将用作数据类型。恢复了这些重做类型的更换。通过在撤消片段标题中读取状态,您可以知道,在崩溃之前,保持此撤消段交易状态。如果是trx_undo_active,则意味着交易需要在当时卷回去,否则,这意味着事务已有结束并可以继续清除撤消片段的逻辑。在可以恢复撤消日志内存组织模式,包括活动交易的内存结构TRX_T,回滚段的内存结构TRX_RSEG_T和四个链接的列表trx_undo_t。

  在崩溃恢复完成之前,它将开始在srv_dict_recover_on_restart中启动异步回滚线程。

  我们已经知道,InnoDB保留了MVCC最初实施的撤消日志中的许多历史版本。当历史版本确认将不会被任何现有和将来的交易看见,应清理。,增量编号trx_no将用作提交序列序列号,并且每次阅读交易将记录您在readview中启动时看到的最大trx_no,如果是m_low_limit_no.o.so读取交易,readview中的m_low_limit_no,表明该交易已在所有阅读开始之前提交。可以清理此交易的版本。,因此所有交易都可以通过索引或第一个撤消历史版本中的版本来满足。

  清理撤消的清洁由特殊的背景线程SRV_PURGE_COORDIRDIREAD进行扫描和分发,并且由多个SRV_Worker_thread.coordinator真正清除了它,将首先扫描Innodb_purge_batch_size trx_purge_purge_purge_attach_undo_recs,并分配了一个Undo condos ando condos ando condos ando condist ando condist ando condist。

  1扫描一批清理撤消记录

  在交易结束时,需要更新类型的撤消日志将根据交易的顺序安装在回滚段标头的历史记录列表上。撤消日志回收的基本思想是根据TRX_NO从小到大的说法,它遍历所有撤消日志以依次清理。如前所述,InnoDB中有多个回滚段,因此会有多个历史记录列表。每个历史记录列表内部交易都是有序的,但是您需要从多个历史记录列表中找到一个TRX_NO全局有序序列,如下图所示,如下图所示:

  该图中的交易编号是根据InnoDB引入一堆结构purge_queue,该结构用于查找所有hestory list中的最小trx_no的下一个交易。历史。当前回滚段上的下一个撤消日志上的push_queue等待后续顺序。处理过程和上面相应图的相应函数调用,如下图所示:

  其中,TRX_PURGE_GET_NEXT_REC将在撤消日志中从上到下遍历所有撤消记录。当前面提到的回滚时,这是从底部到顶部的遍历方向的相反。它仍然以相同的场景为例。两个撤消页面,撤消记录1在第1页中,撤消记录2,3在第2页中。如下图所示,首先,您会找到第一个撤消记录位置日志开始偏移,从当前的撤消日志标头。处理撤消记录1后,您可以沿着下一个记录偏移找到下一个撤消记录。通过页面列表节点找到下一页,在页面中找到第一个撤消记录,然后重复上述过程,直到找到所有撤消记录。

  对于想要清除的每个撤消记录,它也可能需要处理索引上的一些信息,然后才能真正删除该索引。这是因为在正常操作期间,当您需要删除唱片时,您可以通过Rollptr找到它。该记录并未真正删除,但是它具有删除标记的标记,并记录了撤消记录作为特殊更新操作。因此,撤消记录的清洁工作将分为两个过程:

  此外,当配置的独立启动表空间大于两个时,InnoDB通过重建来支持配置大小的撤消表空间:

  2在吹扫下

  此步骤主要针对TRX_UNDO_DEL_MARK_REC类型撤消记录,该记录用于真正删除索引上标记为删除标记的记录。工作人员将处理Row_purge函数中分配的每个撤消记录以循环分配的协调器。首先,通过row_purge_parse_undo_rec,分析类型,table_id,rollptr,录制记录的主要关键信息,然后又转向updaterccon。对于trx_undo_undo_del_mark_rec类型,请致电Row_purge_purge_remove_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_sec_if_poss,以删除所有内容,以删除所有delet deleted deleted allet delete delete辅助索引,调用主要索引中的row_purge_remove_clust_if_poss。添加,trx_undo_upd_exist_rec type undo undo不涉及主索引的删除,但可能需要删除第二级索引,该索引也需要处理此处。

  3撤消截断

  占用的磁盘空间是从历史记录列表中删除的。否则,这意味着正在使用或仍在使用CACHE(TRX_UNDO_CACHED类型)使用撤消段,因此仅通过TRX_PURGE_REMOVE_REMOVE_LOG_HD将其从历史记录列表中删除。

  撤消记录,这就是为什么我们从Show Engine InnoDB状态中看到的缩短撤消历史列表正在跳跃的原因。

  4个撤消表空间截断

  如果打开了Innodb_trx_purge_truncate配置,则功能TRX_PURGE_TRUNCATE还将尝试重建撤消表空间以减少文件空间占用。该表空间将通过trx_purge_inititiate_truncate进行重建,包括重建文件结构和内存结构在撤消表空间中,稍后将其标记为活动性并参与新交易的分配。

  本文首先介绍撤消日志的角色,然后在撤消记录中介绍内容,然后介绍其逻辑组织,物理组织,文件组织和内存组织方法。这些组织将更好地利用和维护撤消信息。在此基础上,在每个重要的DB功能中的作用和实施,包括滚动事务,MVCC,崩溃恢复,清除等。

  参考:

  /mysql/mysql-server [3] InnodB撤消登录和历史systemhttps://blog.jcole.us.us/2014/16/the-the-the-the-the-the--thenodb-undo-logingid-did-ando-did-and-di------------------------------------------------------------------------------------------------------------------------------dithistory-system/#:?:text = innodb%20 keeppes%20A%20 popy%20 every%20IS%20is%20is%20is%20is%20is%20 call%20NDO%20NDO%20NDO%20to%20TO%20TO%20 its%20PERVIAL%20previous%20previous%20previous%20pious%20ATS] mysql·发动机特征。·Innodb撤消日志漫游http://mysql.taobao.org/monthly/2015/04/01/ [5]数据库失败恢复机制的前世http://catkithub.io/2019/2019/2019/01/01/16/crash-recovery.html [6]分析数据库http://catkang.github.io/2018/09/19/concurrency-control.html [7]