14.6.3.4 撤消 table 空间

撤消 table 空间包含撤消日志,撤消日志是撤消日志记录的集合,其中包含有关如何通过事务撤消对聚集索引记录的最新更改的信息。撤消日志存在于撤消日志段中,撤消日志段中包含撤消日志段。 innodb_rollback_segments变量定义分配给每个撤消 table 空间的回滚段的数量。

Undo logs可以存储在一个或多个undo tablespaces中,而不是system tablespace中。此布局不同于 undo 日志位于system tablespace中的默认配置。撤消日志的 I/O 模式使撤消 table 空间成为SSD存储的理想候选者,同时将系统 table 空间保留在硬盘存储上。

InnoDB使用的撤消 table 空间的数量由innodb_undo_tablespaces配置选项控制。仅在初始化 MySQL 实例时才能配置此选项。此后无法更改。

Note

innodb_undo_tablespaces配置选项已弃用,在以后的版本中将被删除。

撤消 table 空间和这些 table 空间中的单个segments不能删除。但是,存储在撤消 table 空间中的撤消日志可以被截断。有关更多信息,请参见截断撤消 table 空间

配置撤消 table 空间

要为 MySQL 实例配置撤消 table 空间,请执行以下步骤。假定您在将配置部署到生产系统之前正在测试实例上执行该过程。

Important

撤消 table 空间的数量只能在初始化 MySQL 实例时配置,并且在实例生命周期内是固定的。

  • 使用innodb_undo_directory配置选项为撤消 table 空间指定目录位置。如果未指定目录位置,则在数据目录中创建撤消 table 空间。

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

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

配置单独的撤消 table 空间时,系统 table 空间中的回滚段将变为非活动状态。

  • 使用innodb_undo_tablespaces选项定义撤消 table 空间的数量。在 MySQL 实例的生命周期中,指定的还原 table 空间数量是固定的,因此,如果不确定最佳值,请从高端进行估算。

  • 使用您选择的选项值创建一个新的 MySQL 测试实例。

  • 在测试实例上使用实际的工作负载,并使用与生产服务器类似的数据量来测试配置。

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

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

截断撤消 table 空间

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

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

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

mysql> SET GLOBAL innodb_undo_log_truncate=ON;

启用innodb_undo_log_truncate变量后,超过innodb_max_undo_log_size变量定义的大小限制的撤消 table 空间将被截断。 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变量后:

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

  • 驻留在选定撤消 table 空间中的回滚段将变为非活动状态,以便不将其分配给新事务。允许当前正在使用回滚段的现有事务完成。

  • purge系统释放不再使用的回滚段。

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

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

innodb_undo_directory变量定义撤消 table 空间文件的位置。如果未定义innodb_undo_directory变量,则撤消 table 空间位于数据目录中。

  • 重新激活回滚段,以便可以将其分配给新事务。
加快截断撤消 table 空间的速度

清除线程负责清空和截断撤消 table 空间。默认情况下,清除线程查找撤消 table 空间,以在每次清除调用被执行 128 次后截断一次。清除线程查找要删除的 table 空间的频率由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 次调用清除一次查找 undo tabespace,请将innodb_purge_rseg_truncate_frequency设置为 32.

mysql> SET GLOBAL innodb_purge_rseg_truncate_frequency=32;

当清除线程找到需要截断的撤消 table 空间时,清除线程以增加的频率返回,以快速清空并截断撤消 table 空间。

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

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

  • 撤消 table 空间的数量

  • 撤消日志数

  • 撤消 table 空间大小

  • I/O 承载系统的速度

  • 现有的长期 Transaction

  • System load

避免此潜在性能问题的最简单方法是增加撤消 table 空间的数量。

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

撤消 table 空间截断恢复

撤消 table 空间截断操作会在服务器日志目录中创建一个临时undo_space_number_trunc.log文件。该日志目录由innodb_log_group_home_dir定义。如果在截断操作期间发生系统故障,则临时日志文件将允许启动过程标识正在被截断的撤消 table 空间并 continue 操作。