NDB Cluster では、CREATE TABLE
または ALTER TABLE
ステートメントのテーブルコメントを使用して NDB_TABLE
オプションを指定することもできます。NDB_TABLE
オプションは、文字列 NDB_TABLE=
に続いて、必要に応じてカンマで区切り、1 つ以上の名前 - 値ペアで構成されます。 名前と値の構文の完全な構文を次に示します:
COMMENT="NDB_TABLE=ndb_table_option[,ndb_table_option[,...]]"
ndb_table_option: {
NOLOGGING={1 | 0}
| READ_BACKUP={1 | 0}
| PARTITION_BALANCE={FOR_RP_BY_NODE | FOR_RA_BY_NODE | FOR_RP_BY_LDM
| FOR_RA_BY_LDM | FOR_RA_BY_LDM_X_2
| FOR_RA_BY_LDM_X_3 | FOR_RA_BY_LDM_X_4}
| FULLY_REPLICATED={1 | 0}
}
引用符で囲まれた文字列内ではスペースを使用できません。 文字列では大文字と小文字は区別されません。
この方法でコメントの一部として設定できる 4 つの NDB
テーブルオプションについては、次のいくつかの段落で詳しく説明します。
NOLOGGING
: 1 を使用することは、ndb_table_no_logging
を有効にすることに対応していますが、実際の影響はありません。 プレースホルダとして提供され、主に ALTER TABLE
ステートメントの完全性のために使用されます。
READ_BACKUP
: このオプションを 1 に設定すると、ndb_read_backup
が有効になっている場合と同じ効果があり、レプリカからの読取りが可能になります。 これにより、テーブルからの読取りのパフォーマンスが大幅に向上しますが、書込みパフォーマンスに対するコストは比較的低くなります。 NDB 8.0.19 以降、1 が READ_BACKUP
のデフォルトであり、ndb_read_backup
のデフォルトは ON
です (以前は、すべてのレプリカからの読み取りがデフォルトで無効になっていました)。
次に示すような ALTER TABLE
ステートメントを使用して、既存のテーブルに対して READ_BACKUP
をオンラインで設定できます:
ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=1";
ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=0";
ALTER TABLE
の ALGORITHM
オプションの詳細は、セクション23.5.11「NDB Cluster での ALTER TABLE を使用したオンライン操作」 を参照してください。
PARTITION_BALANCE
: パーティションの割当ておよび配置をさらに制御します。 次の 4 つのスキームがサポートされています:
-
FOR_RP_BY_NODE
: ノードごとに 1 つのパーティション。プライマリパーティションを格納する LDM はノードごとに 1 つのみです。 各パーティションは、すべてのノードの同じ LDM (同じ ID) に格納されます。
-
FOR_RA_BY_NODE
: ノードグループごとに 1 つのパーティション。各ノードには、単一のパーティション (プライマリレプリカまたはバックアップレプリカのいずれか) が格納されます。 各パーティションは、すべてのノードの同じ LDM に格納されます。
-
FOR_RP_BY_LDM
: 各ノードの LDM ごとに 1 つのパーティション (デフォルト)。これは、
READ_BACKUP
が 1 に設定されている場合に使用する設定です。 -
FOR_RA_BY_LDM
: 各ノードグループの LDM ごとに 1 つのパーティション。これらのパーティションには、プライマリパーティションまたはバックアップパーティションを指定できます。
-
FOR_RA_BY_LDM_X_2
: 各ノードグループの LDM ごとに 2 つのパーティション。これらのパーティションには、プライマリパーティションまたはバックアップパーティションを指定できます。
-
FOR_RA_BY_LDM_X_3
: 各ノードグループの LDM ごとに 3 つのパーティション。これらのパーティションには、プライマリパーティションまたはバックアップパーティションを指定できます。
-
FOR_RA_BY_LDM_X_4
: 各ノードグループの LDM ごとに 4 つのパーティション。これらのパーティションには、プライマリパーティションまたはバックアップパーティションを指定できます。
PARTITION_BALANCE
は、テーブル当たりのパーティション数を設定するための推奨インタフェースです。 MAX_ROWS
を使用したパーティションの数の強制は非推奨ですが、下位互換性のために引き続きサポートされます。MySQL NDB Cluster の将来のリリースでは削除される予定です。 (Bug #81759、Bug #23544301)
FULLY_REPLICATED
は、テーブルが完全にレプリケートされるかどうか、つまり各データノードにテーブルの完全なコピーがあるかどうかを制御します。 テーブルの完全レプリケーションを有効にするには、FULLY_REPLICATED=1
を使用します。
この設定は、ndb_fully_replicated
システム変数を使用して制御することもできます。 これを ON
に設定すると、すべての新しい NDB
テーブルに対してデフォルトでオプションが有効になります。デフォルトは OFF
です。 ndb_data_node_neighbour
システム変数は完全にレプリケートされたテーブルにも使用され、完全にレプリケートされたテーブルにアクセスしたときに、この MySQL Server に対してローカルなデータノードにアクセスするようにします。
NDB
テーブルの作成時にこのようなコメントを使用する CREATE TABLE
ステートメントの例を次に示します:
mysql> CREATE TABLE t1 (
> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
> c2 VARCHAR(100),
> c3 VARCHAR(100) )
> ENGINE=NDB
>
COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";
コメントは、SHOW CREATE TABLE
の出力の一部として表示されます。 コメントのテキストは、次の例に示すように、MySQL Information Schema TABLES
テーブルのクエリーからも使用できます:
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
TABLE_NAME: t1
TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)
このコメント構文は、次に示すように、NDB
テーブルの ALTER TABLE
ステートメントでもサポートされます:
mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
NDB 8.0.21 以降、TABLE_COMMENT
カラムには、次のように ALTER TABLE
ステートメントのあとにテーブルを再作成するために必要なコメントが表示されます:
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
-> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
TABLE_NAME: t1
TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT |
+------------+--------------+--------------------------------------------------+
| t1 | c | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE |
| t1 | d | |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)
ALTER TABLE
で使用されるテーブルコメントは、テーブルに存在する可能性のある既存のコメントを置き換えることに注意してください。
mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
> FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT |
+------------+--------------+--------------------------------------------------+
| t1 | c | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE |
| t1 | d | |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)
NDB 8.0.21 より前は、ALTER TABLE
で使用されていたテーブルコメントによって、テーブルに存在する可能性のある既存のコメントが置き換えられていました。 これは、たとえば、READ_BACKUP
値が ALTER TABLE
ステートメントによって設定された新しいコメントに引き継がれず、未指定の値がデフォルトに戻されたことを意味します。 (BUG#30428829) そのため、SQL を使用して以前にコメントに設定された値を取得する方法がなくなりました。 コメント値がデフォルトに戻らないようにするには、既存のコメント文字列からそのような値を保持し、ALTER TABLE
に渡されるコメントに含める必要がありました。
PARTITION_BALANCE
オプションの値は、ndb_desc の出力にも表示されます。ndb_desc には、READ_BACKUP
および FULLY_REPLICATED
オプションがテーブルに設定されているかどうかも表示されます。 詳細は、このプログラムの説明を参照してください。