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