最近在考MySQL 8.0的OCP ,开个专题专门查漏补缺下
只是做备忘,有的概念只是一笔带过,具体可自行搜索
基于8.0.26
这期来介绍表空间,以下都为Innodb表空间,这节内容是通用 表空间
通用表空间是一个共享表空间,使用CREATE TABLESPACE语句来创建,我们可以将多个表指定在该表空间中
可以使用TABLESPACE 选项在CREATE TABLE语句中指定通用表空间,系统表空间或file-per-table表空间
可以使用TABLESPACE 选项在ALTER TABLE语句在通用表空间,系统表空间或file-per-table表空间中移动
删除表不会释放通用表空间的物理文件大小
不可以将数据文件放在数据目录的子目录,可以放在数据目录之外
该目录需事先存在并有权限读写,还要使用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;
```
不支持ALTER TABLE ... DISCARD TABLESPACE 和 ALTER TABLE ...IMPORT TABLESPACE 操作
8.0.13开始不支持将表分区放进通用表空间
https://dev.mysql.com/doc/refman/8.0/en/general-tablespaces.html