文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  NDB 集群磁盘数据对象

25.6.11.1 NDB 集群磁盘数据对象

NDB 集群磁盘数据存储是使用以下对象实现的

  • 表空间:充当其他磁盘数据对象的容器。一个表空间包含一个或多个数据文件和一个或多个撤销日志文件组。

  • 数据文件:存储列数据。一个数据文件直接分配给一个表空间。

  • 撤销日志文件:包含回滚事务所需的撤销信息。分配给一个撤销日志文件组。

  • 日志文件组:包含一个或多个撤销日志文件。分配给一个表空间。

撤销日志文件和数据文件是每个数据节点文件系统中的实际文件;默认情况下,它们位于 NDB 集群 config.ini 文件中指定的 DataDir 中的 ndb_node_id_fs 中,其中 node_id 是数据节点的节点 ID。可以通过在创建撤销日志或数据文件时指定绝对路径或相对路径作为文件名的一部分,将这些文件放置在其他位置。创建这些文件的语句将在本节后面介绍。

撤销日志文件仅由磁盘数据表使用,而仅存储在内存中的 NDB 表不需要或使用它们。

NDB 集群表空间和日志文件组未实现为文件。

虽然并非所有磁盘数据对象都实现为文件,但它们共享相同的命名空间。这意味着每个磁盘数据对象都必须具有唯一名称(而不仅仅是给定类型的每个磁盘数据对象)。例如,不能同时拥有名为 dd1 的表空间和日志文件组。

假设您已经设置了包含所有节点(包括管理节点和 SQL 节点)的 NDB 集群,则在磁盘上创建 NDB 集群表的步骤如下

  1. 创建一个日志文件组,并将一个或多个撤销日志文件分配给它(撤销日志文件有时也称为 撤销文件)。

  2. 创建一个表空间;将日志文件组以及一个或多个数据文件分配给该表空间。

  3. 创建一个使用此表空间进行数据存储的磁盘数据表。

