admin 管理员组

文章数量: 1086019


2024年3月20日发(作者:啦啦啦在线观看视频高清免费)

MySQL 8.0之Undo表空间

众所周知,Undo Log记录着那些已修改但未提交的事务日志,是事务回滚以及MVCC功能的基础,非

常重要,接下来梳理、学习一下。

1. 5.5中的Undo

MySQL 5.5及以前版本,InnoDB的undo log是存放在系统表空间ibdata里面的;执行大事务时,会

产生大量的undo log,它占用的空间(undo segment)会一直存在于ibdata中,事务关闭或结束后,也

不会回收,这就会导致ibdata越来越大。

若想回收这部分空闲的undo空间,从ibdata中清除掉,唯一的方法就是:全库逻辑导出,然后初始

化一个新实例,最后再全库导入,这显然是不现实的,尤其是生产环境。

备注:ibdata是一个共享表空间,除了回滚段,里面还有临时段、系统数据段等。

此时,DBA所能做的也非常有限,仅可调整回滚段的个数。

innodb_rollback_segments ――用于指定回滚段的个数,缺省值128,每个回滚段可同时支持1024

个在线事务。

2. 5.6中的Undo

鉴于这个原因,MySQL 5.6进行了改进,可以将undo log从系统表空间ibdata中分离出来,拥有独

立的表空间;还可以设置单独的存储目录,将Undo文件部署到高速存储设备上,这对于并发写入型负载可

大大提升性能。

为此,MySQL 5.6新增了如下几个参数:

innodb_undo_directory ――指定单独存放undo表空间的目录,默认为“./”(即datadir),可设

置相对路径,也可设置绝对路径。

innodb_undo_tablespaces ――指定undo表空间的个数,缺省为0,表示依旧使用系统表空间(ibdata),

最大值为95,每个表空间对应一个物理文件,以undo001形式存在,

初始大小默认为10MB。

innodb_undo_logs ――作为innodb_rollback_segments的替代或别名引入,指定回滚段的个

数,默认128,最大也是128,平均分布到各个undo表空间中。

初始化实例时,若指定了innodb_undo_tablespaces参数(建议大于等于3),即可将undo log配置

到单独的undo表空间中;若需将其存放到更快的设备上,可通过innodb_undo_directory指定,但是一般

不这么做,因为现在SSD、PCI-E卡非常普遍,innodb_undo_logs可保持缺省值不变。

注意:初始化实例后,undo表空间的个数无法修改,回滚段的个数虽然可以动态调整,但物理上并不会减

少,只是会控制用到的回滚段个数。

3. 5.7中的Undo(5.7.22)

MySQL 5.6中,虽然可以将undo log分离出来,拥有独立的表空间,甚至单独的存储目录,但依然不

会在线回收(收缩)undo空间,为此MySQL 5.7又进行了改进,开始支持在线收缩。

为了支持在线收缩,MySQL 5.7引入了一个新的参数:

innodb_undo_log_truncate ―― 大事务结束后是否进行清除操作以收缩Undo表空间,缺省为OFF。

若要开启并使用该功能,需满足如下两个条件:

(a) innodb_undo_tablespace>=2,因为truncate undo表空间时,该文件处于inactive状态,如果

只有一个undo表空间,那么整个系统在此过程中将处于不可用状态;为了尽可能减少truncate

对系统的影响,建议将该参数至少设置为3,即3个表空间。

(b) innodb_undo_log>=35(默认128),因为在MySQL 5.7中,第一个undo log永远位于系统表空间

中,另外32个undo log分配给了临时表空间,即ibtmp1;因此至少还需要2个undo log,才能

保证每个undo表空间中(假如设置innodb_undo_tablespace=2)至少有一个undo log。

满足以上两个条件后,再设置innodb_undo_log_truncate=ON,此时undo表空间的自动truncate功

能才生效,否则没意义,因为truncate针对的是undo表空间中的回滚段,不会自动truncate系统表空间

(bidata)和临时表空间(ibtmp1)中的回滚段。

此外,何时开启收缩,还与如下两个参数有关:

innodb_max_undo_log_size ―― 指定undo表空间的收缩阀值,达到阀值时标记为可收缩,

默认1G,可在线修改

innodb_purge_rseg_truncate_frequency ―― 指定purge操作被唤醒多少次后才能释放rollback

segments,缺省128;只有当undo表空间中的rollback

segments被释放时,才能被truncate,由此可见,参数

值越小,undo表空间被尝试truncate的频率也就越高。

注意:若创建了独立的undo表空间,并且里面存储了回滚段,那么undo表空间文件损坏或丢失后,实例

将无法启动;此时只能将innodb_undo_tablespace设置为0,恢复使用系统表空间,然后启动实例。

4. 8.0中的Undo(8.0.16)

到了MySQL 8.0,进一步优化了Undo表空间,大大提升了管理的灵活性。

(1) 参数变化

与MySQL 5.7相比,8.0中的参数有如下变化:

innodb_undo_tablespaces ――这个参数已被废弃,不再可用,Innodb总是创建2个Undo表空间,


本文标签: 空间 系统 参数 个数 文件