MySQL的SQL语句 - 数据定义语句(15)- CREATE TABLESPACE 语句 (2)

接上篇

说明

● MySQL表空间命名时,斜杠字符("/")是不允许的,也不能使用以 innodb_ 开头的名称,因为这个前缀是保留给系统使用的。

● 不支持创建临时共享表空间。

● 共享表空间不支持临时表。

● TABLESPACE 选项可以与 CREATE TABLE 或 ALTER TABLE 一起使用,将 InnoDB 表分区或子分区分配给独立表空间。所有分区必须属于同一存储引擎。不支持为共享的 InnoDB 表空间分配表分区。共享表空间包括 InnoDB 系统表空间和通用表空间。

● 通用表空间支持使用 CREATE TABLE ... TABLESPACE 添加任何行格式的表。不需要启用 innodb_file_per_table。

● innodb_strict_mode 不适用于通用表空间。表空间管理规则独立于 innodb_strict_mode 严格执行。如果 CREATE TABLESPACE 参数不正确或不兼容,无论 innodb_strict_mode 设置如何,操作都会失败。当使用 CREATE TABLE ... TABLESPACE 或 ALTER TABLE ... TABLESPACE 将一个表添加到一个通用表空间时,innodb_strict_mode 被忽略,语句会按照 innodb_strict_mode 被启用的情况处理。

● 使用 DROP TABLESPACE 删除表空间。在删除表空间之前,必须使用 DROP TABLE 语句从表空间中删除所有表。在删除 NDB Cluster 表空间之前,必须使用一个或多个 ALTER TABLESPACE ... DROP DATATFILE 语句删除它的所有数据文件。

● 添加到 InnoDB 通用表空间的所有 InnoDB 表的各个部分都驻留在通用表空间中,包括索引和 BLOB 页。

对于分配到表空间的 NDB 表,只有那些没有建立索引的列存储在磁盘上,实际上使用表空间数据文件。所有 NDB 表的索引和索引列总是保存在内存中。

● 与系统表空间类似,截断或删除存储在通用表空间中的表,会在通用表空间.ibd数据文件内部创建空闲空间,该空间只能用于新的InnoDB数据。空间不会像独立表空间那样释放回操作系统。

● 通用表空间不与任何数据库或模式相关联。

● 通用表空间的表不支持 ALTER TABLE ... DISCARD TABLESPACE 和 ALTER TABLE ...IMPORT TABLESPACE 语句。

● 服务器对引用通用表空间的 DDL 使用表空间级元数据锁定。相比之下,服务器对引用独立表空间的 DDL 使用表级元数据锁定。

● 不能将生成的或现有的表空间更改为通用表空间。

● 通用表空间名称和独立表空间名称之间不存在冲突。出现在独立表空间名称中的“/”字符,在通用表空间名称中是不允许的。

● mysqldump 和 mysqlpump 不转储 InnoDB CREATE TABLESPACE 语句。

InnoDB 示例

这个示例演示了如何创建一个通用表空间,并添加三个不同行格式的未压缩表。

1. mysql> CREATE TABLESPACE `ts1` ADD DATAFILE ‘ts1.ibd‘ ENGINE=INNODB;
2. 
3. mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=REDUNDANT;
4. 
5. mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT;
6. 
7. mysql> CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC;

这个例子演示了如何创建一个通用表空间并添加一个压缩表。这个示例假设 innodb_page_size 的默认值为16K。FILE_BLOCK_SIZE 为8192要求压缩表的 KEY_BLOCK_SIZE 为8。

1. mysql> CREATE TABLESPACE `ts2` ADD DATAFILE ‘ts2.ibd‘ FILE_BLOCK_SIZE = 8192 Engine=InnoDB;
2. 
3. mysql> CREATE TABLE t4 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

这个例子演示了在不指定 ADD DATAFILE 子句的情况下创建通用表空间,在MySQL 8.0.14中,ADD DATAFILE 子句是可选的。

mysql> CREATE TABLESPACE ts3 ENGINE=INNODB;

这个例子演示了如何创建一个 undo 表空间。

1. mysql> CREATE UNDO TABLESPACE undo_003 ADD DATAFILE ‘undo_003.ibu‘;

NDB 示例

假设希望使用名为 mydata-1.dat 的数据文件创建一个名为 myts 的 NDB Cluster Disk Data 表空间。NDB 表空间总是需要使用由一个或多个 undo 日志文件组成的日志文件组。对于本例,首先使用 CREATE LOGFILE GROUP 语句创建一个名为 mylg 的日志文件组,其中包含一个名为 myundo-1.dat 的 undo 日志文件,示例如下所示:

1. mysql> CREATE LOGFILE GROUP myg1
2.     ->     ADD UNDOFILE ‘myundo-1.dat‘
3.     ->     ENGINE=NDB;
4. Query OK, 0 rows affected (3.29 sec)

现在,可以使用以下语句创建前面描述的表空间:

1. mysql> CREATE TABLESPACE myts
2.     ->     ADD DATAFILE ‘mydata-1.dat‘
3.     ->     USE LOGFILE GROUP mylg
4.     ->     ENGINE=NDB;
5. Query OK, 0 rows affected (2.98 sec)

现在可以使用带有 TABLESPACE 和 STORAGE DISK 选项的 CREATE TABLE 语句创建磁盘数据表,如下所示:

1. mysql> CREATE TABLE mytable (
2.     ->     id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
3.     ->     lname VARCHAR(50) NOT NULL,
4.     ->     fname VARCHAR(50) NOT NULL,
5.     ->     dob DATE NOT NULL,
6.     ->     joined DATE NOT NULL,
7.     ->     INDEX(last_name, first_name)
8.     -> )
9.     ->     TABLESPACE myts STORAGE DISK
10.     ->     ENGINE=NDB;
11. Query OK, 0 rows affected (1.41 sec)

需要注意的是,实际上只有来自 mytable 的 dob 和 joined 列存储在磁盘上,因为 id、lname 和 fname 列都有索引。

如前所述,当 CREATE TABLESPACE 与 ENGINE [=] NDB 一起使用时,会在每个 NDB Cluster 数据节点上创建表空间和相关的数据文件。可以通过查询 INFORMATION_SCHEMA.FILES 表来验证数据文件是否已经创建,并获得关于它们的信息,如下所示:

1. mysql> SELECT FILE_NAME, FILE_TYPE, LOGFILE_GROUP_NAME, STATUS, EXTRA
2.     ->     FROM INFORMATION_SCHEMA.FILES
3.     ->     WHERE TABLESPACE_NAME = ‘myts‘;
4. 
5. +--------------+------------+--------------------+--------+----------------+
6. | file_name    | file_type  | logfile_group_name | status | extra         |
7. +--------------+------------+--------------------+--------+----------------+
8. | mydata-1.dat | DATAFILE   | mylg               | NORMAL | CLUSTER_NODE=5 |
9. | mydata-1.dat | DATAFILE   | mylg               | NORMAL | CLUSTER_NODE=6 |
10.| NULL         | TABLESPACE | mylg               | NORMAL | NULL           |
11. +--------------+------------+--------------------+--------+----------------+
12. 3 rows in set (0.01 sec)

官方网址:
dev.mysql.com/doc/refman/8.0/en/create-tablespace.html

MySQL的SQL语句 - 数据定义语句(15)- CREATE TABLESPACE 语句 (2)

上一篇:unipp 请求拦截,响应拦截


下一篇:java+servlet+jsp 将数据库信息回显到页面中