MySQL InnoDB通用表空间
InnoDB通用表空间
通用表空间是使用create tablespace语法创建的共享InnoDB表空间。通用表空间功能和特性将在本节的以下主题中进行描述:
.通用表空间的功能
.创建通用表空间
.在通用表空间中创建表
.通用表空间支持的行格式
.使用alter table语句在表空间之间移动非分区表
.通用表空间支持的表分区
.使用alter table语句在表空间之移动分区表
.删除通用表空间
.通用表空间的限制
通用表空间的功能
通用表空间特性提供以下功能:
.通用表空间与系统表空间类似,都是共享的表空间,可以存储多个表的数据。
.与file-per-table表空间相比,通用表空间具有潜在的内存优势。在表空间的生命周期内,服务器将表空间元数据保存在内存中。在少许通用表空间中的多个表比在单独的file-per_table表空间的文件中相同数量的表占用更少的表空间元数据内存。
.通用表空间数据文件可以放在相对于MySQL数据目录或独立于MySQL数据目录的目录中,MySQL数据目录提供了file-per-table表空间的许多数据文件和存储管理功能。与file-per-table表空间文件一样,将数据文件放在MySQL数据目录之外的能力允许您单独管理关键表的性能,为特定表设置RAID或DRBD,或将表绑定到特定磁盘。
.通用表空间同时支持Antelope和Barracuda文件格式,因此支持所有的表行格式和相关特性。对于这两种文件格式的支持,通用表空间不再依赖于
innodb_file_format或innodb_file_per_table设置,这些变量对通用表空间也没有任何影响。
.TABLESPACE选项可以与CREATE TABLE一起使用,在通用表空间、file-per-table表空间或系统表空间中创建表。
.TABLESPACE选项可以与ALTER TABLE一起使用,用于在通用表空间、file-per-table表空间和系统表空间之间移动表。以前,不可能将表从
file-per-table表空间移动到系统表空间。使用通用表空间特性,您现在可以这样做了。
创建通用表空间
通用表空间是使用CREATE TABLESPACE语法创建的:
CREATE TABLESPACE tablespace_name
ADD DATAFILE 'file_name'
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
通用表空间可以创建在MySQL数据目录或MySQL数据目录以外的目录中。为了避免与隐式创建的file-per-table表空间冲突,不支持在MySQL数据目录下的子目录中创建通用表空间。另外,当在MySQL数据目录之外创建通用表空间时,该目录必须在创建表空间之前存在。
当在MySQL数据目录之外创建通用表空间时,将在MySQL数据目录中创建一个isl文件。
例如:
在MySQL数据目录中创建一个通用表空间
mysql> use test;
Database changed
mysql> create tablespace ts1 add datafile 'ts1.ibd' engine=innodb;
Query OK, 0 rows affected (0.09 sec)
[root@localhost mysql]# ls -lrt ts1*
-rw-r-----. 1 mysql mysql 65536 3月 23 16:57 ts1.ibd
在MySQL数据目录之外的目录中创建一个通用表空间
mysql> create tablespace ts2 add datafile '/mysqldata/ts2.ibd' engine=innodb;
Query OK, 0 rows affected (0.08 sec)
[root@localhost mysqldata]# ls -lrt ts2*
-rw-r-----. 1 mysql mysql 65536 3月 23 17:01 ts2.ibd
[root@localhost mysql]# ls -lrt ts2*
-rw-r-----. 1 mysql mysql 18 3月 23 17:01 ts2.isl
你可以指定一个相对于MySQL数据目录的路径,只要表空间目录不在MySQL数据目录下。在本例中,my_tablespace目录与MySQL数据目录处于同一级别
mysql> create tablespace ts3 add datafile '../cs/ts3.ibd' engine=innodb;
Query OK, 0 rows affected (0.07 sec)
[mysql@localhost mysqldata]$ ls -lrt
总用量 48
drwxr-xr-x. 5 mysql mysql 4096 9月 18 2019 mysql3307
drwxr-xr-x. 5 mysql mysql 4096 9月 18 2019 mysql3308
drwxr-xr-x. 5 mysql mysql 4096 9月 18 2019 mysql3309
drwxr-xr-x. 2 mysql mysql 21 7月 15 2020 tmp
-rw-r-----. 1 mysql mysql 65536 3月 23 17:01 ts2.ibd
drwxr-xr-x. 2 mysql mysql 20 3月 23 17:06 cs
drwxr-x---. 7 mysql mysql 4096 3月 23 17:06 mysql
[mysql@localhost mysqldata]$ cd cs
[mysql@localhost cs]$ ls -lrt
总用量 32
-rw-r-----. 1 mysql mysql 65536 3月 23 17:06 ts3.ibd
[root@localhost mysql]# ls -lrt ts3*
-rw-r-----. 1 mysql mysql 13 3月 23 17:06 ts3.isl
注意:ENGINE =InnoDB子句必须定义为CREATE TABLESPACE语句的一部分,或者InnoDB必须定义为默认的存储引擎(default_storage_engine=InnoDB)。
在通用表空间中创建表
创建完InnoDB通用表空间后,可以使用CREATE TABLE tbl_name…TABLESPACE [=] tablespace_name或ALTER TABLE tbl_name TABLESPACE [=] tablespace_name添加表空间,示例如下:
创建表:
mysql> create table t1(c1 int primary key) tablespace ts1 row_format=compact;
Query OK, 0 rows affected (0.09 sec)
修改表:
mysql> create table t2(c1 int primary key);
Query OK, 0 rows affected (0.11 sec)
mysql> show create table t2;
+-------+-----------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> alter table t2 tablespace ts1;
Query OK, 0 rows affected (0.19 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t2;
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE `ts1` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
通用表空间支持的行格式
通用表空间支持所有表行格式(redundancy、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值必须以字节为单位进行指定。为了对指定的file_block_size来判断一个有效的key_block_size,必须用file_block_size的值除以1024。Innodb页大小为32K和64K时是不支持表压缩的。
这个例子演示了如何创建一个通用表空间并添加一个压缩表。这个例子假设默认的innodb_page_size为16K。FILE_BLOCK_SIZE为8192要求压缩表的KEY_BLOCK_SIZE为8。
mysql> select @@innodb_page_size;
+--------------------+
| @@innodb_page_size |
+--------------------+
| 16384 |
+--------------------+
1 row in set (0.00 sec)
mysql> create tablespace ts2 add datafile 'ts2.ibd' file_block_size=8192 engine=innodb;
Query OK, 0 rows affected (0.06 sec)
mysql> create table t3(c1 int primary key) tablespace ts2 row_format=compressed key_block_size=8;
Query OK, 0 rows affected (0.06 sec)
如果创建通用表空间时没有指定FILE_BLOCK_SIZE,则FILE_BLOCK_SIZE默认为innodb_page_size。当FILE_BLOCK_SIZE等于innodb_page_size时,表空间只能包含行格式为非压缩格式的表(COMPACT, REDUNDANT, DYNAMIC)。
使用alter table在表空间之间迁移非分区表
你可以使用ALTER TABLE和TABLESPACE选项来移动一个没有分区的InnoDB表到一个现有的通用表空间、一个新的file-per-table表空间或系统表空间。
要将一个未分区的表从file-per-table表空间或从系统表空间移动到通用表空间,请指定通用表空间的名称。必须存在通用表空间。
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE `ts1` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table t1 tablespace=ts3;
Query OK, 0 rows affected (0.24 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE `ts3` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
要将一个未分区的表从普通表空间或file-per-table表空间移动到系统表空间,需要指定表空间名称为innodb_system。
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE `ts3` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table t1 tablespace=innodb_system;
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t1;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE `innodb_system` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
要将一个没有分区的表从系统表空间或一般表空间移动到file-per-table表空间,指定表空间名innodb_file_per_table。
mysql> show create table t1;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE `innodb_system` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter table t1 tablespace=innodb_file_per_table;
Query OK, 0 rows affected (0.26 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE `innodb_file_per_table` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
当表从file-per-table表空间移动到通用表空间或系统表空间时对应的file-per-table表空间文件也会被自动删除。
mysql> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE `innodb_file_per_table` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
[root@localhost test]# ls -lrt
总用量 136
-rw-r-----. 1 mysql mysql 67 3月 23 16:21 db.opt
-rw-r-----. 1 mysql mysql 8556 3月 23 17:12 t2.frm
-rw-r-----. 1 mysql mysql 8556 5月 24 15:39 t3.frm
-rw-r-----. 1 mysql mysql 8556 5月 24 15:52 t1.frm
-rw-r-----. 1 mysql mysql 98304 5月 24 15:52 t1.ibd
mysql> alter table t1 tablespace=ts1;
Query OK, 0 rows affected (0.24 sec)
Records: 0 Duplicates: 0 Warnings: 0
[root@localhost test]# ls -lrt
总用量 40
-rw-r-----. 1 mysql mysql 67 3月 23 16:21 db.opt
-rw-r-----. 1 mysql mysql 8556 3月 23 17:12 t2.frm
-rw-r-----. 1 mysql mysql 8556 5月 24 15:39 t3.frm
-rw-r-----. 1 mysql mysql 8556 5月 24 15:54 t1.frm
ALTER TABLE ... TABLESPACE操作总是会导致完整的表重建,即使tablespace属性没有发生改变也是如此。
alter table ... tablespace语法不支持将一个临时表空间中的表移动到永久表空间中。
DATA DIRECTORY子句允许与CREATE TABLE…TABLESPACE=innodb_file_per_table使用,但不支持与TABLESPACE选项结合使用。
通用表空间支持分区表
TABLESPACE选项可用于将单独的表分区或子分区分配给通用表空间、单独的file-per-table表空间或系统表空间。所有分区必须属于同一个存储引擎。用法将在下面的示例中演示。
mysql> CREATE TABLESPACE ts4 ADD DATAFILE 'ts4.ibd' Engine=InnoDB;
Query OK, 0 rows affected (0.17 sec)
mysql> CREATE TABLESPACE ts5 ADD DATAFILE 'ts5.ibd' Engine=InnoDB;
Query OK, 0 rows affected (0.15 sec)
mysql> CREATE TABLE t4 (a INT, b INT) ENGINE = InnoDB
-> PARTITION BY RANGE(a) SUBPARTITION BY KEY(b) (
-> PARTITION p1 VALUES LESS THAN (100) TABLESPACE=ts4,
-> PARTITION p2 VALUES LESS THAN (1000) TABLESPACE=ts5,
-> PARTITION p3 VALUES LESS THAN (10000) TABLESPACE innodb_file_per_table,
-> PARTITION p4 VALUES LESS THAN (100000) TABLESPACE innodb_system);
Query OK, 0 rows affected, 1 warning (0.23 sec)
mysql> CREATE TABLE t5 (a INT, b INT) ENGINE = InnoDB
-> PARTITION BY RANGE(a) SUBPARTITION BY KEY(b) (
-> PARTITION p1 VALUES LESS THAN (100) TABLESPACE=ts4
-> (SUBPARTITION sp1,
-> SUBPARTITION sp2),
-> PARTITION p2 VALUES LESS THAN (1000)
-> (SUBPARTITION sp3,
-> SUBPARTITION sp4 TABLESPACE=ts5),
-> PARTITION p3 VALUES LESS THAN (10000)
-> (SUBPARTITION sp5 TABLESPACE innodb_system,
-> SUBPARTITION sp6 TABLESPACE innodb_file_per_table));
Query OK, 0 rows affected, 1 warning (0.36 sec)
tablespace选项也被alter table语句支持
mysql> alter table t4 add partition(partition p5 values less than (1000000) tablespace=ts1);
Query OK, 0 rows affected, 1 warning (0.31 sec)
Records: 0 Duplicates: 0 Warnings: 0
如果没有定义TABLESPACE = tablespace_name选项,则ALTER TABLE…ADD PARTITION操作将分区添加到表的默认表空间中,默认表空间可以在CREATE table或ALTER table期间在表级别指定。
在分区表上执行ALTER TABLE tbl_name TABLESPACE [=] tablespace_name操作只修改表的默认表空间。它不会移动表分区。但是,在修改了默认表空间之后,如果没有使用tablespace [=] tablespace_name子句显式地定义另一个表空间,则重建表的操作,例如使用ALGORITHM=COPY的
ALTER TABLE操作会将分区移动到默认表空间。
要验证分区是否被放置在指定的表空间中,可以查询INFORMATION_SCHEMA.INNODB_SYS_TABLES:
mysql> SELECT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%t4%';
+-----------------------+-------+------------+
| NAME | SPACE | SPACE_TYPE |
+-----------------------+-------+------------+
| test/t4#P#p1#SP#p1sp0 | 32 | General |
| test/t4#P#p2#SP#p2sp0 | 33 | General |
| test/t4#P#p3#SP#p3sp0 | 34 | Single |
| test/t4#P#p4#SP#p4sp0 | 0 | System |
| test/t4#P#p5#SP#p5sp0 | 26 | General |
+-----------------------+-------+------------+
5 rows in set (0.00 sec)
mysql> SELECT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%t5%';
+---------------------+-------+------------+
| NAME | SPACE | SPACE_TYPE |
+---------------------+-------+------------+
| test/t5#P#p1#SP#sp1 | 32 | General |
| test/t5#P#p1#SP#sp2 | 32 | General |
| test/t5#P#p2#SP#sp3 | 35 | Single |
| test/t5#P#p2#SP#sp4 | 33 | General |
| test/t5#P#p3#SP#sp5 | 0 | System |
| test/t5#P#p3#SP#sp6 | 36 | Single |
+---------------------+-------+------------+
6 rows in set (0.01 sec)
使用ALTER Table在表空间之间移动表分区
要将表分区移动到不同的表空间,必须使用ALTER TABLE tbl_name REORGANIZE PARTITION语句移动每个分区。
下面的示例演示如何将表分区移动到不同的表空间。INFORMATION_SCHEMA.INNODB_SYS_TABLES和INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES被查询,以验证分区是否被放置在预期的表空间中。
注意:如果在REORGANIZE PARTITION语句中没有定义TABLESPACE = tablespace_name选项,InnoDB会将该分区移动到表的默认表空间。在下面的例子中,表空间ts1是在表级别定义的,它是表t1的默认表空间。由于在ALTER TABLE t1 REORGANIZE PARTITION语句中没有为P3分区指定表空间选项,分区P3从系统表空间移动到表空间ts1。
例如使用ALGORITHM=COPY的ALTER TABLE操作,如果分区位于没有使用tablespace [=] tablespace_name子句显式定义的其他表空间,重建表的操作则会将分区移动到默认表空间。
mysql> CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd';
Query OK, 0 rows affected (0.14 sec)
mysql> CREATE TABLESPACE ts2 ADD DATAFILE 'ts2.ibd';
Query OK, 0 rows affected (0.06 sec)
mysql> CREATE TABLE t1 ( a INT NOT NULL, PRIMARY KEY (a))
-> ENGINE=InnoDB TABLESPACE ts1
-> PARTITION BY RANGE (a) PARTITIONS 3 (
-> PARTITION P1 VALUES LESS THAN (2),
-> PARTITION P2 VALUES LESS THAN (4) TABLESPACE innodb_file_per_table,
-> PARTITION P3 VALUES LESS THAN (6) TABLESPACE innodb_system);
Query OK, 0 rows affected, 1 warning (0.31 sec)
mysql> SELECT A.NAME as partition_name, A.SPACE_TYPE as space_type, B.NAME as space_name
-> FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES A
-> LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES B
-> ON A.SPACE = B.SPACE WHERE A.NAME LIKE '%t1%' ORDER BY A.NAME;
+----------------+------------+--------------+
| partition_name | space_type | space_name |
+----------------+------------+--------------+
| test/t1#P#P1 | General | ts1 |
| test/t1#P#P2 | Single | test/t1#P#P2 |
| test/t1#P#P3 | System | NULL |
+----------------+------------+--------------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE t1 REORGANIZE PARTITION P1 INTO (PARTITION P1 VALUES LESS THAN (2) TABLESPACE = ts2);
Query OK, 0 rows affected, 1 warning (0.29 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE t1 REORGANIZE PARTITION P2 INTO (PARTITION P2 VALUES LESS THAN (4) TABLESPACE = ts2);
Query OK, 0 rows affected, 1 warning (0.21 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE t1 REORGANIZE PARTITION P3 INTO (PARTITION P3 VALUES LESS THAN (6));
Query OK, 0 rows affected, 1 warning (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT A.NAME AS partition_name, A.SPACE_TYPE AS space_type, B.NAME AS space_name
-> FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES A
-> LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES B
-> ON A.SPACE = B.SPACE WHERE A.NAME LIKE '%t1%' ORDER BY A.NAME;
+----------------+------------+------------+
| partition_name | space_type | space_name |
+----------------+------------+------------+
| test/t1#P#P1 | General | ts2 |
| test/t1#P#P2 | General | ts2 |
| test/t1#P#P3 | General | ts1 |
+----------------+------------+------------+
3 rows in set (0.00 sec)
删除通用表空间
DROP TABLESPACE语句用于删除一个InnoDB通用表空间。
在执行drop tablespace操作之前,必须删除表空间中的所有表。如果表空间不为空,drop tablespace返回错误。
如果在一个空的通用表空间上的DROP TABLESPACE操作返回一个错误,这个表空间可能包含一个孤儿临时表或中间表,这是由于服务器退出中断了ALTER TABLE操作而留下的。
通用InnoDB表空间在删除最后一个表时不会自动删除。必须使用drop tablespace tablespace_name显式删除表空间。
通用表空间不属于任何特定的数据库。DROP DATABASE操作可以删除属于通用表空间的表,但不能删除该表空间,即使它删除了属于该表空间的所有表。必须使用drop tablespace tablespace_name显式删除通用表空间。
与系统表空间类似,截断或删除存储在通用表空间中的表,会在通用表空间的.ibd数据文件中创建空闲空间,这个空闲空间只能用于新的InnoDB数据。空间不会像在DROP TABLE操作期间删除每个表对应的file-per-table表空间那样被释放回操作系统。
这个例子演示了如何删除一个InnoDB通用表空间。通用表空间ts3中创建了单个表。在删除表空间之前,必须先删除表。
mysql> create tablespace ts3 add datafile 'ts3.ibd' engine=innodb;
Query OK, 0 rows affected (0.06 sec)
mysql> create table t2(c1 int primary key) tablespace ts3 engine=innodb;
Query OK, 0 rows affected (0.11 sec)
mysql> drop table t2;
Query OK, 0 rows affected (0.03 sec)
mysql> drop tablespace ts3;
Query OK, 0 rows affected (0.02 sec)
通用表空间的限制
.生成的或现有的表空间不能更改为通用表空间
.不支持创建临时通用表空间。
.通用表空间不支持临时表。
.存储在通用表空间中的表只能在支持通用表空间的MySQL版本中打开。
.与系统表空间类似,截断或删除存储在通用表空间中的表,会在通用表空间的.ibd数据文件中创建空闲空间,这个空闲空间只能用于新的InnoDB数据。空间不会像在DROP TABLE操作期间删除每个表对应的file-per-table表空间那样被释放回操作系统。
此外,对位于共享表空间(通用表空间或系统表空间)中的表进行表复制ALTER TABLE操作会增加表空间的使用量。这种操作需要与表中的数据加上索引一样多的额外空间。表复制ALTER TABLE操作所需的额外空间不会像file-per-table表空间那样被释放回操作系统。
.ALTER TABLE...DISCARD TABLESPACE和ALTER TABLE ...IMPORT TABLESPACE不支持属于通用表空间的表。
- 点赞
- 收藏
- 关注作者
评论(0)