すべてのプロダクト
Search
ドキュメントセンター

PolarDB:テーブルのタイプの変更とシャーディングルールの変更 (DRDSモード)

最終更新日:Jun 03, 2024

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; 

テーブルタイプ

PolarDB-Xインスタンスは、シャードテーブル、ブロードキャストテーブル、およびシャードテーブルではないテーブルの3種類のテーブルをサポートしています。 ALTER TABLEステートメントを使用して、テーブルのタイプを変更したり、テーブルのシャーディングルールを変更したりできます。 1
  • 削られたテーブル

    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;

参考資料

シャーディングルールが変更された後、次のステートメントを使用して、新しいシャーディングルールとテーブルのトポロジを表示できます。

よくある質問

テーブルのシャードキーを変更するDDLステートメントの実行が失敗するのはなぜですか。 この問題を解決するにはどうすればよいですか?

インスタンスの失敗や一意のインデックスの競合などのエラーにより、DDLの実行が失敗する可能性があります。 DDL実行の失敗は、テーブル内のデータに影響を与えず、DMLステートメントまたはクエリステートメントの実行をブロックしません。 シャードキーを変更するDDLステートメントの実行が失敗した場合、ROLLBACK DDLステートメントを使用して操作をロールバックし、DDLステートメントを実行できます。 ROLLBACK DDLステートメントの詳細については、関連ドキュメントを参照してください。

説明 RECOVER DDLステートメントを使用して、失敗したDDL実行を復元することはできません。