このトピックでは、グローバルデータベースネットワーク (GDN) でのDDLレプリケーション操作について説明します。
効率的なDMLレプリケーションは、GDNの上流クラスターと下流クラスター間のテーブル一貫性を実装します。 DDLレプリケーションは、GDNのプライマリクラスターとセカンダリクラスター間のスキーマの整合性を保証します。 GDNのプライマリクラスタとセカンダリクラスタ間のスキーマの一貫性は、テーブル構造の一貫性だけでなく、すべてのデータベースオブジェクトの一貫性も意味します。 これにより、フェールオーバーが発生したときにセカンダリクラスタがアプリケーショントラフィックを運ぶことができます。 そうしないと、インデックスを失うことでも重大なパフォーマンスの問題が発生します。
DDLタイプ
PolarDB-Xは、MySQLと互換性のある共通のテーブル、列、インデックス、ビュー、関数だけでなく、テーブルグループ、シーケンス、グローバルセカンダリインデックス (GSI) 、クラスタ列インデックス (CCI) 、カスタム関数などのカスタムオブジェクトタイプもサポートしています。 PolarDB-Xは、TTL、locality、online modify column (OMC) 、ローカルインデックスなどのカスタム拡張構文も提供します。 DDLレプリケーションは、互換性と分散シナリオの複雑さの両方の点で困難です。 したがって、PolarDB-Xは、シンプルさ、信頼性、使いやすさを特徴とする組み込みのDDLレプリケーション機能を提供します。
次の表に、サポートされるDDLタイプを示します。
データ型 | DDLステートメント | サポートされているかどうか | 補足 |
データベース | CREATE_DATABASE | 必須 | 詳細については、「データベースステートメント」をご参照ください。 説明 ALTER DATABASEステートメントでは、文字セットを変更できません。 したがって、ALTER DATABASEはレプリケーションシナリオではサポートされません。 |
DROP_DATABASE | 必須 | ||
ALTER_DATABASE | 任意 | ||
MOVE_DATABASE | 任意 | ||
テーブル | CREATE_TABLE | 必須 | 詳細については、「テーブルステートメント」をご参照ください。 |
ALTER_TABLE | 必須 | ||
DROP_TABLE | 必須 | ||
TRUNCATE_TABLE | 必須 | ||
RENAME_TABLE | 必須 | ||
ANALYZE_TABLE | 必須 | ||
パーティー | SPLIT_PARTITION | 必須 | 詳細については、「Partitionステートメント」をご参照ください。 説明 パーティションの移行はサポートされていません。 詳細については、「制限1」をご参照ください。 |
SPLIT_INTO_BY_HOT_VALUE | 必須 | ||
MERGE_PARTITIONS | 必須 | ||
MOVE_PARTITIONS | いいえ | ||
RENAME_PARTITION | 必須 | ||
ADD_PARTITION | 必須 | ||
DROP_PARTITION | 必須 | ||
MODIFY_PARTITION | 必須 | ||
REORGANIZE_PARTITION | 必須 | ||
TRUNCATE_PARTITION | 必須 | ||
TABLEGROUP | CREATE_TABLEGROUP | 必須 | 詳細については、「テーブルグループステートメント」をご参照ください。 |
DROP_TABLEGROUP | 必須 | ||
ALTER_TABLEGROUP | 必須 | ||
MERGE_TABLEGROUP | 必須 | ||
ALTER_TABLEGROUP_ADD_TABLE | 必須 | ||
ALTER_TABLE_SET_TABLEGROUP | 必須 | ||
JOINGROUP | CREATE_JOINGROUP | 必須 | |
ALTER_JOINGROUP | 必須 | ||
DROP_JOINGROUP | 必須 | ||
INDEX | CREATE_INDEX | 必須 | 詳細は、「インデックス」をご参照ください。 |
DROP_INDEX | 必須 | ||
ALTER_INDEX | 必須 | ||
ALTER_INDEX_VISIBILITY | 必須 | ||
シーケンス | CREATE_SEQUENCE | 必須 | 詳細については、「シーケンス」をご参照ください。 |
DROP_SEQUENCE | 必須 | ||
ALTER_SEQUENCE | 必須 | ||
RENAME_SEQUENCE | 必須 | ||
CONVET_ALL_シーケンス | 必須 | ||
機能 | CREATE_FUNCTION | 必須 | 詳細については、「カスタム関数」をご参照ください。 |
DROP_FUNCTION | 必須 | ||
ALTER_FUNCTION | 必須 | ||
CREATE_JAVA_FUNCTION | 必須 | ||
ALTER_JAVA_FUNCTION | 必須 | ||
DROP_JAVA_FUNCTION | 必須 | ||
手続き | CREATE_PROCEDURE | 必須 | 詳細については、「ストアドプロシージャ」をご参照ください。 |
ALTER_PROCEDURE | 必須 | ||
DROP_PROCEDURE | 必須 | ||
VIEW | CREATE_VIEW | 必須 | 詳細については、「ビュー」をご参照ください。 |
DROP_VIEW | 必須 | ||
ALTER_VIEW | 必須 | ||
CREATE_MATERIALIZED_VIEW | 必須 | ||
DROP_MATERIALIZED_VIEW | 必須 | ||
USER | CREATE_USER | 必須 | 詳細については、「アカウントと権限の管理」をご参照ください。 |
DROP_USER | 必須 | ||
SET_PASSWORD | 必須 | ||
GRANT_PRIVILEGE_TO_USER | 必須 | ||
REVOKE_PRIVILEGE_FROM_USER | 必須 | ||
ロール | CREATE_ROLE | 必須 | 詳細については、「ロールと権限の管理」をご参照ください。 |
DROP_ROLE | 必須 | ||
GRANT_PRIVILEGE_TO_ROLE | 必須 | ||
GRANT_ROLE_TO_USER | 必須 | ||
SQL_SET_DEFAULT_ROLE | 必須 | ||
REVOKE_PRIVILEGE_FROM_ROLE | 必須 | ||
REVOKE_ROLE_FROM_USER | 必須 | ||
SET | グローバルに設定... | いいえ | PolarDB-Xは、ネイティブMySQLと同じポリシーを採用しています。 プライマリ /セカンダリレプリケーションリンクが確立されている場合、データは同期されません。 これはスキーマの変更ではありません。 スキーマを変更するには、プライマリクラスターとセカンダリクラスターで別々に操作を実行します。 |
SQL のスロットリング | * | いいえ | SQLスロットリングは一時的な操作です。 GDNのセカンダリクラスターにスロットリングルールをコピーすることはできません。 スロットリングルールをセカンダリクラスターにコピーするには、プライマリクラスターとセカンダリクラスターで別々に操作を実行する必要があります。 |
CCI (CREATE COLUMNAR INDEX、DROP COLUMNAR INDEX、およびALTER COLUMNAR INDEX) に関連するDDLステートメントはレプリケートできません。
テーブルグループの種類
PolarDB-Xは、明示的テーブルグループと暗黙的テーブルグループの2種類のテーブルグループをサポートしています。
create TABLEGROUPステートメントを実行して明示的なテーブルグループを作成し、DROP TABLEGROUPステートメントを実行してテーブルグループを削除し、ALTER TABLEGROUPステートメントを実行してテーブルグループを変更できます。 詳細は、「テーブルグループ」をご参照ください。暗黙のテーブルグループは、PolarDB-Xによって暗黙的に作成されます。 パーティションテーブルを作成したり、パーティションテーブルを削除したり、テーブルのパーティションタイプを変更したりすると、暗黙のテーブルグループが作成、変更、または削除されることがあります。 暗黙的なテーブルグループの場合、
CREATE TABLEGROUPおよびDROP TABLEGROUPステートメントは使用できませんが、ALTER TABLEGROUPステートメントは使用できます。 暗黙のテーブルグループは、tg1、tg2、tg3などのシーケンス番号リストを維持する名前が付けられます。 シーケンス番号は、不確実性を伴って生成される。 例えば、分割テーブルT1およびT2が並列に作成される場合、これら2つのテーブルの暗黙テーブルグループのシーケンス番号はランダムである。 加えて、いくつかのシーケンス番号はスキップされ得る。 たとえば、テーブルグループのシーケンス番号が既存のシーケンス番号に1を追加することによって生成され、DDLタスクフローがロールバックされると、生成されたシーケンス番号はスキップされます。
暗黙的なテーブルグループは、PolarDB-Xのプライマリ /セカンダリレプリケーションに課題をもたらします。 プライマリクラスタとセカンダリクラスタがデフォルトのルールに基づいて独自の暗黙的なテーブルグループを生成する場合、プライマリクラスタとセカンダリクラスタの同じテーブルの暗黙的なテーブルグループの名前が一致しないか、すべての暗黙的なテーブルグループの名前が混同される可能性があります。 GDNの場合、暗黙のテーブルグループはDDLステートメントを拡張することによってレプリケートされます。 DDL文に暗黙的なテーブルグループの変更が含まれる場合、拡張DDL文はプライマリクラスターのバイナリログに記録されます。
例 1
テーブルを作成するための次のSQL文が送信されます。
create table if not exists tb1 (
a int PRIMARY KEY,
b int,
c int,
d varchar(10) UNIQUE,
INDEX b(b),
INDEX b_2(b),
KEY b_3 (b),
KEY b_4 (b),
UNIQUE KEY b_5 (b),
UNIQUE KEY b_6 (b),
UNIQUE INDEX b_7 (b),
UNIQUE INDEX b_8 (b),
INDEX g1(b),
KEY g2 (b),
UNIQUE KEY g3 (b),
UNIQUE INDEX g4 (b)
) DEFAULT CHARACTER SET = utf8mb4 DEFAULT COLLATE = utf8mb4_general_ci;例 2
パーティションを変更するための次のSQL文が送信されます。
ALTER TABLE tb1 MERGE PARTITIONS p1, p2 TO p12;バイナリログには、次の拡張SQL文が記録されます。
ALTER TABLE tb1 MERGE PARTITIONS p1, p2 TO p12 WITH TABLEGROUP=tg29 IMPLICIT;マルチストリームレプリケーション
シングルストリームレプリケーションモードでは、プライマリクラスターのDDLステートメントは、バイナリログのシーケンスに基づいて1つずつセカンダリクラスターにレプリケートされます。 ただし、マルチストリームレプリケーションのシナリオでは、DDLレプリケーションでさまざまなレプリケーションリンクを調整することを検討する必要があります。 各レプリケーションリンクは、DDLステートメントを受け取った後、他のレプリケーションリンクを待つ必要があります。 DDLステートメントは、すべてのリンクがそれを受信した後にのみセカンダリクラスターにレプリケートできます。 そうしないと、DMLトラフィックとスキーマの間に不整合が発生し、例外またはデータエラーがスローされます。
マルチストリームレプリケーションの場合、PolarDB-Xは分散DDLレプリケーションエンジンを提供し、効率的なマルチリンク調整アルゴリズムを使用して分散シナリオでDDLレプリケーションの一貫性を実装します。

