通用表空间是使用CREATE TABLESPACE语句创建的InnoDB?共享表空间。
通用表空间功能
通用表空间提供以下功能:
1、与系统表空间类似,通用表空间是能够为多个表存储数据的共享表空间。
2、与独立表空间相比,通用表空间具有潜在的内存优势?。服务器在表空间的整个生命周期内将表空间元数据保存在内存中。与单独的独立表空间中相同数量的表相比,较少的通用表空间中的多个表消耗的表空间元数据内存更少。
3、通用表空间数据文件可以放置在相对于或独立于 MySQL 数据目录的目录中,这为您提供了独立表空间的许多数据文件和存储管理能力。与独立表空间一样,将数据文件放在 MySQL 数据目录之外的能力允许您单独管理关键表的性能。用户可以为特定表设置 RAID 或 DRBD,或者将表绑定到特定磁盘。
4、通用表空间支持所有表行格式和相关功能。
5、TABLESPACE选项可用于控制CREATE TABLE在通用表空间、独立表空间或系统表空间中创建表。
6、TABLESPACE选项可用于控制ALTER TABLE在通用表空间、独立表空间和系统表空间之间移动表。
创建通用表空间
通用表空间是使用?CREATE TABLESPACE语句创建的。
CREATE TABLESPACE tablespace_name
[ADD DATAFILE 'file_name']
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
可以在数据目录中或在其外部创建通用表空间。为避免与隐式创建的独立表空间冲突,不支持在数据目录下的子目录中创建通用表空间。在数据目录之外创建通用表空间时,该目录必须存在并且InnoDB必须在创建表空间之前设置该目录。要使InnoDB能识别未知目录,请将目录添加到?innodb_directories参数值。innodb_directories是只读启动选项。配置它需要重新启动服务器。
例子:
在数据目录中创建一个通用表空间:
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
或者
mysql> CREATE TABLESPACE `ts1` Engine=InnoDB;
从 MySQL 8.0.14 开始,ADD DATAFILE子句是可选的,在此之前是必需的。如果创建表空间时未指定ADD DATAFILE子句,则会隐式创建具有唯一文件名的表空间数据文件。唯一文件名是一个128位UUID,格式为五组由短划线 (aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee )分隔的十六进制数字。通用表空间数据文件包括?.ibd扩展文件。在复制环境中,在源上创建的数据文件名与在副本上创建的数据文件名不同。
在数据目录之外的目录中创建通用表空间:
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;
如果表空间目录不在数据目录下,您可以指定相对于数据目录的路径。在此示例中,?my_tablespace目录与数据目录处于同一级别:
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '../my_tablespace/ts1.ibd' Engine=InnoDB;
将表添加到通用表空间
创建通用表空间后,CREATE TABLE?tbl_name?… TABLESPACE [=]?tablespace_name或ALTER TABLE?tbl_name?TABLESPACE [=]?tablespace_name语句可用于向表空间添加表,如下例所示:?
CREATE TABLE:
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1;
ALTER TABLE:
mysql> ALTER TABLE t2 TABLESPACE ts1;