暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

数据库杂货铺 2021-04-12
606
接上篇
 
说明
 
● 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 示例
 
这个示例演示了如何创建一个通用表空间,并添加三个不同行格式的未压缩表。
 
    mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENGINE=INNODB;


    mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=REDUNDANT;


    mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPACT;


    mysql> CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=DYNAMIC;
     
    这个例子演示了如何创建一个通用表空间并添加一个压缩表。这个示例假设 innodb_page_size 的默认值为16KFILE_BLOCK_SIZE 8192要求压缩表的 KEY_BLOCK_SIZE 8
     
      mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;


      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 表空间。
         
          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 日志文件,示例如下所示:
           
            mysql> CREATE LOGFILE GROUP myg1
            -> ADD UNDOFILE 'myundo-1.dat'
            -> ENGINE=NDB;
            Query OK, 0 rows affected (3.29 sec)
             
            现在,可以使用以下语句创建前面描述的表空间:
             
              mysql> CREATE TABLESPACE myts
              -> ADD DATAFILE 'mydata-1.dat'
              -> USE LOGFILE GROUP mylg
              -> ENGINE=NDB;
              Query OK, 0 rows affected (2.98 sec)
               
              现在可以使用带有 TABLESPACE 和 STORAGE DISK 选项的 CREATE TABLE 语句创建磁盘数据表,如下所示:
               
                mysql> CREATE TABLE mytable (
                -> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
                -> lname VARCHAR(50) NOT NULL,
                -> fname VARCHAR(50) NOT NULL,
                -> dob DATE NOT NULL,
                -> joined DATE NOT NULL,
                -> INDEX(last_name, first_name)
                -> )
                -> TABLESPACE myts STORAGE DISK
                -> ENGINE=NDB;
                Query OK, 0 rows affected (1.41 sec)
                 
                需要注意的是,实际上只有来自 mytable 的 dob joined 列存储在磁盘上,因为 idlname fname 列都有索引。
                 
                如前所述,当 CREATE TABLESPACE 与 ENGINE [=] NDB 一起使用时,会在每个 NDB Cluster 数据节点上创建表空间和相关的数据文件。可以通过查询 INFORMATION_SCHEMA.FILES 表来验证数据文件是否已经创建,并获得关于它们的信息,如下所示:
                 
                  mysql> SELECT FILE_NAME, FILE_TYPE, LOGFILE_GROUP_NAME, STATUS, EXTRA
                  -> FROM INFORMATION_SCHEMA.FILES
                  -> WHERE TABLESPACE_NAME = 'myts';


                  +--------------+------------+--------------------+--------+----------------+
                  | file_name | file_type | logfile_group_name | status | extra |
                  +--------------+------------+--------------------+--------+----------------+
                  | mydata-1.dat | DATAFILE | mylg | NORMAL | CLUSTER_NODE=5 |
                  | mydata-1.dat | DATAFILE | mylg | NORMAL | CLUSTER_NODE=6 |
                  | NULL | TABLESPACE | mylg | NORMAL | NULL |
                  +--------------+------------+--------------------+--------+----------------+
                  3 rows in set (0.01 sec)
                   
                   
                   
                   
                   
                   
                   
                   
                  官方网址:
                  dev.mysql.com/doc/refman/8.0/en/create-tablespace.html
                   

                  文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论