MySQL8.0新特性--使用SQL管理undo表空间
8.0之前的undo tablespaces管理
InnoDB的undo log最主要是存储回滚数据,是实现MVCC的重要组件;innodb的一个rollback segment分为1024个undo log segment,即最大支持1024个并发事务;后来innodb版本进行了升级,支持了128个rollback segment(32个分配给临时表使用,1个分配给系统表空间使用),但这些回滚段都在ibdata中(5.6以前的版本),因此早期经常遇到由于大事务不提交导致ibdata暴涨的问题,通常只有重建数据库才能回收空间。随着5.6之后版本的优化,可以通过参数设置独立的undo tablespaces。
l innodb_undo_directory:回滚表空间所在的位置,默认为 . ,即data目录
l innodb_undo_logs:设置rollback segment的个数,默认128(5.7.19废弃)。
l innodb_undo_tablespaces:设置undo文件的数量,默认0,最大可设95,在innodb_undo_directory目录下可以看到以undo开头的文件。(5.7.21废弃)
l innodb_undo_log_truncate(5.7新增):默认关闭。如开启,当undo超过innodb_max_undo_log_size时,会被truncate到初始化大小(前提:1、里面的undo不在被使用;2、至少需要2个undo tablespaces);可以通过设置innodb_purge_rseg_truncate_frequency调整truncate频率。
8.0 undo tablespaces新增特性
l innodb_undo_tablespaces由默认的0调整为默认2,即默认开启独立undo表空间;8.0.14版本后不再可配置。
l 8.0之前总共可以创建128个rollback segment,现在每个undo tablespaces可以创建128个rollback segment。
l innodb_undo_log_truncate默认开启,undo tablespace超过1GB(参数innodb_max_undo_log_size来控制)时,就会触发online truncate。
l 支持undo tablespaces 加密
l 8.0.14GA后,支持使用SQL接口来创建、修改和删除undo tablespaces。
查看undo tablespaces信息
初始化数据库后,默认会创建2个undo tablespaces:
但在文件系统上实际的文件名是undo_xxxx:
可以通过GLOBAL STATUS查看状态:
Innodb_undo_tablespaces_implicit:InnoDB创建的undo表空间的数量,初始化实例时,默认创建2个。
Innodb_undo_tablespaces_explicit:用户创建的undo 表空间。
Innodb_undo_tablespaces_active:活动的undo 表空间,包含implicit和explicit创建的。
Innodb_undo_tablespaces_total:undo表空间总数,包含implicit和explicit创建的和active和inactive。
使用SQL语句创建undo tablespaces
TIPS:创建的时候必须以.ibu为扩展名,不允许使用相对路径,不指定则默认在innodb_undo_directory目录,同时绝对路径,必须是Innodb能够识别的,如innodb_data_home_dir、innodb_undo_directory、datadir。
创建成功后,会在指定的目录创建一个指定命令的xxxx.ibu文件,同时GLOBAL STATUS变量也会相应的更改。
删除undo tablespaces
当我们想要删除一个undo表空间时,必须先将其设置为inactive状态,同时必须保证还有2个undo表空间,原因是当一个undo表空间在被truncate时候,至少还有1个undo表空间可用。
当我们将undo表空间inactive后,information_schema.innodb_tablespaces中undo表空间的状态会变成empty。
undo表空间被DROP后,对应的GLOBAL STATUS相应的变更。
参考:
https://dev.mysql.com/doc/refman/8.0/en/create-tablespace.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html