制限事項
制限1
PolarDB-Xでは、LOCALITYを使用してストレージの場所を指定できます。 この機能により、DDLステートメントにDNノードIDを含めることができます。 ただし、PolarDB-Xは、プライマリクラスターとセカンダリクラスターのDNノード間のアソシエーションマッピングをサポートしていません。 したがって、このようなSQL文を含むDDL文が下流のクラスターに複製されると、DN関連の情報はSQL文から削除されます。 この場合、セカンダリクラスターにログインして、パーティションの分布を手動で調整できます。
例 1
// The following SQL statement is executed on the primary cluster: CREATE TABLE test_pg3 ( id int ) DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_general_ci PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (1000) LOCALITY 'dn=xdevelop-240524092100-31ef-bngl-dn-1', PARTITION p1 VALUES LESS THAN (2000) LOCALITY 'dn=xdevelop-240524092100-31ef-bngl-dn-1' ) // The following SQL statement is duplicated to secondary clusters: create table test_pg3 ( id int ) DEFAULT CHARACTER SET = utf8mb4 DEFAULT COLLATE = utf8mb4_general_ci PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (1000), PARTITION p1 VALUES LESS THAN (2000) ) WITH TABLEGROUP = tg3778 IMPLICIT付き
例 2
// The following SQL statement is executed on the primary cluster: ALTER TABLE special_dml_test1 MOVE PARTITIONS (p2, p4, p6, p8) TO 'xdevelop-240524092100-31ef-bngl-dn-0'; // The following SQL statement is duplicated to secondary clusters: ALTER TABLE special_dml_test1;
リミット2
PolarDB-Xは、SET PARTITION_HINTステートメントをサポートし、指定されたパーティションで実行されるSQLステートメントを指定します。 GDNレプリケーションのシナリオでは、SET PARTITION_HINTステートメントをセカンダリクラスターに渡すことはできません。 このステートメントを実行して、プライマリノードの指定されたパーティションにデータを明示的に書き込んだ後、データがセカンダリクラスターの同じパーティションに書き込まれることは保証されません。