MySQL 8.0 リファレンスマニュアル


23.5.10.1 NDB Cluster ディスクデータオブジェクト

NDB Cluster ディスクデータストレージは、次のオブジェクトを使用して実装されます:

  • テーブルスペース: ほかのディスクデータオブジェクトのコンテナとして機能します。 テーブルスペースには、1 つ以上のデータファイルと 1 つ以上の undo ログファイルグループが含まれます。

  • データファイル: カラムデータを格納します。 データファイルは、テーブルスペースに直接割り当てられます。

  • undo ログファイル: トランザクションのロールバックに必要な undo 情報が含まれます。 undo ログファイルグループに割り当てられます。

  • log file group: 1 つ以上の undo ログファイルが含まれています。 テーブルスペースに割り当てられます。

undo ログファイルとデータファイルは、各データノードのファイルシステム内の実際のファイルです。デフォルトでは、NDB Cluster config.ini ファイルで指定された DataDir 内の ndb_node_id_fs に配置され、node_id はデータノードのノード ID です。 Undo ログファイルまたはデータファイルの作成時に、ファイル名の一部として絶対パスまたは相対パスを指定すると、これらを別の場所に配置できます。 これらのファイルを作成するステートメントは、このセクションの後半で示します。

undo ログファイルは「ディスクデータ」テーブルでのみ使用され、メモリーにのみ格納されている NDB テーブルでは不要または使用されません。

「NDB Cluster」テーブルスペースおよびログファイルグループは、ファイルとして実装されません。

すべてのディスクデータオブジェクトがファイルとして実装されるとはかぎりませんが、すべてが同じ名前空間を共有します。 つまり、各ディスクデータオブジェクトは (単に、特定の型の各ディスクデータオブジェクトというだけでなく)、一意の名前が付けられている必要があります。 たとえば、テーブルスペースとログファイルグループの両方に dd1 という名前を付けることはできません。

すべてのノード (管理ノードおよび SQL ノードを含む) で「NDB Cluster」をすでに設定している場合、ディスクに「NDB Cluster」テーブルを作成する基本的なステップは次のとおりです:

  1. ログファイルグループを作成し、それに 1 つ以上の Undo ログファイルを割り当てます (Undo ログファイルは、undofile と呼ばれることもあります)。

  2. テーブルスペースを作成し、そのテーブルスペースにログファイルグループおよび 1 つ以上のデータファイルを割り当てます。

  3. データストレージ用に、このテーブルスペースを使用するディスクデータテーブルを作成します。

