• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • NDB群集磁盘数据对象

    DB群集磁盘数据存储使用以下对象实现:

    • 表空间:充当其他磁盘数据对象的容器。一个表空间包含一个或多个数据文件以及一个或多个撤消日志文件组。
    • 数据文件:存储列数据。数据文件直接分配给表空间。
    • 撤消日志文件:包含回滚事务所需的撤消信息。分配给撤消日志文件组。
    • 日志文件组:包含一个或多个撤消日志文件。分配给表空间。

    撤消日志文件和数据文件是每个数据节点文件系统中的实际文件;默认情况下它们被放置在在在NDB簇指定文件,并且其中是数据节点的节点ID。创建撤消日志或数据文件时,可以通过将绝对路径或相对路径指定为文件名的一部分来将它们放置在其他位置。创建这些文件的语句将在本节后面显示。ndb_node_id_fsDataDirconfig.ininode_id

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

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

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

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

    1. 创建一个日志文件组,并为其分配一个或多个撤消日志文件(撤消日志文件有时也称为undofile)。
    2. 创建一个表空间;将日志文件组以及一个或多个数据文件分配给表空间。
    3. 创建一个使用该表空间进行数据存储的磁盘数据表。

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

    1. 我们创建一个名为日志文件组lg_1使用CREATE LOGFILE GROUP。该日志文件组由两个撤消日志文件组成,我们分别将其命名为undo_1.logundo_2.log,其初始大小分别为16 MB和12 MB。(撤消日志文件的默认初始大小为128 MB。)(可选)您还可以为日志文件组的撤消缓冲区指定大小,或允许其采用默认值8 MB。在此示例中,我们将UNDO缓冲区的大小设置为2 MB。必须使用撤消日志文件创建日志文件组;所以我们添加undo_1.loglg_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选项。此选项唯一允许的值为NDBCLUSTERNDB

        重要

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

      • 当您使用将undo日志文件添加到日志文件组时,将在集群中每个数据节点的目录中创建一个名称为的文件,该数据节点是该数据节点的节点ID。每个撤消日志文件具有SQL语句中指定的大小。例如,如果NDB群集具有4个数据节点,则刚刚显示的语句将创建4个撤消日志文件,每个4个数据节点的数据目录中的1个打开;这些文件中的每一个都被命名为ADD UNDOFILE 'filename'filenamendb_node_id_fsDataDirnode_idALTER LOGFILE GROUPundo_2.log每个文件的大小为12 MB。
      • UNDO_BUFFER_SIZE受可用系统内存量的限制。
      • 有关这些语句的更多信息,请参见“ CREATE LOGFILE GROUP语句”和“ ALTER LOGFILE GROUP语句”。
    2. 现在,我们可以创建一个表空间-一个磁盘数据表用来存储数据的文件的抽象容器。表空间与特定的日志文件组关联;创建新表空间时,必须指定用于撤消日志记录的日志文件组。您还必须指定至少一个数据文件。创建表空间后,可以将更多数据文件添加到表空间。还可以从表空间删除数据文件(请参阅本节后面的示例)。

      假定我们希望创建一个表空间ts_1,该表空间lg_1用作其日志文件组。我们希望表空间包含两个数据文件,分别名为data_1.datdata_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群集具有4个数据节点,则刚刚显示的语句将创建4个数据文件,每个文件在4个数据节点的数据目录中各1个;每个文件都被命名,每个文件的大小为48 MB。ADD DATAFILE 'filename'filenamendb_node_id_fsDataDirnode_idALTER TABLESPACEdata_2.dat
      • NDB保留每个表空间的4%,以便在数据节点重新启动期间使用。该空间不可用于存储数据。
      • CREATE TABLESPACE语句必须包含一个ENGINE子句;在表空间中只能创建使用与表空间相同的存储引擎的表。对于ALTER TABLESPACEENGINE子句被接受,但已被弃用,并可能在将来的版本中删除。对于NDB表空间,此选项唯一允许的值为NDBCLUSTERNDB
      • 有关CREATE TABLESPACEALTER TABLESPACE语句的更多信息,请参见“ CREATE TABLESPACE语句”和“ 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已经创建如图所示,您可以执行INSERTSELECTUPDATE,和DELETE它的语句,就像你会与任何其他MySQL表。

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

    您可以NDB通过查询数据库中的FILES表来获取有关刚创建的磁盘数据文件和撤消日志文件的INFORMATION_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)
    

    有关更多信息和示例,请参见“ INFORMATION_SCHEMA文件表”。

    隐式存储在磁盘上的列的索引。对于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,因此可以为其编制索引。在这里,我们分别使用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看到索引列(强调的文本)现在使用内存而不是磁盘存储:

    shell> ./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语句可以按任一顺序执行。