最近在考MySQL 8.0的OCP ,开个专题专门查漏补缺下

只是做备忘,有的概念只是一笔带过,具体可自行搜索

基于8.0.26

这期来介绍表空间,以下都为Innodb表空间,首先是系统表空间(System Tablespace)


## 1. 存储内容

只要有如下内容存放在系统表空间

- change buffer
- 存放在系统表空间里面的表和索引的数据(非file-per-table或没有存放在general tablespaces)

以前的版本还包含如下内容

- InnoDB data dictionary(数据字典),即存放元数据的地方
- doublewrite buffer (8.0.20之前)

## 2.数据文件

系统表空间可以包含一个或多个数据文件,默认情况下会在数据目录建一个ibdata1的文件作为数据文件,大小和个数由innodb_data_file_path 参数决定

### 2.1 扩容

可以使用如下方法对数据文件进行扩容

将数据文件设为自动扩展,注意autoextend只能放在最后一个数据文件后面,更改后需要重启数据库

每次自动扩展的大小由innodb_autoextend_increment 参数控制

```
innodb_data_file_path=ibdata1:10M:autoextend
```


也可以通过添加数据文件的方式扩容

- 停止数据库
- 修改参数,autoextend放到最后,第一个数据文件的大小设置成现有的大小,无需事先建立文件

```
修改之前:
innodb_data_file_path = /ibdata/ibdata1:10M:autoextend

修改之后:
innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
```

- 开启数据库


### 2.2 缩容

由于系统表空间不会自动缩小,再删除数据后如果需要缩容,MySQL不支持直接减少大小,需要:

- 逻辑备份数据库
- 重新建个MySQL实例
- 将数据导入进去


最后还支持使用裸设备进行扩容,命令如下

```

[mysqld] i
nnodb_data_home_dir= innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw
```
启动成功后需要将new关键字去掉,然后重启数据

```
[mysqld]
innodb_data_home_dir= innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
```

### 3.参考连接

[https://dev.mysql.com/doc/refman/5.6/en/innodb-system-tablespace.html](https://dev.mysql.com/doc/refman/5.6/en/innodb-system-tablespace.html)