PolarDB-Xを使用すると、テーブルの型を変更したり、シャーディングルールを変更したりできます。 テーブルのタイプは、非シャードテーブル、シャードテーブル、およびブロードキャストテーブルタイプの間で切り替えることができます。 テーブルのシャーディングルールを変更するには、シャーディング関数の設定またはテーブルのシャーディングキーを変更します。 このトピックでは、テーブルのシャードとテーブルの型の変更に使用される構文について説明し、構文の使用方法を示すサンプルコードを提供します。 この構文は、DRDSモードのデータベースにのみ適用されます。
前提条件
- テーブルのシャーディングルールを変更する場合は、テーブルがデプロイされるPolarDB-XインスタンスのカーネルバージョンがV5.4.8以降である必要があります。
- テーブルのタイプを変更する場合は、テーブルがデプロイされるPolarDB-XインスタンスのカーネルバージョンがV5.4.10以降である必要があります。
PolarDB-Xインスタンスのカーネルバージョンを表示する方法については、「インスタンスのバージョンの表示」をご参照ください。
使用状況ノート
- グローバルセカンダリインデックスを含むシャードテーブルのシャーディングルールは変更できません。
- プライマリキーに基づいて自動的にシャードされるテーブルのシャーディングルールを変更すると、テーブルは標準テーブルになります。 この場合、自動シャーディングルールとインデックス変更ルールはテーブルでは有効になりません。 詳細については、「自動シャーディング」をご参照ください。
- シャードされていないテーブルに自動インクリメント列が含まれている場合は、テーブルをブロードキャストテーブルまたはシャードテーブルに変更する前に、テーブルのシーケンスを作成する必要があります。
- このトピックでは、テーブルのタイプを変更する方法を示す例で、
t_order
という名前のテーブルを使用しています。 次のステートメントを使用して、t_order
テーブルを作成できます。'id' bigint (11) NOT NULL AUTO_INCREMENT BY GROUP、 'order_id' varchar(20) DEFAULT NULL、 'buyer_id 'varchar(20) デフォルトNULL、 'seller_id 'varchar(20) DEFAULT NULL、 'order_snapshot' ロングテキストDEFAULT NULL、 'order_detail' ロングテキストDEFAULT NULL、 主要なキー ('id') 、 KEY 'L_i_order ' ('order_id') ) エンジン=InnoDBデフォルト料金=utf8;
テーブルタイプ
- 削られたテーブル
drds_partition_options
句を指定して、テーブルをシャードできます。次のdrds_partition_options
句を使用して、データベースシャードとテーブルシャードを作成できます。drds_partition_options: db_partition_algorithmによるDBPARTITION [TBPARTITION BY table_partition_algorithm [TBPARTITIONS number]]
上記の節では、db_partition_algorithmとtable_partition_algorithmは異なる関数をサポートしています。db_partition_algorithm
は次の関数をサポートしています。HASH([col_name]) | {YYYYMM | YYYYWEEK | YYYYDD | YYYYMM_OPT | YYYYWEEK_OPT | YYYYDD_OPT}(col_name) | UNI_HASH(col_name) | RIGHT_SHIFT(col_name, n) | RANGE_HASH(col_name, col_name, n)
table_partition_algorithm
は次の関数をサポートしています。HASH(col_name) | {MM | DD | WEEK | MMDD | YYYYMM | YYYYWEEK | YYYYYYWEEK | YYYYMM_OPT | YYYYYYWEEK_OPT | YYYYDD_OPT}(col_name) | UNI_HASH(col_name) | RIGHT_SHIFT(col_name, n) | RANGE_HASH(col_name, col_name, n)
説明 シャーディング関数の詳細については、「HASH」をご参照ください。
- 放送テーブル
BROADCAST
句を使用して、ブロードキャストテーブルを作成できます。 システムは、各データベースシャードに同じブロードキャストテーブルを作成し、分散トランザクションモードを使用して、データがテーブル間で一貫していることを確認します。 - テーブルがシャードされていない
シャーディングキーを指定しない場合、またはテーブルの作成に使用するステートメントに
BROADCAST
句を含めない場合、作成されるテーブルはシャーディングされません。
シャードされていないテーブルまたはブロードキャストテーブルをシャードテーブルに変更する
- 構文
ALTER TABLE table_name drds_partition_options;
説明drds_partition_options
句の指定方法については、「テーブルタイプ」をご参照ください。- シャードされておらず、自動インクリメント列を含むテーブルのタイプを変更する場合は、テーブルをシャードテーブルに変更する前に、テーブルのシーケンスを作成する必要があります。
- 例
たとえば、ビジネスのデータを格納するために、シャードではなく、
t_order
という名前のテーブルを使用したとします。 ビジネスの拡大により、テーブルはビジネスのすべてのワークロードを処理できません。 この問題を解決するには、次のステートメントを使用してテーブルをシャードテーブルに変更します。 ステートメントでは、order_id
がシャードキーとして使用されます。ALTER TABLE_order dbpartition BYハッシュ ('order_id');
シャードされていないテーブルまたはシャードテーブルをブロードキャストテーブルに変更する
- 構文
ALTER TABLE table_name BROADCAST;
説明 シャードされておらず、自動インクリメント列を含むテーブルのタイプを変更する場合は、テーブルをブロードキャストテーブルに変更する前に、テーブルのシーケンスを作成する必要があります。 - 例次のステートメントを使用して、シャードされていないテーブルまたはシャードテーブルをブロードキャストテーブルに変更できます。 次の例で使用されるテーブルの名前は
t_order
です。ALTER TAB_orderブロードキャスト;
ブロードキャストテーブルまたはシャードテーブルを、シャードされていないテーブルに変更する
- 構文
ALTER TABLE table_name SINGLE;
- 例次のステートメントを使用して、ブロードキャストテーブルまたはシャードテーブルを、シャードされていないテーブルに変更できます。 次の例で使用されるテーブルの名前は
t_order
です。ALTER TABLE_注文シングル;
シャードテーブルのシャーディングルールの変更
- 構文
ALTER TABLE tbl_name drds_partition_options;
- 例次のステートメントを使用して、PolarDB-Xデータベースに
t_order
という名前のシャードテーブルを作成できます。order_id
は、テーブルのシャードキーとして使用されます。CREATE TAB_order ( 'id' bigint(11) NOT NULL AUTO_INCREMENT、 'order_id' varchar(20) DEFAULT NULL、 'buyer_id 'varchar(20) デフォルトNULL、 'seller_id 'varchar(20) DEFAULT NULL、 'order_snapshot' ロングテキストDEFAULT NULL、 'order_detail' ロングテキストDEFAULT NULL、 主要なキー ('id') 、 KEY 'L_i_order ' ('order_id') ) エンジン=InnoDBデフォルト料金=utf8 dbpartition BY hash('order_id');
t_order
テーブルのシャーディングルールに次の変更を加えることができます。- データベースシャーディングは、
order_id
列に基づいて実行されます。 - テーブルシャーディングは、
buyer_id
列に基づいて実行されます。 - 各データベースシャードには3つのテーブルシャードが含まれています。
次のステートメントを使用して、シャーディングルールを変更できます。
ALTER TABLE t_order dbpartition BY hash(order_id) tbpartition BY hash(buyer_id) tbpartitions 3;
- データベースシャーディングは、
参考資料
- テーブルのシャーディングルールを表示する方法の詳細については、「rule and topology query statements」をご参照ください。
- テーブルトポロジを表示する方法の詳細については、「ルールとトポロジのクエリ文」をご参照ください。
よくある質問
テーブルのシャードキーを変更するDDLステートメントの実行が失敗するのはなぜですか。 この問題を解決するにはどうすればよいですか?
インスタンスの失敗や一意のインデックスの競合などのエラーにより、DDLの実行が失敗する可能性があります。 DDL実行の失敗は、テーブル内のデータに影響を与えず、DMLステートメントまたはクエリステートメントの実行をブロックしません。 シャードキーを変更するDDLステートメントの実行が失敗した場合、ROLLBACK DDL
ステートメントを使用して操作をロールバックし、DDLステートメントを実行できます。 ROLLBACK DDL
ステートメントの詳細については、関連ドキュメントを参照してください。
RECOVER DDL
ステートメントを使用して、失敗したDDL実行を復元することはできません。