我读到了关于InnoDB撤消日志的文章,在这个过程中,我读到的文章最终让我困惑于撤销日志是什么,以及它们与历史列表有何不同,或者更确切地说是相同的。
因此,引用MariaDB团队的第一篇文章,他们将历史列表定义为:
还有一个数据的全局历史列表。提交事务时,它的历史记录将添加到此历史记录列表中。列表的顺序是提交的时间顺序。
然后,在同一篇文章中,他们接着说了这一点,这给撤消日志、历史记录列表和表见撤消日志中的行视图之间的关系带来了更大的混乱:
了解撤销日志是如何工作的,有助于理解长事务的负面影响。
Percona的第二篇文章2将历史列表描述为:
历史记录列表长度6是撤消空间中未清除的事务数。随着执行更新的事务被执行,并且随着清除的运行而减少,它会增加。
最后,第三篇文章3.试图解决许多历史记录列表的混淆问题,但我认为,在区分撤消日志和历史记录列表方面带来了更多的混乱,第三篇文章是如何定义历史列表的:
单元的最佳名称(历史记录列表)是撤消日志,它是“更新提交事务的撤消日志”,引用源。但是“撤销日志”是一个特殊的术语,在InnoDB中有特定的含义。撤销日志是事务进行的一组原子更改,实际上可能会修改多个记录。
1在第一篇文章中添加了这一点,使我更加困惑:
了解撤销日志是如何工作的,有助于理解长事务的负面影响。
InnoDB撤消日志是否包含两种类型的数据,一种是作为链接列表存储的事务的行视图,另一种是历史列表,它跟踪缓冲池中提交的事务(尚未刷新到磁盘)?请有人帮助明确区分撤消日志,以及它们与行视图(为运行事务创建以供使用)和历史记录列表之间的关系?
[1] https://mariadb.com/kb/en/library/xtradbinnodb-undo-log/
[2] https://www.percona.com/blog/2006/07/17/show-innodb-status-walk-through/
[3] https://www.vividcortex.com/blog/2015/07/20/what-is-innodb-history-list-length/发布于 2019-04-11 12:08:00
我会对此大做文章:)我和我的同事们正在倾诉如何为这个问题做一个简洁而准确的回答;
关于撤消日志是什么,以及它们与历史记录列表有何不同,
在进行数据修改时会生成撤消日志。例如,如果事务使用INSERT、UPDATE、DELETE修改数据,它将为每个操作创建离散的撤消日志。事务提交后,MySQL可以自由地清除在该事务中创建的撤消日志。事务和撤销日志之间有一对多的关系(记住,每个操作都有一个)。
我的理解是,Innodb History List Length是撤销日志(S)中离散操作的计数。撤消日志是称为回滚段的结构的一部分,它位于全局表空间(ibdata1)或撤消表空间( MySQL 8.0中的一个最新特性)中。
InnoDB撤消日志是否包含两种类型的数据,一种是要作为链接列表存储的事务的行视图,另一种是历史记录列表。
不是的。撤消日志将包含关于如何将数据还原到以前的状态的说明,如果其他事务需要查看旧版本的行,则需要使用撤消日志(回滚指令)来满足其读取视图的范围,并显示数据的以前版本。
有一个后台清除操作(类似于Postgres真空),垃圾收集老化的撤消日志。它可能只会清除到最古老的活事务。
我希望我的回答能帮助你把事情看得更清楚一些。如果我能进一步整理,我会做编辑,或者如果有任何InnoDB专家希望加入,请这样做。
https://dba.stackexchange.com/questions/234540
复制相似问题