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表空间,
版权声明:本文标题:MySQL 8.0之Undo表空间 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1710945482a580831.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论