NDB Cluster 磁盘数据存储是使用以下对象实现的:
- 表空间:充当其他磁盘数据对象的容器。一个表空间包含一个或多个数据文件和一个或多个撤销日志文件组。 
- 数据文件:存储列数据。数据文件直接分配给表空间。 
- 撤消日志文件:包含回滚事务所需的撤消信息。分配给撤消日志文件组。 
- 日志文件组:包含一个或多个撤消日志文件。分配给一个表空间。 
        Undo log文件和数据文件是每个数据节点文件系统中的实际文件;默认情况下,它们放置在
        NDB Cluster文件中指定的位置,其中
        是数据节点的节点 ID。在创建撤消日志或数据文件时,通过将绝对路径或相对路径指定为文件名的一部分,可以将它们放置在别处。创建这些文件的语句将在本节后面显示。
      ndb_node_id_fsDataDirconfig.ininode_id
NDB撤消日志文件仅供磁盘数据表使用,仅存储在内存中
      
        的表不需要或不使用它们。
NDB Cluster 表空间和日志文件组未作为文件实现。
        尽管并非所有磁盘数据对象都作为文件实现,但它们都共享相同的命名空间。这意味着
        每个磁盘数据对象必须唯一命名(而不仅仅是给定类型的每个磁盘数据对象)。例如,您不能将表空间和日志文件组都命名为dd1.
      
假设您已经设置了一个包含所有节点(包括管理和 SQL 节点)的 NDB Cluster,在磁盘上创建 NDB Cluster 表的基本步骤如下:
- 创建一个日志文件组,并为其分配一个或多个撤消日志文件(撤消日志文件有时也称为撤消文件)。 
- 创建表空间;将日志文件组以及一个或多个数据文件分配给表空间。 
- 创建一个使用此表空间进行数据存储的磁盘数据表。 
这些任务中的每一个都可以使用mysql客户端或其他 MySQL 客户端应用程序中的 SQL 语句来完成,如以下示例所示。
- 我们创建一个名为 - lg_1using的日志文件组- CREATE LOGFILE GROUP。这个日志文件组将由两个撤销日志文件组成,我们命名为- undo_1.log和- undo_2.log,它们的初始大小分别为 16 MB 和 12 MB。(撤消日志文件的默认初始大小为 128 MB。)您还可以选择为日志文件组的撤消缓冲区指定大小,或允许它采用默认值 8 MB。在此示例中,我们将 UNDO 缓冲区的大小设置为 2 MB。必须使用撤消日志文件创建日志文件组;所以我们- undo_1.log在- lg_1这个- CREATE LOGFILE GROUP声明中添加:- 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 GROUPand- ALTER LOGFILE GROUP语句都必须包含一个- ENGINE选项。此选项的唯一允许值是- NDBCLUSTER和- NDB。重要的- 在任何给定时间,同一个 NDB Cluster 中最多可以存在一个日志文件组。 
- 当您使用 将撤消日志文件添加到日志文件组 时,将在集群中每个数据节点 的 目录中 创建 一个名称为 的文件,其中是数据节点的节点 ID。每个撤消日志文件的大小都在 SQL 语句中指定。例如,如果 NDB Cluster 有 4 个数据节点,那么刚才显示的语句创建 4 个撤消日志文件,每个 1 个在 4 个数据节点的数据目录中;这些文件中的每一个都被命名 - ADD UNDOFILE '- filename'- filename- ndb_- node_id_fs- DataDir- node_id- ALTER LOGFILE GROUP- undo_2.log每个文件的大小为 12 MB。
- UNDO_BUFFER_SIZE受可用系统内存量的限制。
- 有关这些语句的更多信息, 请参阅第 13.1.16 节,“CREATE LOGFILE GROUP 语句”和 第 13.1.6 节,“ALTER LOGFILE GROUP 语句” 。 
 
