InnoDB 历史记录列表长度显著增加 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

InnoDB 历史记录列表长度显著增加

date 开始,您的行更改历史记录列表显著增加,最大达到 db-instance 上的 length。这一增加会影响查询和数据库关闭性能。

支持的引擎版本

Aurora MySQL 的所有版本都支持这些见解信息。

上下文

InnoDB 事务系统维护多版本并发控制(MVCC)。修改行时,正在修改的数据的预修改版本将作为撤消记录存储在撤消日志中。每条撤消记录都引用其先前的重做记录,形成一个链接的列表。

InnoDB 历史记录列表是已提交事务的撤消日志的全局列表。当事务不再需要历史记录时,MySQL 使用历史记录列表来清除记录和日志页面。历史记录列表长度是包含历史记录列表中的修改的撤消日志总数。每个日志包含一个或多个修改。如果 InnoDB 历史记录列表长度过大,表明有大量的旧行版本,则查询和数据库关闭会变得更慢。

这个问题的可能原因

历史记录列表较长的典型原因包括以下几点:

  • 长时间运行的事务,无论是读取还是写入

  • 繁重的写入负载

操作

根据见解的原因,我们建议采取不同的操作。

在 InnoDB 历史记录列表减小之前,不要开始任何涉及数据库关闭的操作

由于 InnoDB 历史记录列表较长会减慢数据库关闭速度,因此请在启动涉及数据库关闭的操作之前减小列表大小。这些操作包括主要版本数据库升级。

识别并结束长时间运行的事务

您可以通过查询 information_schema.innodb_trx 来找到长时间运行的事务。

注意

还要确保在只读副本上查找长时间运行的事务。

识别并结束长时间运行的事务
  1. 在 SQL 客户端中,运行以下查询:

    SELECT a.trx_id, a.trx_state, a.trx_started, TIMESTAMPDIFF(SECOND,a.trx_started, now()) as "Seconds Transaction Has Been Open", a.trx_rows_modified, b.USER, b.host, b.db, b.command, b.time, b.state FROM information_schema.innodb_trx a, information_schema.processlist b WHERE a.trx_mysql_thread_id=b.id AND TIMESTAMPDIFF(SECOND,a.trx_started, now()) > 10 ORDER BY trx_started
  2. 使用 COMMITROLLBACK 命令结束每个长时间运行的事务。

使用性能详情确定首要主机和主要用户。

优化事务,以便立即提交大量修改后的行。

相关指标

以下指标与此见解相关: