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

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

基于8.0.26

这期来介绍表空间,以下都为Innodb表空间,这节内容是通用 表空间


## 1. 通用表空间

通用表空间是一个共享表空间,使用CREATE TABLESPACE语句来创建,我们可以将多个表指定在该表空间中

- 可以使用TABLESPACE 选项在CREATE TABLE语句中指定通用表空间,系统表空间或file-per-table表空间

- 可以使用TABLESPACE 选项在ALTER  TABLE语句在通用表空间,系统表空间或file-per-table表空间中移动

删除表不会释放通用表空间的物理文件大小

## 2.如何创建
不可以将数据文件放在数据目录的子目录,可以放在数据目录之外

该目录需事先存在并有权限读写,还要使用innodb_directories让其被innodb知道

  ```
CREATE TABLESPACE tablespace_name 
[ADD DATAFILE 'file_name'] 
[FILE_BLOCK_SIZE = value] 
[ENGINE [=] engine_name]
```

### 2.1 建在数据目录中
```
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;


mysql> CREATE TABLESPACE `ts1` Engine=InnoDB;
```

如不指定数据文件名称为随机取名,如aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee,在主从环境中名称会不一样


### 2.2 建在数据目录外
```

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;

```

## 3. 将表加入到通用表空间

可以在新建表和新建后指定

```

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;


mysql> ALTER TABLE t2 TABLESPACE ts1;
```

## 4. 表在表空间中相互移动

以下为系统表空间,file-per-table以及通用表空间之间的移动

### 4.1 移动到通过表空间
```

ALTER TABLE tbl_name TABLESPACE [=] tablespace_name;
```

### 4.2 移动到系统表空间

```

ALTER TABLE tbl_name TABLESPACE [=] innodb_system;
```

### 4.3 移动到file-per-table表空间

```
ALTER TABLE tbl_name TABLESPACE [=] innodb_file_per_table;
```


## 5. 修改表空间名称

```
ALTER TABLESPACE s1 RENAME TO s2;
```

## 6. 删除表空间

删除之前需要删除表空间里面的所有表,否则报错

如下语句查出属于该表空间的表

```
mysql> SELECT a.NAME AS space_name, b.NAME AS table_name FROM INFORMATION_SCHEMA.INNODB_TABLESPACES a, INFORMATION_SCHEMA.INNODB_TABLES b WHERE a.SPACE=b.SPACE AND a.NAME LIKE 'ts1';
```

通用表空间不属于某个数据库,删除数据库不会删除表空间,哪怕这个库包含所有属于该表空间的表

如下语句是如何删除

```

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB; mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 Engine=InnoDB; mysql> DROP TABLE t1; mysql> DROP TABLESPACE ts1;
```

## 7.通用表空间限制

- 无法将已存在的表空间转换成通用表空间
- 不支持创建临时通用表空间
- 不支持临时表
- 删除表不是释放表空间数据文件的大小,一些table-copying操作结束后也不会释放其增长的大小
- 不支持ALTER TABLE ... DISCARD TABLESPACE 和 ALTER TABLE ...IMPORT TABLESPACE 操作

- 8.0.13开始不支持将表分区放进通用表空间
- 主从复制中可能会导致数据文件冲突,这时需要不使用add datafile,这样名字是随机的
- 不支持新增数据文件

### 8.参考连接

[https://dev.mysql.com/doc/refman/8.0/en/general-tablespaces.html](https://dev.mysql.com/doc/refman/8.0/en/general-tablespaces.html)