ALTER TABLE を使用して、通常 (非パーティション化)、レンジパーティション化、インターバル・レンジ・パーティション化の 3 つのパーティション戦略間でテーブルを変換します。
前提条件
開始する前に、以下を確認してください。
リビジョンバージョンが 8.0.2.2.0 以降の PolarDB for MySQL 8.0 クラスター
リビジョンバージョンを確認するには、「エンジンバージョンのクエリ」をご参照ください。
仕組み
インターバル・レンジ・パーティション表では、トランジションポイントを使用して、明示的に定義されたレンジパーティションと自動的に管理されるインターバルパーティションを分離します。トランジションポイントまでのすべてのデータは、名前付きのレンジパーティションに格納されます。そのポイントを超えるデータは、指定されたインターバルでパーティションの自動作成をトリガーします。手動で ADD PARTITION を実行する必要はありません。
テーブルからインターバル定義を削除すると、既存のすべてのインターバルパーティションは標準のレンジパーティションになります。
切り替えルール
| 変換 | サポート状況 | 方法 |
|---|---|---|
| 通常テーブル → インターバル・レンジ・パーティション表 | はい | ALTER TABLE ... PARTITION BY |
| インターバル・レンジ・パーティション表 → 通常テーブル | いいえ | — |
| レンジパーティションテーブル → インターバル・レンジ・パーティション表 | はい | ALTER TABLE ... PARTITION BY (8.0.2.2.0 以降) または SET INTERVAL (8.0.2.2.1 以降) |
| インターバル・レンジ・パーティション表 → レンジパーティションテーブル | はい | ALTER TABLE ... PARTITION BY (8.0.2.2.0 以降) または SET INTERVAL() (8.0.2.2.1 以降) |
インターバル・レンジ・パーティション表に変換した後、データがトランジションポイントを超えて挿入されると、データベースは新しいパーティションを自動的に作成します。インターバル・レンジ・パーティション表にパーティションを明示的に追加することはできません。
構文
構文 1 — 完全なパーティションスキームの再定義:
ALTER TABLE table_name partition_options;partition_options は次のとおりです:
PARTITION BY
{ RANGE{(expr) | COLUMNS(column_list)} }
{ INTERVAL(type, expr) | INTERVAL(expr) }
[(partition_definition [, partition_definition] ...)]partition_definition は次のとおりです:
PARTITION partition_name
[VALUES LESS THAN {expr | MAXVALUE}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]構文 2 — 既存のレンジパーティションテーブルでインターバルを切り替える (8.0.2.2.1 以降が必要):
ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) };インターバルパーティション化を無効にしてレンジパーティションテーブルに戻すには、引数なしで SET INTERVAL() を呼び出します。
パラメーター
| パラメーター | 説明 |
|---|---|
table_name | テーブルの名前 |
RANGE(expr) | パーティション式。評価結果は INT 型の値である必要があります。文字列型はサポートされていません。 |
column_list | RANGE COLUMNS() の列リスト。式はサポートされていません。 |
INTERVAL(type) | インターバル時間型。サポートされている値: YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND。省略した場合は、数値型が使用されます。 |
INTERVAL(expr) | インターバル値。type が SECOND の場合、値は 60 以上 |
MAXVALUE | パーティションの最大値 |
engine_name | ストレージエンジン名 |
通常テーブルからインターバル・レンジ・パーティション表への変換
初期レンジパーティションを定義して、トランジションポイントを設定します。その境界を超えて挿入されたデータは、新しい月次 (またはその他のインターバル) パーティションを自動的に作成します。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
);
-- インターバル・レンジ・パーティション表に変換します。
-- パーティション p0 には 2021-10-01 (トランジションポイント) より前のデータが格納されます。
-- 2021-10-01 以降のデータは、月次パーティションを自動的に作成します。
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);レンジパーティションテーブルからインターバル・レンジ・パーティション表への変換
2 つのメソッドが利用可能です。どちらも既存のレンジパーティションテーブルにインターバルを追加します。
方法 1:パーティションスキームの再定義 (8.0.2.2.0 以降が必要)
このメソッドを使用して、単一のステートメントでパーティションキーとインターバルの両方を変更します。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- パーティションスキームを再定義:キーを orderdate に切り替え、月次インターバルを追加します。
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);方法 2:既存のレンジパーティションテーブルにインターバルを設定 (8.0.2.2.1 以降が必要)
テーブルがすでに正しいキーでパーティション化されており、インターバルパーティション化を有効にするだけでよい場合、このメソッドを使用します。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE COLUMNS(orderdate) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
-- 月次インターバルでインターバルパーティション化を有効にします。
ALTER TABLE orders SET INTERVAL(MONTH, 1);インターバル・レンジ・パーティション表からレンジパーティションテーブルへの変換
インターバル定義を削除すると、既存のすべてのインターバルパーティションが名前付きのレンジパーティションに変換されます。
方法 1:パーティションスキームの再定義 (8.0.2.2.0 以降が必要)
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- INTERVAL 句なしで再定義して、レンジパーティションテーブルに変換します。
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);方法 2:インターバルのクリア (8.0.2.2.1 以降が必要)
引数なしで SET INTERVAL() を呼び出して、インターバルパーティション化を無効にします。既存のインターバルパーティションはレンジパーティションになります。
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- インターバルパーティション化を無効にします。既存のインターバルパーティションはレンジパーティションとして保持されます。
ALTER TABLE orders SET INTERVAL(); /* インターバルの型と値を指定せずに、インターバル・レンジ・パーティション表をレンジパーティションテーブルに切り替えます。 */