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

PolarDB:テーブルのタイプとパーティション分割ルールの変更

最終更新日:Jun 05, 2024

このトピックでは、パーティション関数とパーティションキー列に基づいてテーブルをパーティション化し、テーブルのタイプをパーティション化テーブル、ブロードキャストテーブル、またはパーティション化されていないテーブルに変更するために使用される構文について説明します。 このトピックでは、構文の使用方法を示すサンプルコードも提供します。

前提条件

  • 論理データベースを作成するとき、MODEパラメーターはauto/partitioningに設定されます。 詳細については、「CREATE DATABASE」をご参照ください。
  • テーブルのタイプまたはパーティショニングルールを変更する場合は、テーブルがデプロイされるPolarDB-XインスタンスのカーネルバージョンがV5.4.13以降である必要があります。
  • グローバルセカンダリインデックス (GSI) を含むパーティションテーブルのパーティションを変更する場合、テーブルがデプロイされるPolarDB-XインスタンスのカーネルバージョンはV5.4.13以降でなければなりません。
  • 標準パーティションテーブルをデフォルトの主キーに基づいてパーティション化されたテーブルに変更する場合、標準パーティションテーブルを使用するPolarDB-XインスタンスのカーネルバージョンはV5.4.14以降である必要があります。
  • デフォルトの主キーに基づいてパーティション分割されたテーブルのパーティション数を変更する場合、テーブルがデプロイされるPolarDB-XインスタンスのカーネルバージョンはV5.4.14以降でなければなりません。

PolarDB-Xインスタンスのカーネルバージョンを表示する方法については、「インスタンスのバージョンの表示」をご参照ください。

使用上の注意

  • プライマリキーに基づいて自動的にパーティション分割されたテーブルのパーティション分割ルールを変更すると、テーブルは標準テーブルになります。 この場合、自動パーティショニングルールとインデックス変更ルールはテーブルでは有効になりません。 詳細については、「自動パーティショニングモードでの自動シャーディング」をご参照ください。
  • このトピックでは、t_order1という名前のテーブルを例で使用して、テーブルのタイプを変更する方法を示します。 次のステートメントを使用して、t_order1テーブルを作成できます。
    
      '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ステートメントを使用して、テーブルのタイプを変更できます。 パーティションテーブルのパーティションルールを変更することもできます。

  • パーティション分割されたテーブル

    パーティションテーブルは、partition_options句を使用して作成されます。

    次のpartition_options句を使用して、テーブルをパーティション分割できます。
    
        PARTITION BY
              HASH({column_name | partition_func(column_name)})
            | KEY(column_list)
            | RANGE{({column_name | partition_func(column_name)}) 
            | RANGE COLUMNS(column_list)}
            | LIST{({column_name | partition_func(column_name)}) 
            | リストコラム (column_list)} }
        partition_list_spec 
    説明 パーティション分割ルールの詳細については、「パーティション分割テーブル」をご参照ください。
  • 放送テーブル

    BROADCAST句を使用して、ブロードキャストテーブルを作成できます。 システムは、各データベースシャードに同じブロードキャストテーブルを作成し、分散トランザクションモードを使用して、データがテーブル間で一貫していることを確認します。 詳細については、「非パーティションテーブル」をご参照ください。

  • 非パーティションテーブル

    SINGLE句を使用して作成されたテーブルはパーティション分割されません。 詳細については、「非パーティションテーブル」をご参照ください。

非パーティションテーブルまたはブロードキャストテーブルをパーティションテーブルに変更する

  • 構文
    ALTER TABLE table_name partition_options;
    説明

    partition_optionsの詳細については、「CREATE TABLE (AUTOモード) 」をご参照ください。

  • たとえば、t_order1という名前の非パーティションテーブルを使用してビジネスデータを格納します。 ビジネスが成長するにつれて、テーブルは増加するビジネスデータを処理できません。 この問題を解決するには、次のステートメントを実行して、テーブルをパーティションテーブルに変更します。 ステートメントでは、order_idがパーティションキーとして使用されます。

    ALTER TABLE t_order1キーによるパーティション ('order_id');
    次のステートメントを実行して、パーティションテーブルのパーティション数を指定することもできます。
    ALTER table t_order1 PARTITION BY KEY('order_id') partitions 8;

