通用表空间是一个共享表空间,类似于系统表空间。它可以容纳多个表,并支持所有表行格式。也可以在相对于MySQL数据目录或独立于MySQL数据目录的位置创建常规表空间。
语法:
CREATE TABLESPACE tablespace_name
ADD DATAFILE 'file_name'
[FILE_BLOCK_SIZE = value]
[ENCRYPTION [=] {'Y' | 'N'}]
[ENGINE [=] engine_name]
ADD DATAFILE
:定义表空间数据文件的名称。必须使用CREATE TABLESPACE
语句指定数据文件 ,并且数据文件名必须具有.ibd
扩展名。一个 InnoDB
普通表仅支持单个数据文件。
数据文件默认放在MySQL数据目录(DATADIR
)下;如果要将数据文件放在MySQL数据目录(DATADIR
)之外的位置,请包含绝对目录路径或相对于MySQL数据目录的路径。如果未指定路径,则会在MySQL数据目录中创建常规表空间。
为避免与隐式创建的每表文件表空间冲突,不支持在MySQL数据目录下的子目录中创建通用表空间。此外,在MySQL数据目录之外创建通用表空间时,该目录必须存在,并且必须InnoDB
在创建表空间之前知道 。要使未知目录已知InnoDB
,请将该目录添加到innodb_directories
参数值。innodb_directories
是一个只读启动选项。配置它需要重新启动服务器。
一般的表空间支持所有表行格式(REDUNDANT
,COMPACT
, DYNAMIC
,COMPRESSED
)与压缩和非压缩表不能在同一个表空间一般共存的警告,由于不同的物理页面大小。
对于包含压缩表(ROW_FORMAT=COMPRESSED
)的常规表空间, FILE_BLOCK_SIZE
必须指定,并且该FILE_BLOCK_SIZE
值必须是与该 值相关的有效压缩页大小 innodb_page_size
。此外,压缩表(KEY_BLOCK_SIZE
)的物理页面大小必须等于 FILE_BLOCK_SIZE/1024
。例如,如果 innodb_page_size=16K
和 FILE_BLOCK_SIZE=8K
, KEY_BLOCK_SIZE
表的必须为8。
下表显示了允许的 innodb_page_size
, FILE_BLOCK_SIZE
和 KEY_BLOCK_SIZE
组合。 FILE_BLOCK_SIZE
值也可以以字节为单位指定。要确定KEY_BLOCK_SIZE
给定的有效值FILE_BLOCK_SIZE
,请将 FILE_BLOCK_SIZE
值除以1024.表压缩不支持32K和64K InnoDB
页面大小。有关的更多信息 KEY_BLOCK_SIZE
。
表15.7压缩表的允许页大小,FILE_BLOCK_SIZE和KEY_BLOCK_SIZE组合
InnoDB页面大小(innodb_page_size) | 允许的FILE_BLOCK_SIZE值 | 允许的KEY_BLOCK_SIZE值 |
64K | 64K(65536) | 不支持压缩 |
32K | 32K(32768) | 不支持压缩 |
16K | 16K(16384) | N A:如果innodb_page_size等于FILE_BLOCK_SIZE,则表空间不能包含压缩表。 |
16K | 8K(8192) | 8 |
16K | 4K(4096) | 4 |
16K | 2K(2048) | 2 |
16K | 1K(1024) | 1 |
8K | 8K(8192) | N / A:如果innodb_page_size等于FILE_BLOCK_SIZE,则表空间不能包含压缩表。 |
8K | 4K(4096) | 4 |
8K | 2K(2048) | 2 |
8K | 1K(1024) | 1 |
4K | 4K(4096) | N / A:如果innodb_page_size等于FILE_BLOCK_SIZE,则表空间不能包含压缩表。 |
4K | 2K(2048) | 2 |
4K | 1K(1024) | 1 |
InnoDB页面大小(innodb_page_size) | 允许的FILE_BLOCK_SIZE值 | 允许的KEY_BLOCK_SIZE值 |
创建表空间:
mysql> create database sbtest;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TABLESPACE sbtest ADD DATAFILE '/data/mydata/my8888/sbtest.ibd' Engine=InnoDB;
Query OK, 0 rows affected (0.16 sec)
mysql> use sbtest;
Database changed
将表添加到表空间:
mysql> create table sbtest1(i int) ENGINE=InnoDB TABLESPACE sbtest;
Query OK, 0 rows affected (0.13 sec)
mysql> create table sbtest2(i int) ENGINE=InnoDB TABLESPACE sbtest;
Query OK, 0 rows affected (0.00 sec)
使用ALTER TABLE在表空间之间移动表:
mysql> alter table t1 tablespace sbtest;
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
重命名表空间:
mysql> alter tablespace sbtest rename to sbtest1;
Query OK, 0 rows affected (0.08 sec)
删除常规表空间:
mysql> drop tablespace sbtest1;
ERROR 3120 (HY000): Tablespace `sbtest1` is not empty.
mysql> drop table t1;
Query OK, 0 rows affected (0.11 sec)
mysql> drop table t;
Query OK, 0 rows affected (0.07 sec)
mysql> drop tablespace sbtest;
Query OK, 0 rows affected (0.08 sec)
mysql>
一般表空间限制:
a、 生成的或现有的表空间不能更改为常规表空间。
b、 不支持创建临时通用表空间。
c、 常规表空间不支持临时表。
d、 与系统表空间类似,截断或删除存储在通用表空间中的表会在通用表空间.ibd数据文件内部创建可用空间,该 文件只能用于新InnoDB数据。空间不会像文件每表表 空间一样释放回操作系统 。
e、 此外,ALTER TABLE驻留在共享表空间(通用表空间或系统表空间)中的表上的表复制操作可以增加表空间使用的空间量。此类操作需要与表中的数据和索引一样多的额外空间。表复制ALTER TABLE
操作所需的额外空间不会像文件每表表空间一样释放回操作系统。
f、 ALTER TABLE ... DISCARD TABLESPACE
并且 ALTER TABLE ...IMPORT TABLESPACE
不支持属于常规表空间的表。
g、 在MySQL 5.7.24中不支持在一般表空间中放置表分区,在MySQL 8.0.13中删除了。