InnoDB表空间之撤消表空间
撤消表空间包含撤消日志,撤消日志是撤消日志记录的集合,其中包含有关如何通过事务撤消对聚集索引记录的最新更改的信息。撤消日志存在于撤消日志段中,撤消日志段中包含撤消日志段。该 innodb_rollback_segments
变量定义分配给每个撤消表空间的回滚段的数量。
撤消日志可以存储在一个或多个撤消表空间中,而不是 系统表空间中。此布局与默认配置不同,在默认配置中,撤消日志位于系统表空间中。撤消日志的I O模式使撤消表空间成为SSD存储的理想候选者 ,同时将系统表空间保留在硬盘存储上。
所使用的撤消表空间的数量InnoDB
由innodb_undo_tablespaces
配置选项控制 。仅在初始化MySQL实例时才能配置此选项。此后无法更改。
注意
该innodb_undo_tablespaces
配置选项已弃用,在以后的版本中将被删除。
不能删除 撤消表空间以及这些表空间内的各个 段。但是,存储在撤消表空间中的撤消日志可以被截断。有关更多信息,请参见 截断撤消表空间。
配置撤消表空间
要为MySQL实例配置撤消表空间,请执行以下步骤。假定您在将配置部署到生产系统之前正在测试实例上执行该过程。
重要
撤消表空间的数量只能在初始化MySQL实例时配置,并且在实例生命周期内是固定的。
1.使用innodb_undo_directory
配置选项为撤消表空间指定目录位置 。如果未指定目录位置,则在数据目录中创建撤消表空间。2.使用innodb_rollback_segments
配置选项定义回滚段的数量 。从一个相对较低的值开始,然后随着时间的推移逐渐增加它,以检查对性能的影响。默认设置为 innodb_rollback_segments
128,这也是最大值。始终将一个回滚段分配给系统表空间,并为临时表空间(ibtmp1
)保留32个回滚段。因此,要将回滚段分配给撤消表空间,请设置 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.该净化系统的FreeS回滚不再使用的部分。4.撤消撤消表空间中的所有回滚段后,将运行truncate操作并将撤消表空间截断为其初始大小。撤消表空间的初始大小取决于该 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次调用清除操作一次查找undo tabespace,请将其设置 innodb_purge_rseg_truncate_frequency
为32。
mysql> SET GLOBAL innodb_purge_rseg_truncate_frequency=32;
复制
当清除线程找到需要截断的撤消表空间时,清除线程以增加的频率返回,以快速清空并截断撤消表空间。
截断撤消表空间文件的性能影响
撤消表空间被截断时,撤消表空间中的回滚段将被停用。其他撤消表空间中的活动回滚段负责整个系统负载,这可能会导致性能轻微下降。性能下降的程度取决于许多因素:
•撤消表空间的数量•撤消日志数•撤消表空间大小•I / O承载系统的速度•现有的长期交易•系统负荷
避免此潜在性能问题的最简单方法是增加撤消表空间的数量。
同样,在撤消表空间截断操作期间执行两个检查点操作。第一个检查点操作从缓冲池中删除旧的撤消表空间页。第二个检查点将新的撤消表空间的初始页面刷新到磁盘。在繁忙的系统上,如果要删除大量页面,则第一个检查点尤其会暂时影响系统性能。
撤消表空间截断恢复
撤消表空间截断操作会 在服务器日志目录中创建一个临时 文件。该日志目录由定义。如果在截断操作期间发生系统故障,则临时日志文件将允许启动过程标识正在被截断的撤消表空间并继续操作。 undo_*
space_number*_trunc.log
[innodb_log_group_home_dir
](