- 现在我们可以创建一个表空间——磁盘数据表用来存储数据的文件的抽象容器。表空间与特定的日志文件组相关联;创建新表空间时,必须指定它用于撤消日志记录的日志文件组。您还必须指定至少一个数据文件;创建表空间后,您可以向表空间添加更多数据文件。也可以从表空间中删除数据文件(参见本节后面的示例)。 - 假设我们希望创建一个名为 - ts_1which的表空间- lg_1用作其日志文件组。我们希望表空间包含两个数据文件,名为- data_1.dat和- data_2.dat,其初始大小分别为 32 MB 和 48 MB。(默认值为- INITIAL_SIZE128 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创建一个表空间,并与日志文件组 相关联。添加第二个数据文件 ( )。- ts_1- data_1.dat- ts_1- lg_1- ALTER TABLESPACE- data_2.dat- 一些注意事项: - 与 - .log本例中用于撤消日志文件的 文件扩展名一样- .dat,文件扩展名没有特殊意义;它仅用于便于识别。
- 当您使用 将数据文件添加到表空间 时,将在集群中每个数据节点 的 目录中 创建 名称为 的文件,其中是数据节点的节点 ID。每个数据文件的大小都在 SQL 语句中指定。例如,如果 NDB Cluster 有 4 个数据节点,那么刚才显示的语句创建 4 个数据文件,每个 4 个数据节点的数据目录中各 1 个;每个文件都有名称 ,每个文件的大小为 48 MB。 - ADD DATAFILE '- filename'- filename- ndb_- node_id_fs- DataDir- node_id- ALTER TABLESPACE- data_2.dat
- NDB保留每个表空间的 4% 供数据节点重启期间使用。此空间不可用于存储数据。
- CREATE TABLESPACE语句必须包含一个- ENGINE子句;只有使用与表空间相同的存储引擎的表才能在表空间中创建。对于- ALTER TABLESPACE,一个- ENGINE子句被接受但被弃用并在未来的版本中被删除。对于- NDB表空间,此选项的唯一允许值是- NDBCLUSTER和- NDB。
- 在 NDB 8.0.20 及更高版本中,范围的分配在给定表空间使用的所有数据文件之间以循环方式执行。 
- 有关 - CREATE TABLESPACEand- ALTER TABLESPACE语句的更多信息,请参阅第 13.1.21 节,“CREATE TABLESPACE 语句”和 第 13.1.10 节,“ALTER TABLESPACE 语句”。
 
- 现在可以使用表空间中的文件创建一个表,其未索引列存储在磁盘上 - 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在磁盘上存储数据。- 如图所示创建表后,您可以像对任何其他 MySQL 表一样对其 - ts_1执行- INSERT、- SELECT、- UPDATE和 语句。- DELETE- 还可以通过在or语句中使用 - STORAGE子句作为列定义的一部分 来指定单个列是存储在磁盘上还是内存 中。 导致列存储在磁盘上,并导致使用内存存储。有关详细信息,请参阅 第 13.1.20 节,“CREATE TABLE 语句”。- CREATE TABLE- ALTER TABLE- STORAGE DISK- STORAGE MEMORY
        您可以通过查询数据库中的表
        来获取NDB刚刚创建的磁盘数据文件和undo日志文件
        的信息,如下所示:
      FILESINFORMATION_SCHEMA
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)有关更多信息和示例,请参阅 第 26.3.15 节,“INFORMATION_SCHEMA FILES 表”。
隐式存储在磁盘上的列的索引。 
          对于dt_1刚刚显示的示例中定义的表,只有dob和
          joined列存储在磁盘上。id这是因为、
           last_name、 和
          列上有索引first_name,所以属于这些列的数据存储在 RAM 中。只有非索引列可以保存在磁盘上;索引和索引列数据继续存储在内存中。在设计磁盘数据表时,必须牢记索引使用和 RAM 保护之间的权衡。
        
STORAGE DISK如果不先将其存储类型更改为,
        则不能向已显式声明的列添加索引MEMORY;任何这样做的尝试都会因错误而失败。隐式使用磁盘存储的列
        可以被索引;完成后,列的存储类型将更改为MEMORY自动。“
        隐式”是指未声明其存储类型但继承自父表的列。在以下 CREATE TABLE 语句(使用ts_1先前定义的表空间)中,列
        c2和c3隐式使用磁盘存储:
      
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)
        因为c2、c3和
        c4本身没有用 声明
        STORAGE DISK,所以可以对它们进行索引。在这里,我们分别使用和为c2和
        添加索引:
      c3CREATE
        INDEXALTER TABLE
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=latin1
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
NDBT_ProgramExit: 0 - OK性能说明。 如果磁盘数据文件保存在与数据节点文件系统不同的物理磁盘上,则使用磁盘数据存储的集群的性能会大大提高。必须对集群中的每个数据节点执行此操作才能获得任何明显的好处。
        您可以将绝对和相对文件系统路径与
        ADD UNDOFILE和一起使用ADD
        DATAFILE;相对路径是根据数据节点的数据目录计算的。
      
必须按特定顺序创建日志文件组、表空间和使用它们的任何磁盘数据表。删除这些对象也是如此,但要遵守以下限制:
- 只要有任何表空间使用日志文件组,就不能删除它。 
- 只要表空间包含任何数据文件,它就不能被删除。 
- 只要还有任何表正在使用表空间,就不能从表空间中删除任何数据文件。 
- 不可能删除与创建文件的表空间不同的表空间关联创建的文件。 
例如,要删除到目前为止在本节中创建的所有对象,您可以使用以下语句:
mysql> DROP TABLE dt_1;
mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_2.dat'
    -> ENGINE NDBCLUSTER;
mysql> ALTER TABLESPACE ts_1
    -> DROP DATAFILE 'data_1.dat'
    -> ENGINE NDBCLUSTER;
mysql> DROP TABLESPACE ts_1
    -> ENGINE NDBCLUSTER;
mysql> DROP LOGFILE GROUP lg_1
    -> ENGINE NDBCLUSTER;
        这些语句必须按所示顺序执行,但两个ALTER TABLESPACE ... DROP
        DATAFILE语句可以按任一顺序执行。