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

http://mysql.taobao.org/monthly/2019/04/05/

posted @ 2022-12-22 09:20  Harda  阅读(718)  评论(0编辑  收藏  举报