非パーティションテーブルまたはパーティションテーブルをブロードキャストテーブルに変更する

  • 構文
    ALTER TABLE table_name BROADCAST;
  • 次のステートメントを実行して、非パーティションテーブルまたはパーティションテーブルをブロードキャストテーブルに変更できます。 次の例で使用するテーブルの名前はt_order1です。
    ALTER TABLE t_order1ブロードキャスト;

ブロードキャストテーブルまたはパーティションテーブルを非パーティションテーブルに変更する

  • 構文
    ALTER TABLE table_name SINGLE;
  • 次のステートメントを実行して、ブロードキャストテーブルまたはパーティションテーブルを非パーティションテーブルに変更できます。 次の例で使用するテーブルの名前はt_order1です。
    ALTER TABLE t_order1シングル;

パーティションテーブルのパーティション分割ルールの変更

  • 構文
    ALTER TABLE tbl_name partition_options;
  • 例1
    次のステートメントを実行して、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')
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 
      キーによるパーティー ('order_id'); 
    この例では、t_orderのパーティション分割ルールを、次の要件を満たす新しいパーティション分割ルールに変更する必要があります。
    • テーブルは、order_id列とbuyer_id列に基づくキー分割を使用して分割されます。
    • テーブルは8つのパーティションに分割されます。

    次のステートメントを実行して、パーティション分割ルールを変更できます。

    ALTER TABLE t_order PARTITION BY KEY(order_id, buyer_id) PARTITIONS 8;
    パーティション分割ルールを変更した後、show create table t_orderステートメントを実行します。 次の情報が返されます。
    CREATE TABLE 't_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' ロングテキスト、
      'order_detail' ロングテキスト、
      主要なキー ('id') 、
      KEY 'L_i_order ' ('order_id') 、
      KEY 'auto_shard_key_order_id_buyer_id 'USING BTREE ('order_id' 、'buyer_id ')
    ) エンジン=InnoDBデフォルト料金=utf8
    キーによるパーティー ('order_id' 、'buyer_id')
    パーティー8 
  • 例2
    次のステートメントを実行して、PolarDB-Xデータベースにt_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')
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 
      レンジによるパーティー ('id')
      (
        パートp1の値は (100) 未満、
        PARTITION p2の値は (1000) より少なく、
        最大値より少ないPARTITION P3値
      );
    この例では、t_orderのパーティション分割ルールを、次の要件を満たす新しいパーティション分割ルールに変更する必要があります。
    • テーブルは、order_id列とbuyer_id列に基づくキー分割を使用して分割されます。
    • テーブルは16のパーティションに分割されています。

    次のステートメントを実行して、パーティション分割ルールを変更できます。

    ALTER TABLE t_order PARTITION BY KEY(order_id, buyer_id) PARTITIONS 16;
    パーティショニングルールを変更した後、show create table t_orderステートメントを実行します。 次の情報が返されます。
    CREATE TABLE 't_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' ロングテキスト、
      'order_detail' ロングテキスト、
      主要なキー ('id') 、
      KEY 'L_i_order ' ('order_id') 、
      KEY 'auto_shard_key_order_id_buyer_id 'USING BTREE ('order_id' 、'buyer_id ')
    ) エンジン=InnoDBデフォルト料金=utf8
    キーによるパーティー ('order_id' 、'buyer_id')
    パーティー16 