可以使用 mysql 客户端或其他 MySQL 客户端应用程序中的 SQL 语句来完成这些任务,如以下示例所示。

  1. 我们使用 CREATE LOGFILE GROUP 创建一个名为 lg_1 的日志文件组。该日志文件组由两个撤销日志文件组成,我们分别将其命名为 undo_1.logundo_2.log,其初始大小分别为 16 MB 和 12 MB。(撤销日志文件的默认初始大小为 128 MB。)您还可以选择为日志文件组的撤销缓冲区指定大小,或允许其采用默认值 8 MB。在本例中,我们将 UNDO 缓冲区的大小设置为 2 MB。必须使用撤销日志文件创建日志文件组;因此,我们在 CREATE LOGFILE GROUP 语句中将 undo_1.log 添加到 lg_1

    CREATE LOGFILE GROUP lg_1
        ADD UNDOFILE 'undo_1.log'
        INITIAL_SIZE 16M
        UNDO_BUFFER_SIZE 2M
        ENGINE NDBCLUSTER;

    要将 undo_2.log 添加到日志文件组,请使用以下 ALTER LOGFILE GROUP 语句

    ALTER LOGFILE GROUP lg_1
        ADD UNDOFILE 'undo_2.log'
        INITIAL_SIZE 12M
        ENGINE NDBCLUSTER;

    一些需要注意的事项

    • 此处使用的 .log 文件扩展名不是必需的。我们使用它只是为了使日志文件易于识别。

    • 每个 CREATE LOGFILE GROUPALTER LOGFILE GROUP 语句都必须包含 ENGINE 选项。此选项的唯一允许值为 NDBCLUSTERNDB

      重要

      在任何给定时间,同一个 NDB 集群中最多只能存在一个日志文件组。

    • 当您使用 ADD UNDOFILE 'filename' 将撤销日志文件添加到日志文件组时,会在集群中每个数据节点的 DataDir 内的 ndb_node_id_fs 目录中创建一个名为 filename 的文件,其中 node_id 是数据节点的节点 ID。每个撤销日志文件的大小均为 SQL 语句中指定的大小。例如,如果 NDB 集群有 4 个数据节点,则刚刚显示的 ALTER LOGFILE GROUP 语句将创建 4 个撤销日志文件,每个数据节点的数据目录中 1 个;这些文件都命名为 undo_2.log,并且每个文件的大小均为 12 MB。

    • UNDO_BUFFER_SIZE 受可用系统内存量的限制。

    • 有关这些语句的更多信息,请参见 第 15.1.16 节 “CREATE LOGFILE GROUP 语句”第 15.1.6 节 “ALTER LOGFILE GROUP 语句”

  2. 现在我们可以创建一个表空间,这是一个抽象容器,用于存储磁盘数据表使用的文件。表空间与特定的日志文件组相关联;在创建新表空间时,必须指定其用于撤销日志记录的日志文件组。您还必须至少指定一个数据文件;您可以在创建表空间后向其中添加更多数据文件。也可以从表空间中删除数据文件(请参阅本节后面的示例)。

    假设我们希望创建一个名为 ts_1 的表空间,它使用 lg_1 作为其日志文件组。我们希望该表空间包含两个数据文件,分别命名为 data_1.datdata_2.dat,其初始大小分别为 32 MB 和 48 MB。(INITIAL_SIZE 的默认值为 128 MB。)我们可以使用两个 SQL 语句来完成此操作,如下所示

    CREATE TABLESPACE ts_1
        ADD DATAFILE 'data_1.dat'
        USE LOGFILE GROUP lg_1
        INITIAL_SIZE 32M
        ENGINE NDBCLUSTER;
    
    ALTER TABLESPACE ts_1
        ADD DATAFILE 'data_2.dat'
        INITIAL_SIZE 48M;

    CREATE TABLESPACE 语句使用数据文件 data_1.dat 创建表空间 ts_1,并将 ts_1 与日志文件组 lg_1 相关联。ALTER TABLESPACE 添加第二个数据文件 (data_2.dat)。

    一些需要注意的事项

    • 与本例中用于撤销日志文件的 .log 文件扩展名一样,.dat 文件扩展名没有特殊含义;它仅用于便于识别。

    • 当您使用 ADD DATAFILE 'filename' 将数据文件添加到表空间时,会在集群中每个数据节点的 DataDir 内的 ndb_node_id_fs 目录中创建一个名为 filename 的文件,其中 node_id 是数据节点的节点 ID。每个数据文件的大小均为 SQL 语句中指定的大小。例如,如果 NDB 集群有 4 个数据节点,则刚刚显示的 ALTER TABLESPACE 语句将创建 4 个数据文件,每个数据节点的数据目录中 1 个;这些文件都命名为 data_2.dat,并且每个文件的大小均为 48 MB。

    • NDB 会保留每个表空间的 4% 用于数据节点重启期间使用。此空间不可用于存储数据。

    • CREATE TABLESPACE 语句必须包含 ENGINE 子句;只能在表空间中创建使用与表空间相同的存储引擎的表。对于 NDB 表空间,ALTER TABLESPACE 仅接受 ALTER TABLESPACE ... ADD DATAFILEENGINE 子句;其他任何 ALTER TABLESPACE 语句都将拒绝 ENGINE。对于 NDB 表空间,ENGINE 选项的唯一允许值为 NDBCLUSTERNDB

    • 盘区的分配是在给定表空间使用的所有数据文件之间以循环方式执行的。

    • 有关 CREATE TABLESPACEALTER TABLESPACE 语句的更多信息,请参见 第 15.1.21 节 “CREATE TABLESPACE 语句”第 15.1.10 节 “ALTER TABLESPACE 语句”

  3. 现在可以创建一个表,其未索引列存储在表空间 ts_1 的文件中的磁盘上

    CREATE TABLE dt_1 (
        member_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        last_name VARCHAR(50) NOT NULL,
        first_name VARCHAR(50) NOT NULL,
        dob DATE NOT NULL,
        joined DATE NOT NULL,
        INDEX(last_name, first_name)
        )
        TABLESPACE ts_1 STORAGE DISK
        ENGINE NDBCLUSTER;

    TABLESPACE ts_1 STORAGE DISK 告诉 NDB 存储引擎使用表空间 ts_1 在磁盘上存储数据。

    如上所示创建表 ts_1 后,您可以像使用任何其他 MySQL 表一样对其执行 INSERTSELECTUPDATEDELETE 语句。

    还可以通过在 CREATE TABLEALTER TABLE 语句中使用 STORAGE 子句作为列定义的一部分,来指定将单个列存储在磁盘上还是内存中。STORAGE DISK 会导致该列存储在磁盘上,而 STORAGE MEMORY 会导致使用内存存储。有关更多信息,请参见 第 15.1.20 节 “CREATE TABLE 语句”

您可以通过查询 INFORMATION_SCHEMA 数据库中的 FILES 表来获取有关刚刚创建的 NDB 磁盘数据文件和撤销日志文件的信息,如下所示

mysql> SELECT
              FILE_NAME AS File, FILE_TYPE AS Type,
              TABLESPACE_NAME AS Tablespace, TABLE_NAME AS Name,
              LOGFILE_GROUP_NAME AS 'File group',
              FREE_EXTENTS AS Free, TOTAL_EXTENTS AS Total
          FROM INFORMATION_SCHEMA.FILES
          WHERE ENGINE='ndbcluster';
+--------------+----------+------------+------+------------+------+---------+
| File         | Type     | Tablespace | Name | File group | Free | Total   |
+--------------+----------+------------+------+------------+------+---------+
| ./undo_1.log | UNDO LOG | lg_1       | NULL | lg_1       |    0 | 4194304 |
| ./undo_2.log | UNDO LOG | lg_1       | NULL | lg_1       |    0 | 3145728 |
| ./data_1.dat | DATAFILE | ts_1       | NULL | lg_1       |   32 |      32 |
| ./data_2.dat | DATAFILE | ts_1       | NULL | lg_1       |   48 |      48 |
+--------------+----------+------------+------+------------+------+---------+
4 rows in set (0.00 sec)

