10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 41.5 mb
PDF (A4)- 41.6 mb
HTML下载(TGZ)- 9.3 mb
HTML下载(Zip)- 9.3 mb
手册(TGZ)- 262.1 kb
手册(Zip)- 372.2 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

15.6.3.4 Undo表空间

Undo表空间包含Undo日志,这是一组记录的集合,其中包含关于如何撤消事务对集群索引记录的最新更改的信息。

Undo表空间将在本节的以下主题中进行描述:

缺省Undo表空间

初始化MySQL实例时创建了两个默认的undo表空间。默认的undo表空间在初始化时创建,为回滚段提供一个位置,回滚段必须存在,才能接受SQL语句。至少需要两个undo表空间来支持自动截断undo表空间。看到截断Undo表空间

属性定义的位置创建缺省undo表空间innodb_undo_directory变量。如果innodb_undo_directory变量未定义时,在data目录下创建缺省undo表空间。默认的undo表空间数据文件命名undo_001而且undo_002.数据字典中定义的undo表空间名称为innodb_undo_001而且innodb_undo_002

从MySQL 8.0.14开始,可以在运行时使用SQL创建额外的undo表空间。看到添加Undo表空间

撤消表空间大小

在MySQL 8.0.23之前,undo表空间的初始大小取决于innodb_page_size价值。对于默认的16KB页面大小,初始的undo表空间文件大小为10MiB。对于4KB、8KB、32KB和64KB的页面大小,初始的undo表空间文件大小分别为7MiB、8MiB、20MiB和40MiB。从MySQL 8.0.23开始,初始的undo表空间大小通常是16MiB。当通过截断操作创建新的undo表空间时,初始大小可能不同。在这种情况下,如果文件扩展名大小大于16MB,并且上一个文件扩展名发生在最后一秒内,则新的undo表空间创建的大小为定义的表空间大小的四分之一innodb_max_undo_log_size变量。

在MySQL 8.0.23之前,undo表空间一次扩展4个区。从MySQL 8.0.23开始,undo表空间至少扩展了16MB。为了处理快速增长,如果前一个文件扩展名发生的时间少于0.1秒,则文件扩展名大小将增加一倍。扩展大小可以翻倍多次,最大可以达到256MB。如果前面的文件扩展名比前面的文件扩展名早0.1秒以上,则扩展名大小将减少一半,这也可以多次发生,最小为16MB。如果AUTOEXTEND_SIZE选项是为undo表空间定义的,它由中较大的扩展AUTOEXTEND_SIZE设置和由上面描述的逻辑确定的扩展大小。有关AUTOEXTEND_SIZE选项,看到第15.6.3.9节“表空间AUTOEXTEND_SIZE配置”

添加Undo表空间

由于在长时间运行的事务中,撤消日志可能变得很大,因此创建额外的撤消表空间有助于防止单个撤消表空间变得太大。从MySQL 8.0.14开始,可以在运行时使用创建undo表空间语法。

创建undo表空间tablespace_name添加数据文件'file_name.ibu ';

undo表空间文件名中必须包含.ibu扩展。在定义undo表空间文件名时,不允许指定相对路径。允许使用完全限定的路径,但必须知道该路径InnoDB.方法定义的已知路径innodb_directories变量。建议使用唯一的undo表空间文件名,以避免在移动或克隆数据时发生潜在的文件名冲突。

请注意

在复制环境中,源和每个副本都必须有自己的undo表空间文件目录。将undo表空间文件的创建复制到公共目录将导致文件名冲突。

类定义的目录在启动时innodb_directories变量扫描undo表空间文件。(扫描还会遍历子目录。)定义的目录innodb_data_home_dirinnodb_undo_directory,datadir变量会自动附加到innodb_directories价值不论是否innodb_directories变量被显式定义。因此,undo表空间可以驻留在由这些变量定义的路径中。

如果undo表空间文件名不包含路径,则在定义的目录下创建undo表空间innodb_undo_directory变量。如果该变量未定义,则在数据目录中创建undo表空间。

请注意

InnoDB恢复过程要求undo表空间文件位于已知目录中。必须在重做恢复和打开其他数据文件之前发现并打开Undo表空间文件,以允许回滚未提交的事务和数据字典更改。恢复前未找到的undo表空间不能使用,这可能导致数据库不一致。如果未找到数据字典已知的撤消表空间,则在启动时报告错误消息。已知目录需求还支持撤消表空间可移植性。看到移动Undo表空间

如果要在与数据目录相对的路径上创建undo表空间,请设置innodb_undo_directory变量设置为相对路径,仅在创建undo表空间时指定文件名。

查询undo表空间名称和路径INFORMATION_SCHEMA。文件

在“信息模式”中选择“表空间名称”和“文件名称”。file_type为“undo log”的文件;

一个MySQL实例最多支持127个undo表空间,包括初始化时创建的两个默认undo表空间。

