最近在考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)