これらの各タスクは、次の例に示すように、mysql クライアントまたはその他の MySQL クライアントアプリケーションで SQL ステートメントを使用することで実現できます。

  1. CREATE LOGFILE GROUP を使用して、lg_1 という名前のログファイルグループを作成します。 このログファイルグループは、undo_1.log および undo_2.log という名前の 2 つの Undo ログファイルで構成されます。初期サイズは、それぞれ 16M バイトと 12M バイトです。 (Undo ログファイルのデフォルト初期サイズは128M バイトです。) 必要に応じて、ログファイルグループの undo バッファのサイズを指定したり、デフォルト値の 8 MB を想定することもできます。 この例では、UNDO バッファサイズを 2 MB に設定します。 ログファイルグループは、Undo ログファイルとともに作成する必要があります。そのため、次の CREATE LOGFILE GROUP ステートメントで undo_1.loglg_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 GROUP および ALTER LOGFILE GROUP ステートメントに ENGINE オプションが含まれている必要があります。 このオプションに指定できる値は、NDBCLUSTER および NDB のみです。

      重要

      常に同じ NDB Cluster 内に最大 1 つのログファイルグループが存在できます。

    • ADD UNDOFILE 'filename' を使用して、ログファイルグループに Undo ログファイルを追加すると、クラスタ内の各データノードの DataDir 内にある ndb_node_id_fs ディレクトリに、filename という名前のファイルが作成されます。ここで、node_id はデータノードのノード ID です。 各 Undo ログファイルのサイズは、SQL ステートメントで指定されます。 たとえば、NDB Cluster に 4 つのデータノードがある場合、示されている ALTER LOGFILE GROUP ステートメントは 4 つの undo ログファイルを作成し、それぞれ 4 つのデータノードのデータディレクトリに 1 つずつ作成します。これらの各ファイルの名前は undo_2.log で、各ファイルのサイズは 12 MB です。

    • UNDO_BUFFER_SIZE は、使用可能なシステムメモリーの量によって制限されます。

    • これらのステートメントの詳細は、セクション13.1.16「CREATE LOGFILE GROUP ステートメント」 および セクション13.1.6「ALTER LOGFILE GROUP ステートメント」 を参照してください。

  2. では、「ディスクデータ」テーブルがデータを格納するために使用するファイルの抽象コンテナであるテーブルスペースを作成できるようになりました。 テーブルスペースは特定のログファイルグループに関連付けられます。新しいテーブルスペースを作成する場合は、undo ロギングに使用するログファイルグループを指定する必要があります。 少なくとも 1 つのデータファイルを指定する必要もあります。テーブルスペースの作成後に、テーブルスペースにデータファイルを追加できます。 テーブルスペースからデータファイルを削除することもできます (このセクションの後半の例を参照)。

    ログファイルグループとして lg_1 を使用する ts_1 という名前のテーブルスペースを作成すると仮定します。 テーブルスペースには、初期サイズがそれぞれ 32 MB および 48 MB の data_1.dat および data_2.dat という名前の 2 つのデータファイルが含まれるようにします。 (INITIAL_SIZE のデフォルトの値は 128M バイトです。) これは、次に示すように、2 つの 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 は、2 つめのデータファイル (data_2.dat) を追加します。

    いくつかの注意事項:

    • undo ログファイルにこの例で使用されている .log ファイル拡張子と同様に、.dat ファイル拡張子には特別な意味はなく、認識しやすいようにのみ使用されます。

    • ADD DATAFILE 'filename' を使用して、テーブルスペースにデータファイルを追加すると、クラスタ内の各データノードの DataDir 内にある ndb_node_id_fs ディレクトリに、filename という名前のファイルが作成されます。ここで、node_id はデータノードのノード ID です。 各データファイルのサイズは、SQL ステートメントで指定します。 たとえば、NDB Cluster に 4 つのデータノードがある場合、示されている ALTER TABLESPACE ステートメントは、4 つのデータファイルを作成し、それぞれ 4 つの各データノードのデータディレクトリに 1 つずつ作成します。これらの各ファイルの名前は data_2.dat で、各ファイルのサイズは 48 MB です。

    • NDB は、データノードの再起動時に使用するために各テーブルスペースの 4% を予約します。 この領域はデータの格納には使用できません。

    • CREATE TABLESPACE ステートメントには ENGINE 句を含める必要があります。テーブルスペースに作成できるのは、テーブルスペースと同じストレージエンジンを使用するテーブルのみです。 ALTER TABLESPACE では、ENGINE 句は受け入れられますが、非推奨であり、将来のリリースで削除される可能性があります。 NDB テーブルスペースの場合、このオプションに使用できる値は NDBCLUSTER および NDB のみです。

    • NDB 8.0.20 以降では、エクステントの割り当ては、特定のテーブルスペースで使用されるすべてのデータファイル間でラウンドロビン方式で実行されます。

    • CREATE TABLESPACE および ALTER TABLESPACE ステートメントについての詳細は、セクション13.1.21「CREATE TABLESPACE ステートメント」およびセクション13.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 は、ディスク上のデータ記憶域にテーブルスペース ts_1 を使用するように NDB ストレージエンジンに指示します。

    次のようにテーブル ts_1 が作成されたら、その他の MySQL テーブルの場合と同様に、INSERTSELECTUPDATE、および DELETE ステートメントを実行できます。

    CREATE TABLE ステートメントまたは ALTER TABLE ステートメントのカラム定義の一部として STORAGE 句を使用して、個々のカラムをディスクに格納するかメモリーに格納するかを指定することもできます。 STORAGE DISK を指定するとカラムはディスク上に格納され、STORAGE MEMORY を指定するとインメモリーストレージが使用されます。 詳細は、セクション13.1.20「CREATE TABLE ステートメント」を参照してください。

次に示すように、INFORMATION_SCHEMA データベースの FILES テーブルをクエリーすることで、作成した NDB ディスクデータファイルおよび undo ログファイルに関する情報を取得できます:

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.15「INFORMATION_SCHEMA FILES テーブル」を参照してください。

ディスクに暗黙的に格納されたカラムのインデックス付け.  前述の例で定義されているテーブル dt_1 の場合、dob および joined カラムのみがディスクに格納されます。 この理由は、idlast_name、および first_name カラムにインデックスがあるため、これらのカラムに属するデータが RAM 内に格納されるためです。 インデックス付けされていないカラムのみをディスクに保持できます。インデックスおよびインデックス付けされたカラムデータは引き続きメモリーに格納されます。 インデックスの使用と RAM の保存のこのようなトレードオフは、ディスクデータテーブルを設計する際に留意する必要があります。

最初に記憶域タイプを MEMORY に変更しないと、明示的に宣言された STORAGE DISK のカラムにインデックスを追加できません。追加しようとすると、エラーで失敗します。 暗黙的がディスク記憶域を使用するカラムにはインデックスを付けることができます。その場合、カラム記憶域タイプは自動的に 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)

c2c3 および c4 自体は STORAGE DISK で宣言されていないため、インデックス付けできます。 ここでは、CREATE INDEX および ALTER TABLE をそれぞれ使用して、c2 および c3 にインデックスを追加します:

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;

これらのステートメントは、ここで示した順序で実行する必要があります。ただし、2 つの ALTER TABLESPACE ... DROP DATAFILE ステートメントは、どちらの順序でも実行できます。


関連キーワード:  NDB, テーブル, ndbinfo, ノード, データ, スペース, ndb, 作成, ステートメント, グループ