OceanBaseデータベースのパーティション交換機能は、主にパーティションテーブルへの高速なデータインポートを実現し、データの効率的なロードを目的としています。具体的には、フルダンプ方式によるダイレクトロードで新規作成された非パーティションテーブルへデータを迅速にインポートした後、パーティション交換機能を活用してその非パーティションテーブル内のデータをパーティションテーブルへ高速に移行することで、既存のパーティションテーブルに対する増分データインポートのパフォーマンスを向上させます。
パーティション交換機能を、増分ダイレクトロードの代替手段として検討することも可能です。例えば、パーティション交換機能を利用してパーティションテーブルAの増分データをインポートする場合、具体的な手順は以下の通りです:
- テーブルA上に新しい空のパーティションPを作成します。
- 構造がテーブルAと完全に一致する非パーティションテーブルBを新たに作成し、ダイレクトロードを通じて増分データをテーブルBへインポートします。
- パーティション交換機能を使用して、テーブルAの新しいパーティションPとテーブルBを交換します。
パーティション交換のサポート状況
パーティション交換のサポート状況は以下の表に示されています。タイプの列はターゲットテーブル(target_partition_table_name)を、タイプの行はソーステーブル(origin_table_name)を表します。
| タイプ | パーティションなしのテーブル | レベル1パーティションテーブル | レベル2パーティションテーブル |
|---|---|---|---|
| レベル1パーティションテーブル | サポート | サポートしない | サポートしない |
| レベル2パーティションテーブルのレベル1パーティション | サポートしない | サポート | サポートしない |
| レベル2パーティションテーブルのレベル2パーティション | サポート | サポートしない | サポートしない |
制限事項と注意点
データ検証はサポートされていません。つまり、
WITHOUT VALIDATIONを必ず指定する必要があります。ユーザー自身が交換データの有効性を保証する必要があります。パーティションテーブルと非パーティションテーブルのテーブルレベルおよびカラムレベルのプロパティ要件は、それぞれ対応する必要があります。
パーティションテーブルと非パーティションテーブルの制約要件は完全に同じであり、現在のバージョンでは両テーブル間に外部キー制約を設定することはサポートされていません。
パーティションテーブルのローカルインデックステーブルと非パーティションテーブルのインデックステーブルは、それぞれ対応する必要があります。
INCLUDING INDEXESの動作のみがサポートされています(MySQLモードではデフォルトでINCLUDING INDEXESが含まれます)。ローカルインデックスに対応するパーティションのデータも交換に参加し、交換後のローカルインデックスは交換前の可用状態を維持します。UPDATE GLOBAL INDEXESはサポートされていないため、グローバルインデックスは交換成功後もUnusable状態(無効な状態)になります。現在のパーティション交換機能は、増分ダイレクトロードの一時的な代替機能としてのみ推奨されます。増分ダイレクトロードに関する詳細については、ダイレクトロードの概要を参照してください。
レベル1パーティションテーブルと非パーティションテーブルでデータを交換する場合:
レベル1パーティションはRange/Range Columns/Listパーティションである必要があります。
説明
レベル1パーティションテーブルと非パーティションテーブルでデータを交換する場合、V4.3.5バージョンでは、V4.3.5 BP5バージョンからレベル1パーティションがListパーティションであることがサポートされています。
レベル2パーティションテーブルのレベル2パーティションと非パーティションテーブルでデータを交換する場合:
- レベル1パーティションタイプには特に制限はありませんが、レベル2パーティションはRange/Range Columnsパーティションである必要があります。
レベル2パーティションテーブルのレベル1パーティションとレベル1パーティションテーブルでデータを交換する場合:
target_partition_table_nameはレベル2パーティションテーブルでなければなりません。交換するパーティションは、このテーブルのいずれかのレベル1パーティション名である必要があります。また、このレベル2パーティションテーブルのレベル1パーティションはRange/Range Columns/List/List Columnsパーティションである必要があります。origin_table_nameはレベル1パーティションテーブルでなければならず、そのパーティションタイプは交換用のレベル1パーティション内のレベル2パーティションと完全に一致している必要があります。- レベル1とレベル2のパーティションテーブルを交換した後、関連するテーブルの統計情報は無効になります。再収集が必要です。
構文
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次パーティションテーブルです。
説明OceanBaseデータベースV4.3.5では、V4.3.5 BP3以降のバージョンから、2次パーティションテーブルの1次パーティションと1次パーティションテーブル間でのデータ交換がサポートされています。 |
使用方法
現在のパーティション交換機能は、パーティションテーブルの1つのパーティションと非パーティションテーブル間でデータを交換するものであり、主に増分ロード機能の一時的な代替ツールとして使用されます。パーティションテーブルと非パーティションテーブルの一般的な特徴は以下の通りです:
- パーティションテーブル(partitioned table):履歴データを含むパーティションテーブルで、通常データ量が大きいです。
- 非パーティションテーブル(non-partitioned table):増分データを含みます。
パーティション交換機能を使用する際は、誤った操作により元のパーティションキーの条件にデータが合わなくなる可能性があり、連鎖的なエラーを引き起こす恐れがあるため、非常に慎重に行う必要があります。そのため、パーティション交換を実行する際には、以下の手順に従ってパーティションテーブルと非パーティションテーブルがパーティション交換を実行可能かどうかを判断する必要があります。
SHOW CREATE TABLEステートメントを使用して、パーティションテーブルのパーティションキーとターゲットパーティション情報を照会します。同時に非パーティションテーブルのデータを照会し、非パーティションテーブルのデータがターゲットパーティションのパーティションキーのデータ範囲要件を満たしているかどうかを確認します。ここで、
table_nameは照会対象のテーブル名です。SHOW CREATE TABLE table_name;照会結果に基づいて、パーティションテーブルと非パーティションテーブルが上記の制限事項と注意点を満たしていることを確認します。
パーティション交換を実行する前に、以下の条件が要求に適合していることを最低でも確認する必要があります。
プロパティ 必要 同一テナント内か はい 同一データベース内か いいえ。MySQL互換で、データベース間の交換をサポートしています 同一テーブルグループ(TableGroup)か はい 同一テーブルスペース(TableSpace)か はい 使用する文字セット形式が一致しているか はい テーブルタイプが一致しているか はい。いずれもユーザー テーブルである必要があります。つまり、 USER_TABLEプライマリキーの数が一致しているか はい レコードストレージ形式が一致しているか はい 列のフォーマットと列の相対順序が一致しているか はい すべて自動インクリメント列か はい 列のデフォルト値、生成リスト式が一致しているか はい 暗号化方式が一致しているか はい 列ストア形式が一致しているか はい インデックス形式、状態、および数が一致しているか はい。パーティションテーブルのローカルインデックスは、非パーティションテーブルのインデックスと1対1に対応する必要があります インデックステーブル名が一致しているか はい。MySQL互換で、同じテーブル名を持つインデックス定義は1対1に対応します 拘束形式と含む列が一致しているか はい パーティション交換の構文を使用してパーティション交換を実行します。交換後、パーティションテーブルの指定されたパーティションのデータは非パーティションテーブルに移動し、非パーティションテーブルのデータはパーティションテーブルの指定されたパーティションに移動します。パーティションテーブルのグローバルインデックス状態は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