Documentation Home

14.6.3.4 撤消表空间

撤消表空间包含撤消日志,这些记录是包含有关如何撤消事务对聚集索引记录的最新更改的信息的记录集合。

撤销日志默认存储在系统表空间中,但也可以存储在一个或多个撤销表空间中。使用撤消表空间可以减少任何一个表空间中撤消日志所需的空间量。撤消日志的 I/O 模式也使撤消表空间成为SSD存储 的理想选择 。

undo 表空间的数量InnoDB 由该 innodb_undo_tablespaces选项控制。该选项只能在初始化 MySQL 实例时配置。之后无法更改。

笔记

innodb_undo_tablespaces 选项已弃用;希望在未来的版本中将其删除。

无法删除 撤消表空间和这些表空间内的各个 段。但是,可以截断存储在撤消表空间中的撤消日志。有关详细信息,请参阅 截断撤消表空间

配置撤消表空间

此过程描述如何配置撤消表空间。配置undo表空间后,undo日志存储在undo表空间中,而不是系统表空间中。

undo 表空间的数量只能在初始化 MySQL 实例时配置,并且在实例的生命周期内是固定的,因此建议您在将配置部署到生产系统之前,在具有代表性工作负载的测试实例上执行以下过程.

要配置撤消表空间:

  1. innodb_undo_directory 使用变量 指定撤消表空间的目录位置 。如果未指定目录位置,则在数据目录中创建撤消表空间。

  2. innodb_rollback_segments 使用变量 定义回滚段的数量 。从相对较低的值开始,然后随着时间的推移逐渐增加,以检查对性能的影响。默认设置为 innodb_rollback_segments128,这也是最大值。

    1个回滚段总是分配给系统表空间,32个回滚段保留给临时表空间(ibtmp1)。因此,要为撤消表空间分配回滚段,请设置 innodb_rollback_segments为大于 33 的值。例如,如果您有两个撤消表空间,请设置 innodb_rollback_segments为 35 以将一个回滚段分配给两个撤消表空间中的每一个。回滚段以循环方式分布在撤消表空间中。

    添加撤消表空间时,系统表空间中的回滚段将变为非活动状态。

  3. innodb_undo_tablespaces 使用该选项 定义撤消表空间的数量 。指定的撤消表空间数在 MySQL 实例的生命周期内是固定的,因此如果您不确定最佳值,请估计偏高。

  4. 使用您选择的配置设置创建一个新的 MySQL 测试实例。

  5. 在数据量与生产服务器相似的测试实例上使用真实的工作负载来测试配置。

  6. 对 I/O 密集型工作负载的性能进行基准测试。

  7. 定期增加 innodb_rollback_segments 并重新运行性能测试的值,直到 I/O 性能没有进一步改善。

截断撤消表空间

截断撤消表空间要求 MySQL 实例至少有两个活动的撤消表空间,这确保一个撤消表空间保持活动状态,而另一个被脱机以被截断。撤消表空间的数量由 innodb_undo_tablespaces 变量定义。默认值为 0。使用此语句检查 的值 innodb_undo_tablespaces

mysql> SELECT @@innodb_undo_tablespaces;
+---------------------------+
| @@innodb_undo_tablespaces |
+---------------------------+
|                         2 |
+---------------------------+

要截断撤消表空间,请启用该 innodb_undo_log_truncate 变量。例如:

mysql> SET GLOBAL innodb_undo_log_truncate=ON;

启用该 innodb_undo_log_truncate 变量后,超过该变量定义的大小限制的撤消表空间将 innodb_max_undo_log_size 被截断。该 innodb_max_undo_log_size 变量是动态的,默认值为 1073741824 字节 (1024 MiB)。

mysql> SELECT @@innodb_max_undo_log_size;
+----------------------------+
| @@innodb_max_undo_log_size |
+----------------------------+
|                 1073741824 |
+----------------------------+

innodb_undo_log_truncate 启用变量 时 :

  1. 超过设置的撤消表空间 innodb_max_undo_log_size 被标记为截断。选择要截断的撤消表空间以循环方式执行,以避免每次都截断相同的撤消表空间。

  2. 驻留在所选撤消表空间中的回滚段将变为非活动状态,以便它们不会分配给新事务。允许当前正在使用回滚段的现有事务完成。

  3. 清除系统通过释放不再使用 的撤销日志来清空回滚段。

  4. 在撤消表空间中的所有回滚段都被释放后,截断操作运行并将撤消表空间截断为其初始大小。撤消表空间的初始大小取决于该 innodb_page_size值。对于默认的 16KB 页面大小,初始撤消表空间文件大小为 10MiB。对于 4KB、8KB、32KB 和 64KB 页面大小,初始撤消表空间文件大小分别为 7MiB、8MiB、20MiB 和 40MiB。

    由于在操作完成后立即使用,截断操作后撤消表空间的大小可能大于初始大小。

    innodb_undo_directory 变量定义撤消表空间文件的位置。如果该innodb_undo_directory 变量未定义,则撤消表空间驻留在数据目录中。

  5. 回滚段被重新激活,以便它们可以分配给新的事务。

加快撤消表空间的截断

清除线程负责清空和截断撤消表空间。默认情况下,清除线程查找撤消表空间以每调用清除 128 次截断一次。清除线程查找要截断的撤消表空间的频率由 innodb_purge_rseg_truncate_frequency 变量控制,该变量的默认设置为 128。

mysql> SELECT @@innodb_purge_rseg_truncate_frequency;
+----------------------------------------+
| @@innodb_purge_rseg_truncate_frequency |
+----------------------------------------+
|                                    128 |
+----------------------------------------+

要增加频率,请减小 innodb_purge_rseg_truncate_frequency 设置。例如,要让清除线程每 32 次调用清除一次查找撤消表空间,请设置 innodb_purge_rseg_truncate_frequency 为 32。

mysql> SET GLOBAL innodb_purge_rseg_truncate_frequency=32;

当清除线程发现需要截断的撤消表空间时,清除线程以更高的频率返回以快速清空并截断撤消表空间。

截断撤消表空间文件的性能影响

当撤消表空间被截断时,撤消表空间中的回滚段将被停用。其他撤消表空间中的活动回滚段承担整个系统负载的责任,这可能会导致轻微的性能下降。性能受影响的程度取决于许多因素:

  • 撤消表空间数

  • 撤消日志数

  • 撤消表空间大小

  • I/O 子系统的速度

  • 现有的长期运行的事务

  • 系统负载

避免潜在性能影响的最简单方法是增加撤消表空间的数量。

此外,在撤消表空间截断操作期间执行两个检查点操作。第一个检查点操作从缓冲池中删除旧的撤消表空间页面。第二个检查点将新撤消表空间的初始页面刷新到磁盘。在繁忙的系统上,如果要删除大量页面,第一个检查点尤其会暂时影响系统性能。

撤消表空间截断恢复

撤消表空间截断操作会在服务器日志目录中创建一个临时 文件。该日志目录由. 如果在截断操作期间发生系统故障,临时日志文件允许启动过程识别被截断的撤消表空间并继续操作。 undo_space_number_trunc.loginnodb_log_group_home_dir