最近在考MySQL 8.0的OCP ,开个专题专门查漏补缺下 只是做备忘,有的概念只是一笔带过,具体可自行搜索 基于8.0.26 这期来介绍表空间,以下都为Innodb表空间,这节内容是undo表空间 ## 1. Undo 日志 Undo表空间包含了undo日志,即回滚日志用来回滚操作 他和其他一些undo概念关系如下 [image:1009 size:orig] ## 2. Undo表空间 默认情况下MySQL在实例初始化的时候建立2个undo表空间,达到 innodb_max_undo_log_size参数的大小后,如果配置了自动清理参数,则undo表空间会自动清理(automated truncation),该功能需要至少2个undo表空间 数据文件的位置由innodb_undo_directory 参数控制,默认在数据目录下,名称为undo_001和undo_002 可以在线添加undo表空间 Undo表空间的初始大小由innodb_page_size决定,一般来说是16K,这时初始大小为10M,8.0.23之后初始大小为16M ## 3.配置Undo 表空间 - innodb_undo_directory该参数决定undo表空间的位置,默认是数据目录 - innodb_rollback_segments 决定回滚段的数量,默认是128个,这也是最大值,5.7中系统表空间占一个回滚段,临时表空间占32个回滚段,剩下的95个由undo表空间使用,8.0中每个表空间都可以有最多128个回滚段。 - 使用innodb_undo_tablespaces 参数来决定有多少个undo表空间,针对每个事务MySQL随机使用其中一个,8.0开始支持后续添加,5.7不可以。 - 最大大小由 innodb_max_undo_log_size 参数控制,一般为1G,当开启自动undo清理后,超过该大小时会进行清理,清理后恢复至初始大小 - 根据不同的负载来测试确定最优值 ## 4.Undo表空间相关操作 ### 4.1 增加表空间 可以使用如下命令增加undo表空间,必须是ibu后缀 ``` CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu'; ``` ### 4.2 删除表空间 先将undo表空间置于inactive后再删除 ``` ALTER UNDO TABLESPACE tablespace_name SET INACTIVE; SELECT NAME, STATE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME LIKE 'tablespace_name'; DROP UNDO TABLESPACE tablespace_name; ``` 同样我们也可以将undo表空间移动到其他目录,这里就不多做介绍了 ### 5.参考连接 [https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html](https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html)