阿里云数字新基建系列:云数据库架构
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.7 InnoDB undo日志

前面我们讲过,执行某个事务做数据变更时,会把页面的变化写入redo日志中。此时,若不想继续提交,而是想回滚之前的操作,怎么办呢?这时候就需要用到undo日志了。undo日志用来记录页面修改前的值,其作用有两个:

保证事务原子性,在回滚或事务异常时可以回溯到历史版本。

undo日志是实现MVCC(多版本并发控制)的必要条件。

InnoDB中的undo日志有两种分类格式,它们的purge机制不同。其中一种是insert undo log,它是插入操作产生的undo日志,事务提交后即可删除;另一种是update undo log,它是更新操作产生的undo日志,是实现MVCC机制的基础条件,事务提交后它会被挂到purge链表上等待清理。在线上,我们经常会遇到undo日志清理过慢导致空间上涨的问题,除非正常大事务未提交外,我们可以通过调整以下参数来加速清理。

innodb_purge_batch_size:控制purge线程每次清理undo页面的数量。

innodb_max_purge_lag:控制history list的长度,通过“show engine innodb status”可以查看当前history list的长度值。

innodb_max_purge_lag_delay:控制DML操作的最大延缓时间,防止purge操作赶不上DML操作。