请注意

在MySQL 8.0.14之前,通过配置undo表空间来创建额外的undo表空间innodb_undo_tablespaces启动变量。此变量已弃用,从MySQL 8.0.14起不再可配置。

在MySQL 8.0.14之前,增加innodb_undo_tablespaces设置创建指定数量的undo表空间,并将它们添加到活动的undo表空间列表中。减少了innodb_undo_tablespaces设置从活动的undo表空间列表中删除undo表空间。从活动列表中删除的Undo表空间将保持活动状态,直到现有事务不再使用它们。的innodb_undo_tablespaces变量可以在运行时使用语句或在配置文件中定义。

在MySQL 8.0.14之前,去激活的undo表空间不能被删除。在缓慢关闭后,手动删除undo表空间文件是可能的,但不建议这样做,因为如果在关闭服务器时存在打开的事务,那么在服务器重新启动后的一段时间内,未激活的undo表空间可能会包含活动的undo日志。从MySQL 8.0.14开始,undo表空间可以使用删除undo tabalspace语法。看到删除Undo表空间

删除Undo表空间

从MySQL 8.0.14开始,撤消使用创建undo表空间语法可以在运行时使用删除undo tabalspace语法。

撤消表空间必须为空,才能被删除。要清空undo表空间,必须先将undo表空间标记为未激活使用删除表空间语法,以便不再使用表空间为新事务分配回滚段。

删除表空间tablespace_name不活跃的;

在undo表空间被标记为不活动后,当前使用undo表空间中的回滚段的事务被允许结束,在这些事务完成之前启动的任何事务也被允许结束。事务完成后,清除系统释放undo表空间中的回滚段,undo表空间被截断为初始大小。(截断undo表空间时使用相同的过程。看到截断Undo表空间)。一旦undo表空间为空,就可以删除它。

删除undo表空间tablespace_name
请注意

或者,可以将undo表空间保持为空状态,并在以后(如果需要的话)通过发出一个删除表空间tablespace_name设置活动声明。

undo表空间的状态可以通过查询INFORMATION_SCHEMA。INNODB_TABLESPACES表格

从information_schema中选择名称、状态。Innodb_tablespaces where name like 'tablespace_name”;

一个不活跃的状态表示撤销表空间中的回滚段不再被新事务使用。一个状态指示撤消表空间为空,随时可以删除,或随时可以使用删除表空间tablespace_name设置活动声明。试图删除不为空的undo表空间将返回错误。