標準パーティションテーブルを、デフォルトの主キーに基づいてパーティション化されたテーブルに変更する

  • 構文
    ALTER TABLE table_name削除参加;
  • 次のステートメントを実行して、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
    キーによるパーティー ('order_id'); 

    この例では、t_orderのパーティション分割ルールを、次の要件を満たす新しいパーティション分割ルールに変更する必要があります。

    • テーブルは、主キー列idに基づいてキー分割を使用して分割されます。
    • show create table t_orderステートメントが実行された後、パーティション情報は表示されません。

    次のステートメントを実行して、パーティション分割ルールを変更できます。

    ALTER TABLE_orderリモート参加;

    パーティション分割ルールを変更した後、show create table t_orderステートメントを実行します。 次の情報が返されます。

    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; 
    重要
    • パーティショニングルールを変更すると、元のテーブルの既存のグローバルインデックスが保持され、ローカルインデックスがグローバルインデックスに変更されます。
    • パーティション分割されていないテーブルまたはブロードキャストテーブルを、デフォルトの主キーに基づいてパーティション分割されたテーブルに直接変更することはできません。

デフォルトの主キーに基づいてパーティション分割されたテーブルのパーティション数を変更する

  • 構文
    ALTER TABLE table_name PARTITIONS partition_count;
    説明 ステートメントを使用して、既定の主キーに基づいてパーティション分割されたテーブルのパーティション数を変更できます。 テーブルは、パーティションの数を変更した後も、デフォルトの主キーに基づいてパーティション分割されたテーブルです。
  • 次のステートメントを実行して、PolarDB-Xデータベースにt_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; 

    show full create table t_orderステートメントを実行すると、テーブルのパーティション分割方法とパーティション数が表示されます。

    パーティションの作成TABLE 't_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' ロングテキスト、
      'order_detail' ロングテキスト、
      主要なキー ('id') 、
      GLOBAL INDEX /* l_i_order_$d8df */ 'l_i_order ' ('order_id') キーによるパーティー ('order_id' 、'id') パーティー16、
      ローカルキー '_local_l_i_order' ('order_id')
    ) エンジン=InnoDBデフォルト料金=utf8
    キーによるパーティー ('id')
    パーティー16 

    この例では、t_orderのパーティション分割ルールを、次の要件を満たす新しいパーティション分割ルールに変更する必要があります。

    • パーティションの数は16から32に変更されます。
    • デフォルトの主キーに基づいてパーティション分割されたテーブルは、標準のパーティション分割テーブルに変更されません。
    • パーティション分割テーブルグローバルインデックスのパーティション数が変更されます。

    次のステートメントを実行して、パーティション分割ルールを変更できます。

    ALTER TABLE t_orderパーティション32;

    パーティション分割ルールを変更した後、show create table t_orderステートメントを実行します。 次の情報が返されます。

    パーティションの作成TABLE 't_order' (
      'id' bigint(11) NOT NULL、
      'order_id' varchar(20) DEFAULT NULL、
      'buyer_id 'varchar(20) デフォルトNULL、
      'seller_id 'varchar(20) DEFAULT NULL、
      'order_snapshot' ロングテキスト、
      'order_detail' ロングテキスト、
      BTREEを使用する主要なキー ('id') 、
      GLOBAL INDEX /* l_i_order_$d8df */ 'l_i_order ' ('order_id') キーによるパーティー ('order_id' 、'id') パーティー32、
      ローカルキー '_local_l_i_order' ('order_id')
    ) エンジン=InnoDBデフォルト料金=utf8
    キーによるパーティー ('id')
    パーティー32 

参考資料

テーブルのパーティショニングルールが変更された後、新しいパーティショニングルールとテーブルのトポロジを表示できます。
  • テーブルの新しいパーティション分割ルールを表示するには、SHOW CREATE table tablenameステートメントを使用します。
  • テーブルのトポロジを表示するには、SHOW topology FROMテーブル名ステートメントを使用します。 詳細については、「tablenameからのトピックの表示」をご参照ください。

よくある質問

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

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