有关更多信息和示例,请参阅第 28.3.15 节“INFORMATION_SCHEMA FILES 表”

对隐式存储在磁盘上的列进行索引。 对于在刚才显示的示例中定义的表 dt_1,只有 dobjoined 列存储在磁盘上。这是因为 idlast_namefirst_name 列上有索引,因此属于这些列的数据存储在 RAM 中。只有未索引的列才能保存在磁盘上;索引和索引列数据继续存储在内存中。在设计磁盘数据表时,您必须牢记索引的使用和 RAM 的节省之间的这种权衡。

您不能将索引添加到已显式声明为 STORAGE DISK 的列,除非先将其存储类型更改为 MEMORY;任何这样做都会失败并报错。可以使用索引对隐式使用磁盘存储的列进行索引;完成此操作后,该列的存储类型会自动更改为 MEMORY隐式是指未声明其存储类型但从父表继承的列。在以下 CREATE TABLE 语句中(使用先前定义的表空间 ts_1),列 c2c3 隐式使用磁盘存储

mysql> CREATE TABLE ti (
    ->     c1 INT PRIMARY KEY,
    ->     c2 INT,
    ->     c3 INT,
    ->     c4 INT
    -> )
    ->     STORAGE DISK
    ->     TABLESPACE ts_1
    ->     ENGINE NDBCLUSTER;
Query OK, 0 rows affected (1.31 sec)

因为 c2c3c4 本身没有使用 STORAGE DISK 声明,所以可以对它们进行索引。在这里,我们分别使用 CREATE INDEXALTER TABLE 将索引添加到 c2c3

mysql> CREATE INDEX i1 ON ti(c2);
Query OK, 0 rows affected (2.72 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE ti ADD INDEX i2(c3);
Query OK, 0 rows affected (0.92 sec)
Records: 0  Duplicates: 0  Warnings: 0

SHOW CREATE TABLE 确认已添加索引。

mysql> SHOW CREATE TABLE ti\G
*************************** 1. row ***************************
       Table: ti
Create Table: CREATE TABLE `ti` (
  `c1` int(11) NOT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  `c4` int(11) DEFAULT NULL,
  PRIMARY KEY (`c1`),
  KEY `i1` (`c2`),
  KEY `i2` (`c3`)
) /*!50100 TABLESPACE `ts_1` STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

您可以使用 ndb_desc 查看索引列(强调文本)现在使用内存存储而不是磁盘存储

$> ./ndb_desc -d test t1
-- t1 --
Version: 33554433
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 4
Number of primary keys: 1
Length of frm data: 317
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 4
FragmentCount: 4
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options:
HashMap: DEFAULT-HASHMAP-3840-4
-- Attributes --
c1 Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c2 Int NULL AT=FIXED ST=MEMORY
c3 Int NULL AT=FIXED ST=MEMORY
c4 Int NULL AT=FIXED ST=DISK
-- Indexes --
PRIMARY KEY(c1) - UniqueHashIndex
i2(c3) - OrderedIndex
PRIMARY(c1) - OrderedIndex
i1(c2) - OrderedIndex

性能说明。 如果将磁盘数据文件与数据节点文件系统保存在不同的物理磁盘上,则使用磁盘数据存储的集群的性能会大大提高。必须对集群中的每个数据节点执行此操作才能获得任何显着的收益。

您可以将绝对和相对文件系统路径与 ADD UNDOFILEADD DATAFILE 一起使用;相对于数据节点的数据目录计算相对路径。

必须按特定顺序创建日志文件组、表空间和任何使用它们的磁盘数据表。删除这些对象也是如此,但须遵守以下约束

  • 只要有任何表空间使用日志文件组,就不能删除它。

  • 只要表空间包含任何数据文件,就不能删除它。

  • 只要仍有表在使用表空间,就不能从表空间中删除任何数据文件。

  • 无法删除与创建文件时使用的表空间以外的其他表空间相关联创建的文件。

例如,要删除本节到目前为止创建的所有对象,可以使用以下语句

mysql> DROP TABLE dt_1;

mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_2.dat';

mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_1.dat';

mysql> DROP TABLESPACE ts_1;

mysql> DROP LOGFILE GROUP lg_1;

这些语句必须按所示顺序执行,但两个 ALTER TABLESPACE ... DROP DATAFILE 语句可以按任意顺序执行。

注意

旧版本的 NDB Cluster 在 ALTER TABLESPACE ... DROP DATAFILEDROP TABLESPACE 中使用 ENGINE 子句。在 NDB 8.4 及更高版本中,不再支持这两种语句。