このトピックでは、ApsaraDB for SelectDB の動的パーティショニング機能について説明し、動的パーティショニング機能の使用方法の例を示します。これは、パーティションを動的に管理し、コストを削減するのに役立ちます。
概要
特定のシナリオでは、テーブルを日単位でパーティション分割できます。パーティションを手動で管理する場合、テーブルのパーティションを作成していない日にデータがテーブルにインポートされない可能性があります。これはメンテナンスコストを増加させます。この問題を解決するには、テーブルを作成するときに動的パーティショニング機能を使用して動的パーティショニングルールを設定できます。 ApsaraDB for SelectDB は、設定されたルールに基づいてパーティションを作成または削除します。実行時に既存のルールを変更してパーティションを管理することもできます。
ApsaraDB for SelectDB では、動的パーティショニング機能を使用して、範囲パーティションのみを動的に作成または削除できます。
動的にパーティション分割されたテーブルの作成
動的パーティショニングルールは、テーブルの作成時または実行時のテーブルの変更時に設定できます。動的パーティショニングルールは、単一のパーティションキー列に基づいてパーティション分割されたテーブルに対してのみ設定できます。次のサンプルコードは、テーブルの作成時に動的パーティショニングルールを設定する方法の例を示しています。
CREATE TABLE tbl1
(...)
PROPERTIES
(
"dynamic_partition.prop1" = "value1", // 動的パーティションのプロパティ1
"dynamic_partition.prop2" = "value2", // 動的パーティションのプロパティ2
...
)
グローバル設定項目
動的パーティショニングに関連する次の設定項目は、ApsaraDB for SelectDB インスタンスに適用されます。
dynamic_partition_enable
動的パーティショニング機能を有効にするかどうかを指定します。デフォルト値:true。このパラメーターは、動的にパーティション分割されたテーブルのパーティショニング操作にのみ影響し、標準テーブルには影響しません。
実行時に次のコマンドを実行して、このパラメーターを指定できます。
ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true")
動的パーティショニング機能をグローバルに無効にする場合は、このパラメーターを false に設定します。
dynamic_partition_check_interval_seconds
動的パーティショニングスレッドを実行する間隔。単位:秒。デフォルト値:600。これは、動的パーティショニングスレッドが 10 分ごとに実行されることを指定します。
実行時に次のコマンドを実行して、このパラメーターを変更できます。
ADMIN SET FRONTEND CONFIG ("dynamic_partition_check_interval_seconds" = "7200")
テーブル設定項目
動的パーティショニングルールを設定するために使用されるパラメーターの名前には、dynamic_partition
というプレフィックスが付いています。次の表に、動的パーティショニングに関連するパラメーターを示します。 次の表は、動的パーティショニングに関連するパラメーターについて説明しています。
パラメーター | デフォルト値 | 説明 |
dynamic_partition.enable |
| 動的パーティショニング機能を有効にするかどうかを指定します。有効な値:
|
dynamic_partition.time_unit | デフォルト値なし | 動的パーティションスケジューリングの単位。有効な値:
|
dynamic_partition.time_zone |
| 動的に作成されたパーティションのタイムゾーン。 |
dynamic_partition.start |
| 動的に作成されたパーティションの開始オフセット。負の数値です。 |
dynamic_partition.end | デフォルト値なし | 動的に作成されたパーティションの終了オフセット。正の数値です。 |
dynamic_partition.prefix | デフォルト値なし | 動的に作成されたパーティションの名前のプレフィックス。 |
dynamic_partition.create_history_partition |
| 履歴パーティションを作成するかどうかを指定します。 |
dynamic_partition.history_partition_num |
| 作成する履歴パーティションの数。このパラメーターは、 |
dynamic_partition.reserved_history_periods |
| 保持する履歴パーティションの時間範囲。 |
dynamic_partition.buckets | デフォルト値なし | 動的に作成されたパーティションのバケット数。 |
dynamic_partition.start_day_of_week |
| 各週の開始点。このパラメーターは、 |
dynamic_partition.start_day_of_month |
| 各月の開始点。このパラメーターは、 |
dynamic_partition.reserved_history_periods パラメーターの設定例
たとえば、テーブルが日単位でパーティション分割されているとします。
次の動的パーティショニングパラメーターを指定します。
time_unit="DAY/WEEK/MONTH", end=3, start=-3, reserved_history_periods="[2020-06-01,2020-06-20],[2020-10-31,2020-11-15]"
。システムは、次の時間範囲の履歴パーティションを自動的に保持します。
["2020-06-01","2020-06-20"],["2020-10-31","2020-11-15"]
次の動的パーティショニングパラメーターを指定します。
time_unit="HOUR", end=3, start=-3, reserved_history_periods="[2020-06-01 00:00:00,2020-06-01 03:00:00]"
。システムは、次の時間範囲の履歴パーティションを自動的に保持します。
["2020-06-01 00:00:00","2020-06-01 03:00:00"]
reserved_history_periods
パラメーターの値では、[...,...]
形式の各間隔は、開始時刻と終了時刻で構成されます。開始時刻と終了時刻の両方を指定する必要があり、開始時刻を終了時刻より後にすることはできません。
履歴パーティションの作成ルール
create_history_partition
パラメーターを true
に設定すると、ApsaraDB for SelectDB は、dynamic_partition.start
および dynamic_partition.history_partition_num
パラメーターの値に基づいて、作成する履歴パーティションの数を決定します。
たとえば、expect_create_partition_num
パラメーターを使用して、作成する履歴パーティションの数を指定します。次のルールに基づいて、このパラメーターの値を計算します。
create_history_partition=true
dynamic_partition.history_partition_num
パラメーターが -1 に設定されている場合、次の式を使用して expect_create_partition_num パラメーターの値を計算します。expect_create_partition_num = end - start
。dynamic_partition.history_partition_num
パラメーターが別の値に設定されている場合、次の式を使用して expect_create_partition_num パラメーターの値を計算します。expect_create_partition_num = end - Max(start,-history_partition_num)
。
create_history_partition=false
:この場合、履歴パーティションは作成されません。次の式を使用して expect_create_partition_num パラメーターの値を計算します。expect_create_partition_num = end - 0
。
expect_create_partition_num
パラメーターの値が max_dynamic_partition_num
パラメーターの値より大きい場合、過剰なパーティションは作成されません。 max_dynamic_partition_num パラメーターのデフォルト値は 500 です。
履歴パーティションの例
たとえば、現在の日付が 2021-05-20 で、テーブルが日単位でパーティション分割されており、次の動的パーティショニングパラメーターが指定されているとします。
create_history_partition=true, end=3, start=-3, history_partition_num=1
。システムは次のパーティションを自動的に作成します。p20210519 p20210520 p20210521 p20210522 p20210523
たとえば、現在の日付が 2021-05-20 で、テーブルが日単位でパーティション分割されており、次の動的パーティショニングパラメーターが指定されているとします。
create_history_partition=true, end=3, start=-3, history_partition_num=5
。システムは次のパーティションを自動的に作成します。p20210517 p20210518 p20210519 p20210520 p20210521 p20210522 p20210523
たとえば、現在の日付が 2021-05-20 で、テーブルが日ごとにパーティション分割され、次の動的パーティション分割パラメーターが指定されているとします。
create_history_partition=true, end=3, start=-3, history_partition_num=-1
。 システムは、自動的に次のパーティションを作成します。p20210517 p20210518 p20210519 p20210520 p20210521 p20210522 p20210523
重要動的パーティショニング機能を使用する場合、
dynamic_partition.start
パラメーターで指定された開始オフセットとdynamic_partition.end
パラメーターで指定された終了オフセットの間の時間範囲内の一部のパーティションは、予期しない問題により失われる可能性があります。dynamic_partition.end
パラメーターで指定された終了オフセットと現在の日付の間の時間範囲で失われたパーティションは再作成されますが、dynamic_partition.start
パラメーターで指定された開始オフセットと現在の日付の間の時間範囲で失われたパーティションは再作成されません。
例
パーティションキー列が DATE 型の k1 である
tbl1
テーブルの動的パーティショニングルールを設定します。データは日単位でパーティション分割されます。過去 7 日以内のパーティションのみが保持され、今後 3 日間のパーティションが事前に作成されます。CREATE TABLE tbl1 ( k1 DATE, // パーティションキー列 k2 int ) PARTITION BY RANGE(k1) () DISTRIBUTED BY HASH(k1) PROPERTIES ( "dynamic_partition.enable" = "true", // 動的パーティショニングを有効にする "dynamic_partition.time_unit" = "DAY", // パーティションを日単位で作成または削除する "dynamic_partition.start" = "-7", // 過去7日間のパーティションを保持する "dynamicpartition.end" = "3", // 今後3日間のパーティションを事前に作成する "dynamic_partition.prefix" = "p", // パーティション名のプレフィックス "dynamic_partition.create_history_partition" = "true", // 履歴パーティションを作成する "dynamic_partition.buckets" = "32" // 各パーティションのバケット数 );
たとえば、現在の日付が 2020-05-29 であるとします。上記のルールに基づいて、
tbl1
テーブルには次のパーティションが作成されます。p20200529: ["2020-05-29", "2020-05-30") p20200530: ["2020-05-30", "2020-05-31") p20200531: ["2020-05-31", "2020-06-01") p20200601: ["2020-06-01", "2020-06-02")
翌日である 2020 年 5 月 30 日に、新しいパーティション
p20200602: ["2020-06-02", "2020-06-03")
が作成されます。2020 年 6 月 6 日には、
dynamic_partition.start
パラメーターが -7 に設定されているため、7 日前に作成されたパーティションが削除されます。この場合、p20200529
パーティションが削除されます。パーティションキー列が
DATETIME
型の k1 であるtbl1
テーブルの動的パーティショニングルールを設定します。データは週単位でパーティション分割されます。過去 2 週間以内のパーティションのみが保持され、今後 2 週間のパーティションが事前に作成されます。CREATE TABLE tbl1 ( k1 DATETIME, // パーティションキー列 ... ) PARTITION BY RANGE(k1) () DISTRIBUTED BY HASH(k1) PROPERTIES ( "dynamic_partition.enable" = "true", // 動的パーティショニングを有効にする "dynamic_partition.time_unit" = "WEEK", // パーティションを週単位で作成または削除する "dynamic_partition.start" = "-2", // 過去2週間のパーティションを保持する "dynamic_partition.end" = "2", // 今後2週間のパーティションを事前に作成する "dynamic_partition.prefix" = "p", // パーティション名のプレフィックス "dynamic_partition.create_history_partition" = "true", // 履歴パーティションを作成する "dynamic_partition.buckets" = "8" // 各パーティションのバケット数 );
たとえば、現在の日付が 2020-05-29 であるとします。これは 2020 年の第 22 週です。デフォルトでは、各週の開始点は月曜日です。上記のルールに基づいて、
tbl1
テーブルには次のパーティションが作成されます。p2020_22: ["2020-05-25 00:00:00", "2020-06-01 00:00:00") p2020_23: ["2020-06-01 00:00:00", "2020-06-08 00:00:00") p2020_24: ["2020-06-08 00:00:00", "2020-06-15 00:00:00")
各パーティションの開始点は月曜日です。 k1 列は
DATETIME
型であるため、システムはパーティションキー値の時、分、秒を 00:00:00 で補完します。2020 年 6 月 15 日(2020 年の第 25 週)には、2 週間前に作成されたパーティションが削除されます。この場合、
p2020_22
パーティションが削除されます。前の例では、
dynamic_partition.start_day_of_week
パラメーターを 3 に設定すると、水曜日が各週の開始点として指定され、次のパーティションが作成されます。p2020_22: ["2020-05-27 00:00:00", "2020-06-03 00:00:00") p2020_23: ["2020-06-03 00:00:00", "2020-06-10 00:00:00") p2020_24: ["2020-06-10 00:00:00", "2020-06-17 00:00:00")
作成されたパーティションは、現在の週の水曜日から翌週の火曜日までの時間範囲にあります。
説明2019-12-31 と 2020-01-01 は同じ週に属します。パーティションの開始点が 2019-12-31 の場合、パーティションの名前は
p2019_53
となります。パーティションの開始点が 2020-01-01 の場合、パーティションの名前はp2020_01
となります。パーティションキー列が
DATE
型の k1 であるtbl1
テーブルの動的パーティショニングルールを設定します。データは月単位でパーティション分割されます。履歴パーティションは削除されず、今後 2 か月のパーティションが事前に作成されます。さらに、各月の 3 日目が各月の開始点として指定されます。CREATE TABLE tbl1 ( k1 DATE, // パーティションキー列 ... ) PARTITION BY RANGE(k1) () DISTRIBUTED BY HASH(k1) PROPERTIES ( "dynamic_partition.enable" = "true", // 動的パーティショニングを有効にする "dynamic_partition.time_unit" = "MONTH", // パーティションを月単位で作成または削除する "dynamic_partition.end" = "2", // 今後2か月のパーティションを事前に作成する "dynamic_partition.prefix" = "p", // パーティション名のプレフィックス "dynamic_partition.create_history_partition" = "true", // 履歴パーティションを作成する "dynamic_partition.history_partition_num" = "6", // 履歴パーティションの数を6に設定する "dynamic_partition.buckets" = "8", // 各パーティションのバケット数 "dynamic_partition.start_day_of_month" = "3" // 各月の開始点を3日目に設定する );
たとえば、現在の日付が 2020-05-29 であるとします。上記のルールに基づいて、
tbl1
テーブルには次のパーティションが作成されます。p202005: ["2020-05-03", "2020-06-03") p202006: ["2020-06-03", "2020-07-03") p202007: ["2020-07-03", "2020-08-03")
dynamic_partition.start
パラメーターが空であるため、履歴パーティションは削除されません。たとえば、現在の日付が 2020-05-20 で、開始点が各月の 28 日目の場合、次のパーティションが作成されます。
p202004: ["2020-04-28", "2020-05-28") p202005: ["2020-05-28", "2020-06-28") p202006: ["2020-06-28", "2020-07-28")
動的パーティショニングパラメーターの変更
実行時に次のステートメントを実行して、動的パーティショニングパラメーターを変更します。
ALTER TABLE tbl1 SET( "dynamic_partition.prop1" = "value1", ...); // 変更後の動的パーティションのプロパティ
特定の動的パーティショニングパラメーターを変更すると、競合が発生する可能性があります。たとえば、データが日単位でパーティション分割され、次のパーティションが作成されているとします。
p20200519: ["2020-05-19", "2020-05-20")
p20200520: ["2020-05-20", "2020-05-21")
p20200521: ["2020-05-21", "2020-05-22")
データを月単位でパーティション分割する場合、システムは範囲が ["2020-05-01", "2020-06-01")
であるパーティションを作成しようとします。ただし、このパーティションの範囲は既存のパーティションの範囲と競合します。したがって、パーティションを作成できません。範囲が ["2020-06-01", "2020-07-01")
であるパーティションは作成できます。この場合、2020-05-22 から 2020-05-30 までの時間範囲のパーティションを作成する必要があります。
動的にパーティション分割されたテーブルのパーティションの削除
動的にパーティション分割されたテーブルのパーティションを削除する前に、次のステートメントを実行して動的パーティショニング機能を無効にする必要があります。
ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "false"); // 動的パーティショニング機能を無効にする
次に、次のステートメントを実行して、特定のパーティションを削除します。
ALTER TABLE tbl1 DROP PARTITION p20200519;
通常、動的にパーティション分割されたテーブルのパーティションを削除した後、動的パーティショニング機能を再度有効にする必要があります。これにより、ApsaraDB for SelectDB は、後続のビジネス操作中にパーティションを自動的に管理し続けることができます。
ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "true"); // 動的パーティショニング機能を再度有効にする
動的にパーティション分割されたテーブルのスケジューリングステータスのクエリ
次のステートメントを実行して、現在のデータベース内のすべての動的にパーティション分割されたテーブルのスケジューリングステータスをクエリします。
mysql> SHOW DYNAMIC PARTITION TABLES;
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| TableName | Enable | TimeUnit | Start | End | Prefix | Buckets | StartOf | LastUpdateTime | LastSchedulerTime | State | LastCreatePartitionMsg | LastDropPartitionMsg | ReservedHistoryPeriods |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| d3 | true | WEEK | -3 | 3 | p | 1 | MONDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | [2021-12-01,2021-12-31] | // テーブル名、有効化、時間単位、開始、終了、プレフィックス、バケット、開始日、最終更新日時、最終スケジューラ日時、状態、最終作成パーティションメッセージ、最終削除パーティションメッセージ、予約済み履歴期間
| d5 | true | DAY | -7 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d4 | true | WEEK | -3 | 3 | p | 1 | WEDNESDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d6 | true | MONTH | -2147483648 | 2 | p | 8 | 3rd | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d2 | true | DAY | -3 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d7 | true | MONTH | -2147483648 | 5 | p | 8 | 24th | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
7 rows in set (0.02 sec)
LastUpdateTime:動的パーティショニングパラメーターが最後に変更された日時。
LastSchedulerTime:動的パーティションスケジューリングが最後に実行された日時。
State:最後の動的パーティションスケジューリングの状態。
LastCreatePartitionMsg:パーティションが最後に動的に作成されたときに返されたエラーメッセージ。
LastDropPartitionMsg:パーティションが最後に動的に削除されたときに返されたエラーメッセージ。
高度な操作
動的にパーティション分割されたテーブルは、手動でパーティション分割されたテーブルに変換できます。ただし、テーブルは動的にパーティション分割するか、手動でパーティション分割することのみ可能です。
手動でパーティション分割されたテーブルを動的にパーティション分割されたテーブルに変換する
テーブルの作成時にテーブルの動的パーティショニングルールを設定しない場合、実行時に ALTER TABLE
ステートメントを実行して動的パーティショニングパラメーターを変更することで、テーブルの動的パーティショニングルールを設定できます。
動的パーティショニング機能が有効になると、パーティションを手動で管理できなくなります。代わりに、システムは指定した動的パーティショニングパラメーターに基づいてパーティションを自動的に管理します。
dynamic_partition.start
パラメーターが指定されている場合、動的に作成されたパーティションの開始オフセットより前の指定された時間範囲内の履歴パーティションは削除されます。
動的にパーティション分割されたテーブルを手動でパーティション分割されたテーブルに変換する
ALTER TABLE tbl_name SET ("dynamic_partition.enable" = "false")
ステートメントを実行して、動的パーティショニング機能を無効にし、動的にパーティション分割されたテーブルを手動でパーティション分割されたテーブルに変換できます。
動的パーティショニング機能が無効になると、パーティションは自動的に管理されなくなります。ALTER TABLE
ステートメントを実行して、パーティションを作成または削除する必要があります。
FAQ
Q: 動的にパーティション分割されたテーブルを作成するときに "fe config dynamic_partition_enable が false の場合、動的パーティションを持つテーブルを作成できませんでした" というエラーが報告された場合はどうすればよいですか??
A: 動的パーティションテーブルを作成できません。これは、動的パーティショニング機能のグローバルパラメータ
dynamic_partition_enable
が false に設定されているためです。ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true")
コマンドを実行して、このグローバルパラメータを true に設定してください。Q:動的に作成されたパーティションのバケット数を指定するにはどうすればよいですか?
A:動的に作成されたパーティションは、システムの内部スケジューリングプロセスによって自動的に作成されます。テーブルのパーティションが自動的に作成されると、システムはテーブルのデフォルトパラメーター設定ではなく、
dynamic_partition
というプレフィックスが付いた動的パーティショニングパラメーターの設定を使用します。適用される動的パーティショニングパラメーターは、パーティションのバケット数も指定します。次のサンプルコードは例を示しています。CREATE TABLE tbl1 ( `k1` int, `k2` date ) PARTITION BY RANGE(k2)() // 初期パーティションは作成されない DISTRIBUTED BY HASH(k1) BUCKETS 3 // テーブルのデフォルト設定 PROPERTIES ( "dynamic_partition.enable" = "true", // 動的パーティショニングを有効にする "dynamic_partition.time_unit" = "DAY", // パーティションを日単位で作成または削除する "dynamic_partition.start" = "-3", // 過去3日間のパーティションを保持する "dynamic_partition.end" = "3", // 今後3日間のパーティションを事前に作成する "dynamic_partition.prefix" = "p", // パーティション名のプレフィックス "dynamic_partition.create_history_partition" = "true", // 履歴パーティションを作成する "dynamic_partition.buckets" = "32" // 動的パーティショニングのバケット数 );
前の例では、PARTITION BY 句にパーティション定義が含まれていないため、初期パーティションは作成されません。次のパラメーターが指定されています。
DISTRIBUTED BY HASH(k1) BUCKETS 3
および"dynamic_partition.buckets" = "32"
。前者のパラメーター設定はテーブルのデフォルト設定であり、後者のパラメーター設定は動的パーティショニング専用です。システムがパーティションを自動的に作成する場合、バケット数は 3 ではなく 32 に設定されます。
ALTER TABLE tbl1 ADD PARTITION
ステートメントを実行してパーティションを手動で作成する場合、バケット数は 3 に設定されます。動的に作成されたパーティションは、個別の設定セットを使用します。テーブルのデフォルトパラメーター設定は、動的パーティショニング用に排他的なパラメーター設定が設定されていない場合にのみ使用されます。CREATE TABLE tbl3 ( `k1` int, `k2` date ) PARTITION BY RANGE(k2)( PARTITION p1 VALUES LESS THAN ("2019-10-10") // 手動で作成されたパーティション ) DISTRIBUTED BY HASH(k1) BUCKETS 3 // テーブルのデフォルト設定 PROPERTIES ( "dynamic_partition.enable" = "true", // 動的パーティショニングを有効にする "dynamic_partition.time_unit" = "DAY", // パーティションを日単位で作成または削除する "dynamic_partition.start" = "-3", // 過去3日間のパーティションを保持する "dynamic_partition.end" = "3", // 今後3日間のパーティションを事前に作成する "dynamic_partition.prefix" = "p", // パーティション名のプレフィックス "dynamic_partition.create_history_partition" = "true", // 履歴パーティションを作成する "dynamic_partition.buckets" = "32" // 動的パーティショニングのバケット数 );
この例では、p1 パーティションは手動で作成されます。このパーティションはテーブルのデフォルトパラメーター設定を使用し、バケット数は 3 に設定されます。ただし、システムによって動的に作成されたパーティションは、引き続き動的パーティショニング専用のパラメーター設定を使用し、バケット数は 32 に設定されます。