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 实例时配置,并且在实例生命周期内是固定的。

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

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

截断撤消 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变量后:

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

撤消 table 空间截断恢复

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

首页