默认的undo表空间(innodb_undo_001而且innodb_undo_002MySQL实例初始化时创建的文件不能被删除。但是,可以使用删除表空间tablespace_name设置不活跃声明。在默认的撤消表空间被禁用之前,必须有一个撤消表空间来代替它。在任何时候都至少需要两个活动的undo表空间,以支持自动截断undo表空间。

移动Undo表空间

撤销创建的表空间创建undo表空间语法可以在服务器脱机时移动到任何已知目录。类定义的目录就是已知的目录innodb_directories变量。定义的目录innodb_data_home_dirinnodb_undo_directory,datadir自动附加到innodb_directories价值不论是否innodb_directories变量被显式定义。在启动时扫描这些目录及其子目录,查找undo表空间文件。一个移动到这些目录中的撤消表空间文件在启动时被发现,并被假定为被移动的撤消表空间文件。

默认的undo表空间(innodb_undo_001而且innodb_undo_002)创建的MySQL实例必须位于innodb_undo_directory变量。如果innodb_undo_directory变量未定义,默认的undo表空间位于数据目录中。如果在服务器脱机时移动默认的undo表空间,则服务器必须使用innodb_undo_directory配置到新目录的变量。

undo日志的I/O模式使undo表空间非常适合固态硬盘存储。

配置回滚段个数

innodb_rollback_segments变量定义的数量回滚段分配给每个undo表空间和全局临时表空间。的innodb_rollback_segments变量可以在启动时或服务器运行时配置。

的默认设置innodb_rollback_segments为128,也是最大值。有关回滚段支持的事务数量的信息,请参见第15.6.6节“撤销日志”

截断Undo表空间

有两种截断undo表空间的方法,可以单独使用,也可以结合使用来管理undo表空间的大小。一种方法是自动化的,使用配置变量启用。另一种方法是使用SQL语句手动执行。

自动化的方法不需要监视undo表空间的大小,一旦启用,它将执行undo表空间的去激活、截断和重新激活,而无需人工干预。如果希望控制何时将undo表空间脱机进行截断,那么手动截断方法可能更可取。例如,您可能希望避免在峰值工作负载期间截断undo表空间。

自动截断

自动截断undo表空间需要至少两个活动的undo表空间,这确保一个undo表空间保持活动,而另一个undo表空间被脱机截断。默认情况下,在初始化MySQL实例时创建两个undo表空间。

要自动截断undo表空间,请启用innodb_undo_log_truncate变量。例如:

SET GLOBAL innodb_undo_log_truncate=ON;

innodb_undo_log_truncate变量启用时,撤消超过由innodb_max_undo_log_size变量会被截断。的innodb_max_undo_log_size变量是动态的,默认值为1073741824字节(1024mib)。

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

innodb_undo_log_truncate变量已启用:

  1. 的缺省和用户定义的undo表空间innodb_max_undo_log_size设置为截断标记。以循环的方式选择要截断的undo表空间,以避免每次截断相同的undo表空间。

  2. 驻留在所选undo表空间中的回滚段被设置为不活动的,这样它们就不会被分配给新的事务。允许当前使用回滚段的现有事务完成。

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

  4. 在undo表空间中的所有回滚段被释放后,将运行truncate操作,并将undo表空间截短到初始大小。

    截断操作后的undo表空间的大小可能大于初始大小,这是因为在操作完成后立即使用了undo表空间。

    innodb_undo_directory变量定义默认undo表空间文件的位置。如果innodb_undo_directory变量未定义,默认的undo表空间位于数据目录中。所有undo表空间文件的位置,包括使用创建undo表空间语法可以通过查询INFORMATION_SCHEMA。文件表:

    在“信息模式”中选择“表空间名称”和“文件名称”。file_type为“undo log”的文件;
  5. 重新激活回滚段,以便将它们分配给新的事务。

人工截断

手动截断undo表空间至少需要三个活动的undo表空间。任何时候都需要两个活动的undo表空间,以支持启用自动截断的可能性。至少有三个undo表空间可以满足这个要求,同时允许手动使一个undo表空间脱机。

要手动截断undo表空间,可以通过以下语句来关闭undo表空间:

删除表空间tablespace_name不活跃的;

在undo表空间被标记为不活动后,当前使用undo表空间中的回滚段的事务被允许结束,在这些事务完成之前启动的任何事务也被允许结束。事务完成后,清除系统释放undo表空间中的回滚段,undo表空间被截断为初始大小,undo表空间状态从不活跃的

请注意

当一个删除表空间tablespace_name设置不活跃语句使undo表空间失效,则清除线程在下次机会时查找该undo表空间。一旦找到undo表空间并将其标记为截断,清除线程将以更高的频率返回,以快速清空和截断undo表空间。

查询undo表空间的状态INFORMATION_SCHEMA。INNODB_TABLESPACES表格

从information_schema中选择名称、状态。Innodb_tablespaces where name like 'tablespace_name”;

一旦undo表空间在状态,它可以通过发出以下声明重新激活:

删除表空间tablespace_name设置活动;

的undo表空间状态也可以被删除。看到删除Undo表空间

加速Undo表空间的自动截断

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

SELECT @@ innodb_purge_rseg_truncat_frequency;+----------------------------------------+ | @@ innodb_purge_rseg_truncate_frequency  | +----------------------------------------+ | 128年  | +----------------------------------------+

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

SET GLOBAL innodb_purge_rseg_truncat_frequency =32;
截断Undo表空间文件对性能的影响

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

  • undo表空间的个数

  • undo日志数量

  • 取消表空间大小

  • I/O子系统的速度

  • 现有的长时间运行的事务

  • 系统负载

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

监视Undo表空间截断

从MySQL 8.0.16开始,撤销而且清洗子系统计数器用于监视与undo日志截断相关的后台活动。指标名称和描述请查询INFORMATION_SCHEMA。INNODB_METRICS表格

从information_schema中选择名称、子系统和注释。INNODB_METRICS WHERE NAME LIKE '%truncate%';

有关启用计数器和查询计数器数据的信息,请参见第15.15.6节“InnoDB信息模式度量表”

取消表空间截断限制

从MySQL 8.0.21开始,检查点之间对同一个undo表空间的截断操作数量限制在64个。该限制可以防止由于undo表空间截断操作数量过多而引起的潜在问题innodb_max_undo_log_size例如,在繁忙的系统上设置过低。如果超出了限制,撤消表空间仍然可以不活动,但在下一个检查点之后才会截断它。在MySQL 8.0.22中,限制从64提高到50,000。

Undo表空间截断恢复

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

撤消表空间状态变量

以下状态变量允许跟踪undo表空间的总数,隐式(InnoDB-created) undo表空间、显式(用户创建的)undo表空间和活动的undo表空间的数量:

显示Innodb_undo_tablespaces%;+----------------------------------+-------+ | Variable_name |值  | +----------------------------------+-------+ | Innodb_undo_tablespaces_total | 2 | | Innodb_undo_tablespaces_implicit | 2 | | Innodb_undo_tablespaces_explicit | 0 | | Innodb_undo_tablespaces_active | 2  | +----------------------------------+-------+

有关状态变量的描述,请参见第5.1.10节,“服务器状态变量”