MySQL InnoDB通用表空间

举报
eric0435 发表于 2022/12/07 11:15:16 2022/12/07
【摘要】 InnoDB通用表空间通用表空间是使用create tablespace语法创建的共享InnoDB表空间。通用表空间功能和特性将在本节的以下主题中进行描述:.通用表空间的功能.创建通用表空间.在通用表空间中创建表.通用表空间支持的行格式.使用alter table语句在表空间之间移动非分区表.通用表空间支持的表分区.使用alter table语句在表空间之移动分区表.删除通用表空间.通用表空...

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不支持属于通用表空间的表。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。