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