このトピックでは、パーティション関数とパーティションキー列に基づいてテーブルをパーティション化し、テーブルのタイプをパーティション化テーブル、ブロードキャストテーブル、またはパーティション化されていないテーブルに変更するために使用される構文について説明します。 このトピックでは、構文の使用方法を示すサンプルコードも提供します。 これらの構文は、AUTOモードデータベースにのみ適用されます。
前提条件
論理データベースを作成するとき、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
テーブルを作成できます。CREATE TABLE t_order1 ( `id` bigint(11) NOT NULL AUTO_INCREMENT BY GROUP, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
テーブルタイプ
PolarDB-Xインスタンスは、パーティションテーブル、ブロードキャストテーブル、および非パーティションテーブルの3種類のテーブルをサポートしています。 ALTER TABLEステートメントを使用して、テーブルのタイプを変更できます。 パーティションテーブルのパーティションルールを変更することもできます。
パーティション分割されたテーブル
パーティションテーブルは、
partition_options
句を使用して作成されます。次の
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)}) | LIST COLUMNS(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 PARTITION BY KEY(`order_id`);
次のステートメントを実行して、パーティションテーブルのパーティション数を指定することもできます。
ALTER TABLE t_order1 PARTITION BY KEY(`order_id`) PARTITIONS 8;
非パーティションテーブルまたはパーティションテーブルをブロードキャストテーブルに変更する
構文
ALTER TABLE table_name BROADCAST;
例
次のステートメントを実行して、非パーティションテーブルまたはパーティションテーブルをブロードキャストテーブルに変更できます。 次の例で使用するテーブルの名前は
t_order1
です。ALTER TABLE t_order1 BROADCAST;
ブロードキャストテーブルまたはパーティションテーブルを非パーティションテーブルに変更する
構文
ALTER TABLE table_name SINGLE;
例
次のステートメントを実行して、ブロードキャストテーブルまたはパーティションテーブルを非パーティションテーブルに変更できます。 次の例で使用するテーブルの名前は
t_order1
です。ALTER TABLE t_order1 SINGLE;
パーティションテーブルのパーティション分割ルールの変更
構文
ALTER TABLE tbl_name partition_options;
例 1
次のステートメントを実行して、PolarDB-Xデータベースに
t_order
という名前のパーティションテーブルを作成できます。order_id
列は、テーブルのパーティションキーとして使用されます。CREATE TABLE t_order ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY KEY(`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) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext, `order_detail` longtext, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`), KEY `auto_shard_key_order_id_buyer_id` USING BTREE (`order_id`, `buyer_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8 PARTITION BY KEY(`order_id`,`buyer_id`) PARTITIONS 8
例 2
次のステートメントを実行して、PolarDB-Xデータベースに
t_order
という名前のテーブルを作成できます。 テーブルは、id
列に基づく範囲分割を使用して分割されます。CREATE TABLE t_order ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY RANGE(`id`) ( PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (1000), PARTITION P3 VALUES LESS THAN MAXVALUE );
この例では、
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) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext, `order_detail` longtext, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`), KEY `auto_shard_key_order_id_buyer_id` USING BTREE (`order_id`, `buyer_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8 PARTITION BY KEY(`order_id`,`buyer_id`) PARTITIONS 16
標準パーティションテーブルを、デフォルトの主キーに基づいてパーティション化されたテーブルに変更する
構文
ALTER TABLE table_name REMOVE PARTITIONING;
例
次のステートメントを実行して、PolarDB-Xデータベースに
t_order
という名前のパーティションテーブルを作成できます。order_id
列は、テーブルのパーティションキーとして使用されます。CREATE TABLE t_order ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY KEY(`order_id`);
この例では、
t_order
のパーティション分割ルールを、次の要件を満たす新しいパーティション分割ルールに変更する必要があります。テーブルは、主キー列
id
に基づいてキー分割を使用して分割されます。show create table t_order
ステートメントが実行された後、パーティション情報は表示されません。
次のステートメントを実行して、パーティション分割ルールを変更できます。
ALTER TABLE t_order REMOVE PARTITIONING;
パーティション分割ルールを変更した後、
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) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
重要パーティショニングルールを変更すると、元のテーブルの既存のグローバルインデックスが保持され、ローカルインデックスがグローバルインデックスに変更されます。
パーティション分割されていないテーブルまたはブロードキャストテーブルを、デフォルトの主キーに基づいてパーティション分割されたテーブルに直接変更することはできません。
デフォルトの主キーに基づいてパーティション分割されたテーブルのパーティション数を変更する
構文
ALTER TABLE table_name PARTITIONS partition_count;
説明ステートメントを使用して、既定の主キーに基づいてパーティション分割されたテーブルのパーティション数を変更できます。 テーブルは、パーティションの数を変更した後も、デフォルトの主キーに基づいてパーティション分割されたテーブルです。
例
次のステートメントを実行して、PolarDB-Xデータベースに
t_order
という名前のテーブルを作成できます。 デフォルトでは、テーブルはid
列に基づくキー分割を使用して分割されます。CREATE TABLE t_order ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
show full create table t_order
ステートメントを実行すると、テーブルのパーティション分割方法とパーティション数が表示されます。CREATE PARTITION TABLE `t_order` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext, `order_detail` longtext, PRIMARY KEY (`id`), GLOBAL INDEX /* l_i_order_$d8df */ `l_i_order` (`order_id`) PARTITION BY KEY (`order_id`, `id`) PARTITIONS 16, LOCAL KEY `_local_l_i_order` (`order_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8 PARTITION BY KEY(`id`) PARTITIONS 16
この例では、
t_order
のパーティション分割ルールを、次の要件を満たす新しいパーティション分割ルールに変更する必要があります。パーティションの数は16から32に変更されます。
デフォルトの主キーに基づいてパーティション分割されたテーブルは、標準のパーティション分割テーブルに変更されません。
パーティション分割テーブルグローバルインデックスのパーティション数が変更されます。
次のステートメントを実行して、パーティション分割ルールを変更できます。
ALTER TABLE t_order PARTITIONS 32;
パーティショニングルールを変更した後、
show full create table t_order
ステートメントを実行します。 次の情報が返されます。CREATE PARTITION TABLE `t_order` ( `id` bigint(11) NOT NULL, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext, `order_detail` longtext, PRIMARY KEY USING BTREE (`id`), GLOBAL INDEX /* l_i_order_$d8df */ `l_i_order` (`order_id`) PARTITION BY KEY (`order_id`, `id`) PARTITIONS 32, LOCAL KEY `_local_l_i_order` (`order_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8 PARTITION BY KEY(`id`) PARTITIONS 32
関連ドキュメント
テーブルのパーティショニングルールが変更された後、新しいパーティショニングルールとテーブルのトポロジを表示できます。
テーブルの新しいパーティション分割ルールを表示するには、
SHOW CREATE table tablename
ステートメントを使用します。テーブルのトポロジを表示するには、SHOW topology FROMテーブル名ステートメントを使用します。 詳細については、「tablenameからのトピックの表示」をご参照ください。
よくある質問
テーブルのパーティションキーを変更するDDLステートメントの実行が失敗するのはなぜですか。 この問題を解決するにはどうすればよいですか?
インスタンスの失敗や一意のインデックスの競合などのエラーにより、DDLの実行が失敗する可能性があります。 DDL実行の失敗は、テーブル内のデータに影響を与えず、DMLステートメントまたはクエリステートメントの実行をブロックしません。 パーティションキーを変更するDDL文の実行に失敗した場合、
CANCEL DDL
文を使用して操作をキャンセルし、DDL文を再度実行できます。CANCEL DDL
ステートメントの詳細については、「CANCEL DDL」をご参照ください。データベースがAUTOモードまたはDRDSモードを使用しているかどうかを確認する方法?
SHOW CREATE DATABASE <database_name>
文を実行し、MODE
パラメーターの戻り値を確認します。