OceanBaseデータベースのパーティション交換機能は、主にパーティションテーブルへのデータを迅速にインポートし、効率的なデータロードを実現するために使用されます。具体的には、フルダイレクトロードにより新規作成した非パーティションテーブルにデータを高速にインポートし、その後パーティション交換機能を利用して非パーティションテーブルからパーティションテーブルへデータを迅速に移入することで、既存のパーティションテーブルへの増分データインポート性能を向上させます。
パーティション交換機能は、増分ダイレクトロードの代替案として検討できます。例えば、パーティション交換機能を利用してパーティションテーブルAの増分データをインポートする手順は以下の通りです:
- テーブルAに空の新しいパーティションPを作成します。
- テーブルAと構造が完全に同じ非パーティションテーブルBを新規作成し、ダイレクトロードにより増分データをテーブルBにインポートします。
- パーティション交換機能を利用して、テーブルAの新しいパーティションPとテーブルBを交換します。
パーティション交換のサポート状況
パーティション交換のサポート状況は次の表のとおりです。ここで、タイプの列はターゲットテーブル(target_partition_table_name)を、タイプの行はソーステーブル(origin_table_name)を表します。
タイプ |
非パーティションテーブル |
パーティションテーブル |
サブパーティションテーブル |
|---|---|---|---|
| パーティションテーブル | サポート | サポートなし | サポートなし |
| サブパーティションテーブルのパーティション | サポートなし | サポート | サポートなし |
| サブパーティションテーブルのサブパーティション | サポート | サポートなし | サポートなし |
使用上の制限と注意事項
データ検証はサポートされていないため、
WITHOUT VALIDATIONを指定する必要があります。ユーザーは交換データの有効性を自己保証する必要があります。パーティションテーブルと非パーティションテーブルのテーブルレベルおよび列レベルの属性要件は、1対1で対応している必要があります。
パーティションテーブルと非パーティションテーブルの制約要件は完全に同じであり、現在のバージョンでは両テーブル間の外部キー制約はサポートされていません。
パーティションテーブルのローカルインデックステーブルと非パーティションテーブルのインデックステーブルは、1対1で対応している必要があります。
INCLUDING INDEXESの動作のみがサポートされています(MySQLモードではデフォルトでINCLUDING INDEXES動作が含まれます)。ローカルインデックスが対応するパーティションのデータも交換に含まれ、交換後も交換前と同じ可用状態を維持します。UPDATE GLOBAL INDEXESはサポートされていないため、グローバルインデックスは交換成功後すべて Unusable 状態(無効状態)になります。現在のパーティション交換機能は、増分ダイレクトロードの一時的な代替機能としてのみ利用することを推奨します。増分ダイレクトロードの詳細については、ダイレクトロードの概要を参照してください。
パーティションテーブルと非パーティションテーブルのデータを交換する場合:
- パーティションは Range/Range columns/List パーティションである必要があります。
セカンダリパーティションテーブルのセカンダリパーティションと非パーティションテーブルのデータを交換する場合:
- パーティションタイプには制限がありませんが、セカンダリパーティションは Range/Range columns パーティションである必要があります。
セカンダリパーティションテーブルのパーティションとパーティションテーブルのデータを交換する場合:
target_partition_table_nameはセカンダリパーティションテーブルである必要があり、交換するパーティションはそのテーブルの特定のパーティション名である必要があります。また、そのセカンダリパーティションテーブルのパーティションは Range/Range Columns/List/List Columns パーティションである必要があります。origin_table_nameはパーティションテーブルである必要があり、そのパーティションタイプは交換に使用されるパーティションの下のセカンダリパーティションと完全に一致している必要があります。- パーティションテーブルとセカンダリパーティションテーブルを交換した後、関連するテーブルの統計情報は無効になり、再収集が必要です。
構文
ALTER TABLE target_partition_table_name
EXCHANGE PARTITION partition_name
WITH TABLE origin_table_name
WITHOUT VALIDATION;
パラメータの説明
パラメータ |
説明 |
|---|---|
| target_partition_table_name | パーティション交換の対象となるパーティションテーブル名を表します。 |
| partition_name | パーティション交換の対象となるパーティションテーブルのパーティション名を表します。 |
| origin_table_name | パーティション交換のソーステーブル名を表します。非パーティションテーブルまたはパーティション1の場合に指定します。 |
使用方法
現在のパーティション交換機能は、パーティションテーブルの1つのパーティションと非パーティションテーブルとの間でデータを交換するものであり、主に増分ダイレクトロード機能の一時的な代替ツールとして使用されます。ここで、パーティションテーブルと非パーティションテーブルは通常、以下のような特性を持ちます:
- パーティションテーブル(partitioned table):履歴データを含むパーティションテーブルで、通常データ量が大きいです。
- 非パーティションテーブル(non-partitioned table):増分データを含みます。
パーティション交換機能の使用にあたっては、不適切な操作により元のテーブルのパーティションキーの条件に合致しないデータが発生し、連鎖エラーを引き起こす可能性があるため、極めて慎重に行う必要があります。そのため、パーティション交換を実行する際には、以下の手順に従って、パーティションテーブルと非パーティションテーブルがパーティション交換を行えるかどうかを判断する必要があります。
SHOW CREATE TABLEステートメントを使用して、パーティションテーブルのパーティションキーおよびターゲットパーティション情報を確認します。非パーティションテーブルのデータを確認し、非パーティションテーブルのデータがターゲットパーティションのパーティションキーのデータ範囲要件を満たしているかどうかを判断します。ここで、
table_nameはクエリ対象のテーブル名です。SHOW CREATE TABLE table_name;クエリ結果に基づき、パーティションテーブルと非パーティションテーブルが上記の 制限事項および注意点 を満たしていることを確認します。
パーティション交換を行う前に、少なくとも以下の条件を満たしていることを確認する必要があります。
プロパティ要件同一テナント内にあるかどうか はい 同一データベース内にあるかどうか いいえ。MySQLと互換性があり、データベース間での交換をサポートします 同一のテーブルグループ(TableGroup)に属するかどうか はい 同一のテーブルスペース(TableSpace)に属するかどうか はい 使用する文字セット形式が一致しているか はい テーブルタイプが一致しているか はい。両方ともユーザーテーブル、すなわち USER_TABLEである必要があります主キーの数が一致しているか はい 行ストレージ形式が一致しているか はい 列形式と列の相対順序が一致しているか はい 両方とも自動インクリメント列であるか はい 列のデフォルト値や生成列式が一致しているか はい 暗号化方式が一致しているか はい カラムストア形式が一致しているか はい インデックス形式、状態、数が一致しているか はい。パーティションテーブルのローカルインデックスは、非パーティションテーブルのインデックスと一対一で対応している必要があります インデックステーブル名が一致しているか はい。MySQLと互換性があり、同名のテーブルに対するインデックス定義は一対一で対応している必要があります 制約の形式や含まれる列が一致しているか はい パーティション交換の構文を使用してパーティション交換を行います。交換後、パーティションテーブルの指定されたパーティションのデータは非パーティションテーブルに移行し、非パーティションテーブルのデータはパーティションテーブルの指定されたパーティションに移行します。パーティションテーブルのグローバルインデックスの状態は Unusable になります。
例
例1:パーティションテーブルと非パーティションテーブルのデータ交換
Rangeパーティションテーブルと非パーティションテーブルのデータを交換します。
Rangeパーティションテーブル
tbl1_rを作成します。obclient> CREATE TABLE tbl1_r (col1 INT PRIMARY KEY, col2 VARCHAR(50)) PARTITION BY RANGE(col1) (PARTITION p0 VALUES LESS THAN(10), PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(30) );非パーティションテーブル
tbl1を作成します。obclient> CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR(50));テーブル
tbl1にデータを挿入します。obclient> INSERT INTO tbl1 VALUES(1, 'a1'),(2, 'a2');実行結果は次のとおりです:
Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0パーティションテーブル
tbl1_rのパーティションp0と非パーティションテーブルtbl1の間でパーティション交換を実行します。obclient> ALTER TABLE tbl1_r EXCHANGE PARTITION p0 WITH TABLE tbl1 WITHOUT VALIDATION;パーティションテーブル
tbl1_rのパーティションp0のデータを確認します。obclient> SELECT * FROM tbl1_r PARTITION(p0);実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | a1 | | 2 | a2 | +------+------+ 2 rows in set
Listパーティションテーブルと非パーティションテーブルのデータを交換します。
Listパーティションテーブル
tbl1_lを作成します。obclient> CREATE TABLE tbl1_l (col1 INT, col2 VARCHAR(50), col3 INT) PARTITION BY LIST(col3) (PARTITION p0 VALUES IN (1, 2, 3, 4), PARTITION p1 VALUES IN (5, 6, 7, 8, 9), PARTITION p2 VALUES IN (DEFAULT) );非パーティションテーブル
tbl1_2を作成します。obclient> CREATE TABLE tbl1_2 (col1 INT, col2 VARCHAR(50), col3 INT);テーブル
tbl1_2にデータを挿入します。obclient> INSERT INTO tbl1_2 VALUES(1, 'a1', 1), (2, 'a2', 2), (3, 'a3', 3), (4, 'a4', 4), (5, 'a5', 5);実行結果は次のとおりです:
Query OK, 5 rows affected Records: 5 Duplicates: 0 Warnings: 0パーティションテーブル
tbl1_lのパーティションp0と非パーティションテーブルtbl1_2の間でパーティション交換を実行します。obclient> ALTER TABLE tbl1_l EXCHANGE PARTITION p0 WITH TABLE tbl1_2 WITHOUT VALIDATION;パーティションテーブル
tbl1_lのパーティションp0のデータを確認します。obclient> SELECT * FROM tbl1_l PARTITION(p0);実行結果は次のとおりです:
+------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 1 | a1 | 1 | | 2 | a2 | 2 | | 3 | a3 | 3 | | 4 | a4 | 4 | | 5 | a5 | 5 | +------+------+------+ 5 rows in set
例2:サブパーティションテーブルのパーティションとパーティションテーブルのデータを交換する
Range + Hash サブパーティションテーブル
tbl2_rhを作成します。obclient> CREATE TABLE tbl2_rh (col1 INT PRIMARY KEY, col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY HASH(col1) SUBPARTITIONS 5 (PARTITION p0 VALUES LESS THAN (10), PARTITION p1 VALUES LESS THAN (20), PARTITION p2 VALUES LESS THAN (30), PARTITION p3 VALUES LESS THAN (MAXVALUE) );Hash パーティションテーブル
tbl2_hを作成します。obclient> CREATE TABLE tbl2_h (col1 INT PRIMARY KEY, col2 INT) PARTITION BY HASH(col1) PARTITIONS 5;テーブル
tbl2_rhにデータを挿入します。obclient> INSERT INTO tbl2_rh VALUES(11, 30), (14, 40), (26, 150), (29, 160);実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0パーティションテーブル
tbl2_rhのパーティションp1のデータを確認します。obclient> SELECT * FROM tbl2_rh PARTITION(p1);実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 11 | 30 | | 14 | 40 | +------+------+ 2 rows in setテーブル
tbl2_hにデータを挿入します。obclient> INSERT INTO tbl2_h VALUES(12, 20), (16, 110), (17, 170), (19, 120);実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0サブパーティションテーブル
tbl2_rhのパーティションp1とパーティションテーブルtbl2_hのパーティションを交換します。obclient> ALTER TABLE tbl2_rh EXCHANGE PARTITION p1 WITH TABLE tbl2_h WITHOUT VALIDATION;パーティションテーブル
tbl2_rhのパーティションp1のデータを確認します。obclient> SELECT * FROM tbl2_rh PARTITION(p1);実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 16 | 110 | | 12 | 20 | | 17 | 170 | | 19 | 120 | +------+------+ 4 rows in set
例3:サブパーティションテーブルのサブパーティションと非パーティションテーブルとのデータ交換
Range + Rangeサブパーティションテーブル
tbl3_rrを作成します。obclient> CREATE TABLE tbl3_rr(col1 INT, col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) (PARTITION p0 VALUES LESS THAN(10) (SUBPARTITION sp0 VALUES LESS THAN(20), SUBPARTITION sp1 VALUES LESS THAN(50), SUBPARTITION sp2 VALUES LESS THAN (MAXVALUE) ), PARTITION p1 VALUES LESS THAN(20) (SUBPARTITION sp3 VALUES LESS THAN(20), SUBPARTITION sp4 VALUES LESS THAN(50), SUBPARTITION sp5 VALUES LESS THAN (MAXVALUE) ) );非パーティションテーブル
tbl3を作成します。obclient> CREATE TABLE tbl3 (col1 INT, col2 INT);テーブル
tbl3_rrにデータを挿入します。obclient> INSERT INTO tbl3_rr VALUES(1, 10), (4, 15), (6, 12), (19, 160);実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0パーティションテーブル
tbl3_rrのパーティションsp0のデータを確認します。obclient> SELECT * FROM tbl3_rr PARTITION(sp0);実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 10 | | 4 | 15 | | 6 | 12 | +------+------+ 3 rows in setテーブル
tbl3にデータを挿入します。obclient> INSERT INTO tbl3 VALUES(2, 20), (3, 10), (5, 17), (8, 12);実行結果は次のとおりです:
Query OK, 4 rows affected Records: 4 Duplicates: 0 Warnings: 0サブパーティションテーブル
tbl3_rrのパーティションsp0とパーティションテーブルtbl3との間でパーティション交換を実行します。obclient> ALTER TABLE tbl3_rr EXCHANGE PARTITION sp0 WITH TABLE tbl3 WITHOUT VALIDATION;パーティションテーブル
tbl3_rrのパーティションsp0のデータを確認します。obclient> SELECT * FROM tbl3_rr PARTITION(sp0);実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 2 | 20 | | 3 | 10 | | 5 | 17 | | 8 | 12 | +------+------+ 4 rows in set