undo log日志保存在共享表空间ibdata1文件中,是MVCC多版本控制的核心模块,一直以来undo log都存储在ibdata系统表空间中,随着数据库的运行时间增长,ibdata1文件会越来越大,在MySQL5.7版本之前的数据库中,如果我们想要回收ibdata1文件所占空间,是比较复杂的,必须先将mysqldump -A全库导出,然后删掉data目录,再重新对数据库进行初始化,最后导入全库备份,方可实现ibdata1的回收。
直到MySQL5.7 ,才支持在线收缩,收缩后变成10M。
如何在线回收,主要是以下几个参数,记住:初始化的时候,或docker容器创建的时候就指定,在my.cnf配置文件中加上如下:
##################### undo log在线收缩新特性######################################
#用于设定创建的undo表空间的个数,在mysql_install_db时初始化后,就再也不能被改动了;默认值为0,
#表示不独立设置undo的tablespace,默认记录到ibdata中;否则,则在undo目录下创建这么多个undo文件,
#例如假定设置该值为4,那么就会创建命名为undo001~undo004的undo tablespace文件,每个文件的默认大小为10M。
#修改该值会导致Innodb无法完成初始化,数据库无法启动,但是另两个参数可以修改
innodb_undo_tablespaces=4
#undo回滚段的数量, 至少大于等于35,默认128
innodb_undo_logs=128
#当超过这个阀值(默认是1G),会触发truncate回收(收缩)动作,truncate后空间缩小到10M
innodb_max_undo_log_size=1G
#是否开启在线回收(收缩)undo log日志文件,支持动态设置
innodb_undo_log_truncate = 1
#undo 表空间一般不能直接truncate,需要在所有回滚段释放完后,才能truncate,
#purge system每128次释放一次回滚段,可以通过参数
#innodb_purge_rseg_truncate_frequency 来加速释放回滚段,默认128是最大值
innodb_purge_rseg_truncate_frequency=128