PolarDB for PostgreSQL (Oracle 互換) のデータテーブルが大きくなると、パーティションテーブルを手動で管理するのは複雑で時間がかかります。pg_partman は、パーティション管理を自動化することでこの問題に対処する PostgreSQL 拡張機能です。この拡張機能は、時間またはシリアル ID に基づいてテーブルパーティションを自動的に作成・維持し、データ保持ポリシーを適用します。これにより、パーティションテーブルのライフサイクル管理が簡素化され、データベースの保守性とクエリパフォーマンスが向上します。
適用範囲
PolarDB for PostgreSQL (Oracle 互換) のサポート対象バージョン:Oracle 構文互換性 2.0、マイナーエンジンバージョン 2.0.14.19.40.0 以降。
マイナーエンジンバージョンは、コンソールで表示するか、SHOW polardb_version; 文を実行して確認できます。お使いのバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードする必要があります。
特徴
pg_partman 拡張機能のコア機能は、時間または数値/ID 値に基づくパーティションテーブルの自動管理です。これは (pg_partman バージョン 5.0.1 以降) PostgreSQL の組み込みの宣言型パーティショニング機能に完全に基づいています。従来のトリガーベースの方法は使用されなくなりました。
その仕組みは以下の通りです。
パーティションの自動作成:バックグラウンドメンテナンスタスクが、日次、月次、または 100 万 ID ごとなどの設定された間隔に基づいて、将来のパーティションを事前に作成します。これにより、新しいデータをシームレスに書き込むことができます。
データ保持ポリシー:期限切れのデータパーティションを自動的にデタッチ (DETACH) またはドロップ (DROP) します。これにより、データのライフサイクルとストレージコストを管理します。
デフォルトパーティション:各パーティションセットにデフォルトパーティションを作成し、既存の子パーティションに属さないデータをキャッチします。これにより、データ損失を防ぎます。関連する関数を使用して、このデータを正しいパーティションに移行できます。
サブパーティショニングのサポート:多階層パーティショニングをサポートします。例えば、年次パーティションを日次パーティションに細分化して、複雑なデータ組織のニーズに対応できます。
クイックスタート
このセクションでは、ログテーブルを日次でパーティショニングする方法の完全な例を紹介し、pg_partman を始めるのに役立ちます。この例では、log_table という名前のログテーブルを作成し、created_at フィールドに基づいて毎日新しいパーティションを作成し、7 日以上経過したデータを自動的に削除するポリシーを設定します。
ステップ 1: 拡張機能のインストールと親テーブルの作成
まず、データベースに pg_partman 拡張機能をインストールします。次に、パーティショニング用の親テーブルを作成します。
-- 1. 現在のデータベースで pg_partman 拡張機能を有効にします。
CREATE EXTENSION pg_partman;
-- 2. ログデータを格納するための親テーブルを作成します。
-- PARTITION BY RANGE (created_at) は、このテーブルが created_at 列を範囲パーティショニングに使用するパーティションテーブルであることを指定します。
CREATE TABLE public.log_table (
id bigint GENERATED BY DEFAULT AS IDENTITY,
created_at timestamptz NOT NULL,
message text
) PARTITION BY RANGE (created_at);ステップ 2: パーティションセットの初期化
create_parent() 関数を呼び出して、log_table を pg_partman 管理システムに登録し、パーティショニングルールを定義します。
-- create_parent 関数を呼び出してパーティショニングを初期化します。
-- public.log_table: 管理対象の親テーブル。
-- created_at: パーティションキー列。
-- '1 day': パーティション間隔。新しいパーティションが毎日作成されることを意味します。
SELECT create_parent(
p_parent_table := 'public.log_table',
p_control := 'created_at',
p_interval := '1 day'
);正常に実行されると、pg_partman は現在の日付と今後数日間のパーティションを自動的に作成します。\d+ public.log_table コマンドを実行して、作成されたパーティションを表示できます。
ステップ 3: テストデータの挿入
親テーブル log_table にデータを挿入します。データは created_at の値に基づいて、対応するパーティションに自動的にルーティングされます。
INSERT INTO public.log_table (created_at, message)
SELECT generate_series(
now() - interval '4 days',
now(),
interval '1 hour'
),
'This is a log message.';ステップ 4: 保持ポリシーの設定とクリーンアップの検証
データ保持ポリシーを設定して、pg_partman が期限切れのデータを自動的にクリーンアップするようにします。log_table が過去 2 日間のデータを保持し、期限切れのパーティションを自動的に DROP するように設定します。
-- 1. part_config テーブルを更新して、log_table の保持ポリシーを設定します。
UPDATE part_config
SET
retention = '2 days', -- 保持期間を 2 日に設定します。
retention_keep_table = false -- テーブル構造を保持しません。期限切れのパーティションを直接 DROP します。
WHERE parent_table = 'public.log_table';
-- 2. メンテナンス タスクを手動で実行して、保持ポリシーをトリガーします。
CALL run_maintenance_proc();
-- 3. 検証: パーティションリストを再度確認し、2 日以上経過したパーティションが削除されたことを確認します。
SELECT partition_schemaname, partition_tablename FROM show_partitions('public.log_table', 'DESC');これで、日次でパーティショニングされ、自動的にクリーンアップされるログテーブルの設定が完了しました。
注意事項
pg_partman を使用する前に、データ損失やサービス中断を避けるために、以下の制限事項とリスクを理解してください。
属性の継承:
pg_partmanは、特定のインデックスやUNLOGGEDステータスなど、親テーブルから直接継承できない一部のプロパティを管理するためにテンプレートテーブルを使用します。テンプレートテーブルへの変更は、新しく作成されるパーティションにのみ影響します。既存のパーティションは手動で更新する必要があります。タイムゾーン:時間に基づいてパーティショニングする場合、データベースシステム、クライアント、およびメンテナンスタスクを呼び出すすべての環境で一貫したタイムゾーンを使用するようにしてください。夏時間 (DST) などの問題によるパーティション作成の失敗やスキップを避けるために、UTC の使用を推奨します。
サブパーティショニング:
サブパーティショニングの主な機能は、データの組織化とライフサイクル管理です。パフォーマンス向上への効果は限定的です。パフォーマンスを最適化したい場合は、サブパーティショニングに頼るのではなく、パーティション間隔を調整することを推奨します。サブパーティションが多すぎると、管理オーバーヘッドが増加し、
max_locks_per_transactionリソースを使い果たす可能性があります。サブパーティショニングは論理レプリケーション (
PUBLICATION/SUBSCRIPTION) をサポートしていません。パーティションテーブルで論理レプリケーションを使用する予定がある場合は、サブパーティショニング機能の使用を避けてください。サブパーティションの作成 (
create_sub_parent) は破壊的な操作です。次のレベルのパーティショニングを追加するために、既存のパーティションを削除して再構築します。実行する前に、関連データのバックアップを推奨します。
オブジェクト名の長さ:PostgreSQL のオブジェクト名は 63 バイトに制限されています。
pg_partmanは、サフィックスを収容するためにテーブル名を自動的に切り捨てます。ただし、親テーブル名が長すぎて類似している場合、異なるパーティションセット間でパーティション名の競合が発生する可能性があります。親テーブル名は簡潔に保つことを推奨します。UNIQUE 制約:パーティションキー以外の列にグローバルな一意性制約やプライマリキーを作成することはできません。これは PostgreSQL の宣言型パーティショニングのネイティブな制限です。
pg_partmanでは、各パーティションにローカルな一意性制約を作成できますが、これはパーティションセット全体でのグローバルな一意性を保証するものではありません。デフォルトパーティション:デフォルトパーティションに分類されるデータには注意が必要です。
pg_partmanは、既存のどのパーティションにも属さないデータを受け取るためにデフォルトパーティションを作成します。デフォルトでは、パーティションメンテナンスはデフォルトパーティション内のデータをチェックして新しいパーティションを作成することはありません。データが継続的にデフォルトパーティションに書き込まれる場合は、partition_data_*シリーズの関数を使用して、できるだけ早く正しいパーティションに移行してください。また、異常なデータ書き込みの原因を調査してください。パーティショニングの取り消し:
undo_partition()を実行すると、すべてのパーティションメンテナンスが一時停止します。取り消し操作が完了するまで、run_maintenance()はそのパーティションセットに対して新しいパーティションを作成したり、保持ポリシーを適用したりしません。ロックとリソース:多数のパーティションを管理すると、ロックリソースの消費量が増加する可能性があります。単一のパーティションセットに数百または数千のパーティションが含まれている場合、
run_maintenance()やその他のメンテナンス操作では、メモリ不足を避けるためにmax_locks_per_transactionパラメーターの調整が必要になる場合があります。このような状況では、run_maintenance_proc()プロシージャの使用を推奨します。これは、各パーティションセットのメンテナンス後にトランザクションをコミットするため、長時間実行トランザクションによるロック競合を軽減します。
ベストプラクティス
シナリオ 1: 自動クリーンアップ機能付きの日次パーティションログテーブル
このシナリオは、ログ、監査レコード、モノのインターネット (IoT) の時系列データなど、急速に増加し、明確なライフサイクルを持つデータに適しています。
ビジネスシナリオ
audit_logs テーブルを日次でパーティショニングし、データを 30 日間保持し、期限切れのデータを直接削除するのではなく、別のスキーマに自動的にアーカイブします。
手順
親テーブルを作成し、パーティションセットを初期化します。
-- 親テーブルを作成します。 CREATE TABLE public.audit_logs ( log_id uuid NOT NULL, event_time timestamptz NOT NULL, user_id text, details jsonb, PRIMARY KEY (event_time, log_id) ) PARTITION BY RANGE (event_time); -- 日次パーティショニングのためにパーティションセットを初期化します。 SELECT create_parent( p_parent_table := 'public.audit_logs', p_control := 'event_time', p_interval := '1 day' );保持およびアーカイブポリシーを設定します。30 日以上経過した古いパーティションを
archiveスキーマに移動し、その後のバッチ分析やバックアップに備えます。-- アーカイブ用のスキーマを作成します。 CREATE SCHEMA IF NOT EXISTS archive; -- 構成を更新して保持ポリシーを設定します。 UPDATE part_config SET retention = '30 days', -- 30 日間保持します。 retention_schema = 'archive' -- 期限切れになったら archive スキーマに移動します。 WHERE parent_table = 'public.audit_logs';run_maintenance()が実行されると、audit_logs_p2023_10_01のように、全体が 30 日以上経過したパーティションテーブルは、プライマリパーティションセットからデタッチされます。そのスキーマはpublicからarchiveに変更され、archive.audit_logs_p2023_10_01になります。
シナリオ 2: ID による業務テーブルのパーティショニング
このシナリオは、ユーザーテーブルや商品テーブルのように、数値 ID をプライマリキーとして使用し、パーティショニングによってホットデータとコールドデータを分離したいビジネスに適しています。
ビジネスシナリオ
orders テーブルを order_id でパーティショニングし、各パーティションに 1,000 万 ID を含めます。
判断のアドバイス
p_interval の選択は重要です。ビジネス ID の増加率と単一パーティションの適切なサイズに基づいて見積もることができます。毎日 100 万件の新規注文が追加される場合、10000000 の間隔は、約 10 日ごとに新しいパーティションが作成されることを意味します。
手順
親テーブルを作成し、パーティションセットを初期化します。
-- 親テーブルを作成します。 CREATE TABLE public.orders ( order_id bigint NOT NULL, customer_id bigint, order_date timestamptz, amount numeric ) PARTITION BY RANGE (order_id); -- ID 範囲によるパーティショニングのためにパーティションセットを初期化します。 -- 注意: p_interval は数値であってもテキストとして提供する必要があります。 SELECT create_parent( p_parent_table := 'public.orders', p_control := 'order_id', p_interval := '10000000' -- 各パーティションには 1,000 万 ID が含まれます。 );保持ポリシーの設定 (オプション):古い注文データをアーカイブまたは削除できる場合は、ID ベースの保持ポリシーを設定できます。
-- 最新の 5,000 万件の注文レコードを保持します。 -- 現在の最大 order_id が 100,000,000 であると仮定します。 -- このポリシーは、order_id < 50,000,000 のすべてのパーティションを削除します。 UPDATE part_config SET retention = '50000000', retention_keep_table = false WHERE parent_table = 'public.orders';
シナリオ 3: 既存の大規模テーブルのパーティションテーブルへの移行
このシナリオは、テラバイト規模のテーブルなど、既存の大規模なモノリシックテーブルを、pg_partman で管理されるパーティション構造にスムーズに移行するためのものです。
ビジネスシナリオ
1 TB の sensor_data テーブルを月次パーティションテーブルに移行し、オンラインサービスへの影響を最小限に抑えます。
コアツール
partition_data_proc() プロシージャ。小規模なバッチおよび独立したトランザクションでデータを移行できるため、長時間実行されるテーブルロックやトランザクションのバックログを回避できます。
手順
準備:親テーブルを作成し、パーティションセットを初期化します。
-- 1. 元のテーブルをデータソースとして機能するように名前変更します。 ALTER TABLE public.sensor_data RENAME TO sensor_data_source; -- 2. 同じ構造で新しい親テーブルを作成します。 CREATE TABLE public.sensor_data ( reading_id bigserial, device_id text, ts timestamptz NOT NULL, value double precision ) PARTITION BY RANGE (ts); -- 3. パーティションセットを初期化します。 SELECT create_parent('public.sensor_data','ts','1 month');データ移行の実行:
partition_data_procを使用して、sensor_data_sourceから新しいパーティションテーブルsensor_dataにデータをバッチで移行します。-- データ移行プロシージャを呼び出します。 -- p_source_table: ソーステーブルを指定します。 -- p_interval: 各バッチで処理するデータの時間範囲。パーティション間隔以下に設定することを推奨します。ここでは '1 day' に設定されており、1 日分のデータが 1 つのトランザクションで処理されることを意味します。 -- p_wait: 各バッチ間の待機時間 (秒)。I/O と CPU への持続的な圧力を軽減するために使用します。 CALL partition_data_proc( p_parent_table := 'public.sensor_data', p_source_table := 'public.sensor_data_source', p_interval := '1 day', p_wait := 1 );このプロシージャは、
sensor_data_sourceテーブルのすべてのデータが移行されるまでループします。移行中、pg_partmanは、必要に応じてパーティションを自動的に作成します。最終ステップ:移行が完了したら、データ整合性を検証します。その後、元のデータソーステーブル
sensor_data_sourceを安全に削除できます。移行中、アプリケーションは新しいパーティション化された親テーブルsensor_dataに新しいデータを書き込み続けることができます。
基本概念
パーティションタイプと間隔
パーティションタイプ
pg_partman は PostgreSQL の宣言型パーティショニングに基づいており、主に以下のパーティショニング方法をサポートしています。
範囲パーティショニング:タイムスタンプやシリアル ID などの連続データに適しています。これは最も一般的なパーティションタイプです。
リストパーティショニング:間隔が
1の ID ベースのパーティショニングでのみサポートされます。
パーティション間隔 (p_interval)
このパラメーターは、各子パーティションがカバーするデータ範囲を定義します。
時間ベース:
'1 hour'、'1 day'、'1 week'、'1 month'など、有効なinterval値を受け入れます。説明サポートされる最小時間間隔は 1 秒です。上限は PostgreSQL がサポートする最小および最大タイムスタンプ値によって制約されます。
create_parent()を初めて実行してパーティションセットを作成する際、1 日未満の間隔は、作成する最初のパーティションを決定するときに切り捨てられます。24 時間未満で 1 分より大きい間隔は、最も近い時間に切り捨てられます。
1 分未満の間隔は、最も近い分に切り捨てられます。
システムは現在の実時間をサポートするのに十分なパーティションを作成します。これは、
create_parent()を実行すると、予想よりも多くの過去のパーティションが作成され、すべての将来のパーティションが作成されない可能性があることを意味します。run_maintenance()の初回実行時に、不足している将来のパーティションが作成されます。これは、カスタム時間間隔をサポートする必要があるためです。24 時間以上の間隔の場合、設定は期待どおりに進みます。
100 年以上の間隔の場合、拡張機能は世紀または千年紀の実際の開始点を使用してパーティション名と制約ルールを決定します。例えば、21 世紀と第 3 千年紀は 2001 年 1 月 1 日 (2000 年ではない) に始まりました。これは、0 年が存在しないことも意味します。
数値/ID ベース:範囲サイズを表す整数を受け入れますが、
'1000000'のようにテキストとして提供する必要があります。
週次パーティショニング:週の開始日は、
p_start_partitionパラメーターまたはcreate_parent()実行時の現在の日付に依存します。月曜日を開始日として確実にするには、date_trunc()関数で明示的に指定することを推奨します。例:p_start_partition := to_char(date_trunc('week', CURRENT_TIMESTAMP), 'YYYY-MM-DD HH24:MI:SS')。エポックタイム値:パーティションキーが UNIX エポックを格納する整数列である場合、
p_epochパラメーターを'seconds'や'milliseconds'のように設定することで、pg_partmanが時間ベースのパーティショニングとして管理できるようになります。
サブパーティショニング
サブパーティショニングを使用すると、既存のパーティションにさらに細かい粒度のパーティションを作成して、年単位でパーティショニングし、各年を月単位でサブパーティショニングするなどの多階層パーティション構造を形成できます。これは主に、大規模な年次パーティションを月単位でアーカイブするなど、データの組織化とライフサイクル管理に使用されます。パフォーマンス向上については、サブパーティショニングの効果は通常限定的です。トップレベルのパーティション間隔の調整を優先することを推奨します。
サブパーティションの作成 (create_sub_parent) は破壊的な操作です。次のレベルのパーティショニングを追加するために、既存のパーティションを削除して再構築します。実行する前に、関連データのバックアップを推奨します。
データ保持ポリシー
pg_partman は、run_maintenance() を通じてデータ保持ポリシーを自動的に適用し、古いパーティションのライフサイクルを管理します。コア設定パラメーターは以下の通りです。
パラメーター | 説明 | 例 |
| 保持期間。
|
|
|
|
|
| デタッチされた古いパーティションを、元のスキーマに保持したりドロップしたりする代わりに、指定されたアーカイブスキーマに移動します。この設定は |
|
| 古いパーティションがデタッチされるときに、そのインデックスを保持するかどうか。デフォルトは |
|
サブパーティションセットの場合、親テーブルのパーティションがドロップされると、そのパーティション自体がパーティションテーブルである場合、ドロップ操作は継承ツリー全体のすべての下位レベルのパーティションにカスケード (CASCADE) し、それらすべてを削除します。また、pg_partman によって管理されるパーティションセットは、常に少なくとも 1 つのパーティションを保持する必要があることにも注意してください。したがって、保持ポリシーはパーティションセット内の最後のパーティションをドロップすることはありません。
制約除外
制約除外は、パーティションテーブルのクエリパフォーマンスを向上させるための重要な機能です。クエリの WHERE 句が特定のパーティションを明示的に除外できる場合、クエリオプティマイザはそれらのパーティションのスキャンをスキップします。
pg_partman は、制約除外の効果を高めるために、非パーティションキー列に CHECK 制約を追加する機能を提供します。例えば、created_at でパーティショニングされたテーブルに対して、WHERE device_id = 'A' を伴うクエリが頻繁にある場合、データがもはや変更されない古いパーティションの device_id 列に制約を追加できます。
コア設定パラメーターは以下の通りです。
constraint_cols:CHECK制約を作成する列を指定するテキスト配列。例:'{device_id, user_id}'。optimize_constraint:制約を適用する前にパーティションがどれだけ古くなければならないかを定義する整数。デフォルト値の30は、30 パーティション間隔より古いパーティションに制約が適用されることを意味します。constraint_valid:テーブルに制約を追加すると、テーブル内の既存のデータと競合する可能性があり、またpg_partmanのメンテナンス操作に時間がかかる可能性があります。これらの制約を作成時に無効に設定できます。これにより、制約の作成はほぼ瞬時に完了しますが、検証されるまで制約除外は使用できません。したがって、デフォルトでは、制約は有効として作成されます。
この機能は、制約が追加された古いパーティションでのデータ更新を制限します。古いデータを変更し、
pg_partmanがこれらの制約を正しく管理できるようにするには、管理する制約を名前変更しないでください。reapply_constraints_proc()を使用して、制約を一時的に削除できます。constraint_validはサブパーティショニングでは正しく機能しない場合があります。最初のレベルのパーティションでは正常に実行できますが、より深いサブパーティション化されたテーブルセットで有効かどうかは、使用されるパーティション間隔の組み合わせとoptimize_constraintの設定に依存します。例えば、週次パーティションがさらに日次パーティションに細分化され、日次パーティションのoptimize_constraintが 7 日に設定されている場合、期待される効果が得られない可能性があります。週次パーティションの制約は正しく作成できますが、日次サブパーティションには対応する制約が作成されない場合があります。
テンプレートテーブルと属性の継承
PostgreSQL の宣言型パーティショニングは、非パーティションキーのプライマリキーや一意なインデックス、autovacuum 設定など、特定のオブジェクト属性の継承を完全にはサポートしていません。そのため、pg_partman はテンプレートテーブルメカニズムを使用して、新しく作成されたパーティションがこれらの属性を正しく継承できるようにします。以下の表は、pg_partman が特定の属性の継承をどのように管理するかを示しています。表に記載されていない属性は、親テーブルを通じて管理されます。
属性 | 親から継承 | テンプレートから継承 |
非パーティション列のプライマリキー | - | 以降 |
非パーティション列の一意なインデックス | - | 以降 |
非パーティション列の一意なインデックスのテーブルスペース | - | 以降 |
リレーション固有のオプション (autovacuum など) | - | 以降 |
UNLOGGED テーブルステータス* | - | 以降 |
非一意なインデックス | 以降 | - |
権限/所有権 | 以降 | - |
属性:
create_parent()を呼び出すと、pg_partmanは自動的にparent_table_templateという名前のテーブルを作成します。インデックスの追加やautovacuumパラメーターの変更など、このテンプレートテーブルに対して行うALTER TABLE変更は、将来新しいパーティションが作成されるときに適用されます。説明テンプレートテーブルへの変更は、既存のパーティションに遡って適用されません。変更を行うには、古いパーティションに対して手動で
ALTER操作を実行する必要があります。権限と所有権:デフォルトでは、権限と所有権は継承されません。
pg_partmanを通じてこの機能を有効にした場合、この継承はパーティション作成時にのみ行われ、変更後に自動的に適用されないことに注意してください。reapply_privileges()で再適用できます。パーティションに直接アクセスする必要がない限り、通常はこの機能を有効にする必要はありません。必要な場合は、inherit_privilegesオプションを設定できます。説明IDENTITY機能を使用してシーケンスを管理する場合、新しいシーケンス値の自動生成は、親テーブルを通じてデータが挿入された場合にのみサポートされます。パーティションに直接データを挿入する場合はサポートされません。
テンプレートテーブル機能は、宣言型パーティショニングの採用を加速するために設計された一時的なソリューションです。PostgreSQL コア機能が改善されるにつれて、
pg_partmanはテンプレートテーブルの使用を段階的に廃止します。将来、PostgreSQL コアで機能がサポートされるようになると、それはテンプレートテーブルを通じて管理されなくなります。メジャーバージョンにアップグレードする際には、関連する調整を計画する必要があります。REPLICA IDENTITY属性をUSING INDEX句と共に使用して論理レプリケーションをサポートしたい場合、この機能は、必要なインデックスがテンプレートテーブルではなく、実際の親テーブルに作成されている場合にのみサポートされることに注意してください。親テーブルとテンプレートテーブルのREPLICA IDENTITY設定を制御できないため、どちらが正しい ID かを判断することは不可能です。他の ID 継承方法 (FULL および NONE) との一貫性を保つために、ソースとして親テーブルのみを選択することを推奨します。PostgreSQL は、パーティションセットの親テーブル上の
UNLOGGED属性を一貫して処理しません。そのため、pg_partmanはテンプレートテーブルを使用してUNLOGGEDステータスを管理します。ALTERコマンドが実行されると、親テーブルの属性は実際には変更されないため、新しいパーティションは変更前の属性を引き続き使用します。これは、パーティションセットをUNLOGGEDからLOGGEDに変更し、将来のすべてのパーティションにこの変更を継承させることはできないことを意味します。この属性はテンプレートテーブルを通じて管理されるため、テンプレートテーブルの属性を変更すると、新しく作成されたパーティションが変更を継承します。ただし、既存のパーティションは手動で変更する必要があります。詳細については、「Unable to alter partitioned table to set logged」をご参照ください。
運用と管理
自動メンテナンス
pg_partman のコアメンテナンスタスクである新しいパーティションの作成と保持ポリシーの適用は、run_maintenance() 関数または run_maintenance_proc() プロシージャによって実行されます。PolarDB for PostgreSQL (Oracle 互換) では、組み込みのバックグラウンドワーカーを使用してこのプロセスを自動化することを推奨します。設定した間隔で run_maintenance_proc() を自動的に呼び出します。
バックグラウンドワーカーはデフォルトで無効になっています。有効にするには、Quota Center に移動し、クォータ ID polardb_pg_pg_cron を見つけ、[操作] 列で [申請] をクリックしてクォータをリクエストします。
手動メンテナンス
デバッグ中や特定のテーブルをきめ細かく制御する必要がある場合など、手動でメンテナンスをトリガーする必要がある場合があります。
CALL run_maintenance_proc();このプロシージャの使用を推奨します。part_config内でautomatic_maintenanceがonになっているすべてのパーティションセットのメンテナンスを実行します。また、各パーティションセットのメンテナンス後にトランザクションを自動的にコミットするため、ロック競合を軽減します。SELECT run_maintenance('public.my_table');単一のパーティションセットのみをメンテナンスしたい場合は、この関数を呼び出して親テーブル名を渡すことができます。
監視とアラート
本番環境では、パーティションメンテナンスが正常に実行されているかを監視し、パーティションが時間通りに作成されないことによるデータ書き込みの失敗を防ぐ必要があります。part_config テーブルの maintenance_last_run フィールドは、各パーティションセットの最後の成功したメンテナンス実行のタイムスタンプを記録します。これは重要な監視メトリックです。
-- 自動メンテナンスされるすべてのパーティションセットのうち、
-- メンテナンス間隔の 2 倍以上、正常に実行されていないものをクエリします。
SELECT parent_table
FROM part_config
WHERE
automatic_maintenance = 'on'
AND maintenance_last_run < (now() - (SELECT setting::interval * 2 FROM pg_settings WHERE name = 'pg_partman_bgw.interval'));このクエリが何らかの行を返した場合、対応するパーティションセットのメンテナンスが中断された可能性があり、即時の調査が必要です。
リファレンス関数
pg_partman は、一連の関数を通じてそのコア機能を提供します。これらの関数は、その目的に基づいて、作成、移行、メンテナンス、破棄の 4 つの主要なカテゴリに分類されます。
パーティションの作成
これらの関数は、パーティションセットを初期化し、サブパーティションを定義するために使用されます。
create_parent()
この関数はパーティションセットを初期化します。パーティションとして宣言された既存の親テーブルに対して、パーティショニングポリシー、事前作成ルール、およびメンテナンス方法を設定します。実行中は親テーブルに ACCESS EXCLUSIVE ロックをかけます。
この関数に渡されるすべてのオプションは正しく設定する必要があります。すべてのデフォルト、インデックス、制約、権限、所有権を親テーブルに適用して、子テーブルに伝播させる必要があります。一意なインデックスやその他のテーブルプロパティの扱い方については、「テンプレートテーブルと属性の継承」をご参照ください。
デフォルトでは、特に設定しない限り、デフォルトパーティションとテンプレートテーブルが作成されます。
構文
create_parent(
p_parent_table text
, p_control text
, p_interval text
, p_type text DEFAULT 'range'
, p_epoch text DEFAULT 'none'
, p_premake int DEFAULT 4
, p_start_partition text DEFAULT NULL
, p_default_table boolean DEFAULT true
, p_automatic_maintenance text DEFAULT 'on'
, p_constraint_cols text[] DEFAULT NULL
, p_template_table text DEFAULT NULL
, p_jobmon boolean DEFAULT true
, p_date_trunc_interval text DEFAULT NULL
, p_control_not_null boolean DEFAULT true
, p_time_encoder text DEFAULT NULL
, p_time_decoder text DEFAULT NULL
)
RETURNS booleanパラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | パーティションセットの親テーブル。既存のパーティション化されたテーブルである必要があり、スキーマ名を含める必要があります。 |
|
| はい | なし | パーティショニングに使用されるコントロール列。例: 説明 コントロール列が |
|
| はい | なし | パーティション間隔。パラメーター値はテキストとして渡す必要があります。有効な値は次のとおりです。
|
|
| いいえ |
| パーティションタイプ。有効な値は次のとおりです。
|
|
| いいえ |
| パーティションキー列が時間 (エポック) を表す整数である場合に使用します。有効な値は次のとおりです。
説明 すべてのテーブル名は時間に基づきます。コントロール列に通常のインデックスを作成するだけでなく、効率的な操作のために、 |
|
| いいえ |
| 事前に作成するパーティションの数。例えば、日次パーティショニングの場合、 説明 特定の間隔では、うるう年や月の日数の違いなどにより、余分なパーティションが作成されたり、1 つ見逃されたりすることがあります。これは通常問題を引き起こさず、自動的に修正されるはずです。詳細については、「パーティションタイプと間隔」をご参照ください。 |
|
| いいえ |
| システムによる自動決定ではなく、最初のパーティションの開始値 (タイムスタンプまたは整数) を手動で指定できます。有効なタイムスタンプ (時間ベースのパーティショニングの場合) または正の整数 (数値/ID ベースのパーティショニングの場合) の値である必要があります。 説明
|
|
| いいえ |
| どの子パーティションにも属さないデータを受け取るために、パーティションセットにデフォルトパーティションを作成するかどうか。 |
|
| いいえ |
| このパーティションセットがグローバルな
|
|
| いいえ |
| 非パーティションキー列でのクエリパフォーマンスを最適化するために、古いパーティションに追加の |
|
| いいえ |
| テンプレートテーブルを指定します。新しく作成されたパーティションは、インデックスや制約などのプロパティをこのテンプレートから継承します。指定しない場合、自動的に作成されます。 |
|
| いいえ |
| 非標準の時間間隔のパーティション境界を揃えるために使用します。有効な値は、PostgreSQL 組み込みの デフォルトでは、 例えば、9 週間の間隔を設定した場合、デフォルトでは |
|
| いいえ |
| パーティションコントロール列が
|
|
| いいえ |
| パーティションキーが |
|
| いいえ |
| パーティションキーが |
create_sub_parent()
この関数は、既存のパーティションセットにサブパーティションを作成します。これは、既存のパーティションを削除して再構築し、新しい親テーブルに変換する必要があるため、破壊的な操作です。
テーブル名を整理の頼りにする予定がある場合は、サブパーティションセットには短いテーブル名を使用することを推奨します。テーブル名の末尾に追加されるサフィックスは、そのパーティションセットが使用するパーティションタイプに関係なく、常に存在することが保証されます。長いテーブル名を使用すると、元の親テーブル名が切り捨てられ、トップレベルのパーティションサフィックスも切り捨てられる可能性があります。この切り捨ては自動的に行われ、最下位レベルのパーティションサフィックスが保持されるようにします。
最初のレベルのサブパーティショニングでは、最初に
create_parent()に渡したp_parent_tableパラメーター値は、create_sub_parent()に渡す値とまったく同じである必要があります。さらにサブパーティション化するには、create_sub_parent()に異なる値、つまりトップレベルのパーティションセットの子テーブルを渡し始める必要があります。
構文
create_sub_parent(
p_top_parent text
, p_control text
, p_interval text
, p_type text DEFAULT 'range'
, p_default_table boolean DEFAULT true
, p_declarative_check text DEFAULT NULL
, p_constraint_cols text[] DEFAULT NULL
, p_premake int DEFAULT 4
, p_start_partition text DEFAULT NULL
, p_epoch text DEFAULT 'none'
, p_jobmon boolean DEFAULT true
, p_date_trunc_interval text DEFAULT NULL
, p_control_not_null boolean DEFAULT true
, p_time_encoder text DEFAULT NULL
, p_time_decoder text DEFAULT NULL
)
RETURNS boolean
パラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | トップレベルの親テーブルの名前。この関数は、この親テーブルの下にあるすべてのパーティションを新しいサブパーティションの親テーブルに変換します。 |
|
| はい |
| 安全確認フラグ。続行するには |
残りのパラメーター、例えば p_control や p_interval は、create_parent() と同じ機能を持ちますが、サブパーティションのポリシーを定義します。例えば、年単位でパーティショニングされた既存のパーティションセットがあり、各年のパーティションを日単位でパーティショニングしたい場合、この関数を使用できます。
create_partition_time()/create_partition_id()
時間ベースまたは数値/ID ベースのパーティションセットに対して、特定の子パーティションを手動で作成します。これは通常 run_maintenance() によって自動的に呼び出されますが、メンテナンスサイクル外でオンデマンドでパーティションを作成するためにも使用できます。
構文
create_partition_time(
p_parent_table text
, p_partition_times timestamptz[]
, p_start_partition text DEFAULT NULL
)
RETURNS boolean
create_partition_id(
p_parent_table text
, p_partition_ids bigint[]
, p_start_partition text DEFAULT NULL
)
RETURNS booleanパラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | 子パーティションを作成する親テーブル。 |
|
| はい | なし |
パーティションが存在しない場合は作成されます。存在する場合は、既存のパーティションが使用され、関数は正常に終了します。指定された値はパーティションの下限として使用され、パーティションの名前に影響を与えることに注意してください。したがって、指定されたタイムスタンプ値が他のパーティションと一致していることを確認してください。そうしないと、値が重複するギャップが発生する可能性があります。 |
|
| はい | なし |
パーティションが存在しない場合は作成されます。存在する場合は、既存のパーティションが使用され、関数は正常に終了します。指定された値はパーティションの下限として使用され、パーティションの名前に影響を与えることに注意してください。したがって、指定された整数値が他のパーティションと一致していることを確認してください。そうしないと、値が重複するギャップが発生する可能性があります。 |
|
| いいえ |
| サブパーティショニングシナリオで、サブパーティションの開始値を指定するために使用します。 |
データの移行
これらの関数は、既存データや誤ってデフォルトパーティションに入ってしまったデータを正しいパーティションに移行するために使用されます。
partition_data_time()/partition_data_id()
親テーブル、デフォルトパーティション、または指定されたソーステーブルから、対応するパーティションにデータを移行します。ターゲットパーティションが存在しない場合、関数は自動的に作成します。デフォルトテーブルに挿入されたデータを修正することもできます。
大量のデータを自動的にパーティショニングするには、
partition_data_procプロシージャを使用して、より小さなバッチでデータをコミットすることを推奨します。これにより、長時間実行されるトランザクションやデータ量によって引き起こされる問題を効果的に軽減できます。サブパーティションセットの場合、最上位から始めて、データをレイヤーごとにパーティショニングする必要があります。つまり、まずこの関数を実行し、次に
create_sub_parent()を実行して追加のパーティションレベルを作成する必要があります。その後、新しく作成された各サブ親テーブルでこの関数を再度実行する必要があります。
構文
partition_data_time(
p_parent_table text
, p_batch_count int DEFAULT 1
, p_batch_interval interval DEFAULT NULL
, p_lock_wait numeric DEFAULT 0
, p_order text DEFAULT 'ASC'
, p_analyze boolean DEFAULT true
, p_source_table text DEFAULT NULL
, p_ignored_columns text[] DEFAULT NULL
)
RETURNS bigint
partition_data_id(
p_parent_table text
, p_batch_count int DEFAULT 1
, p_batch_interval bigint DEFAULT NULL
, p_lock_wait numeric DEFAULT 0
, p_order text DEFAULT 'ASC'
, p_analyze boolean DEFAULT true
, p_source_table text DEFAULT NULL
, p_ignored_columns text[] DEFAULT NULL
)
RETURNS bigint
パラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | パーティションセットの親テーブル (スキーマ名を含める必要があります)。 |
|
| いいえ |
| 1 回の関数呼び出しで処理するバッチの数。 |
|
| いいえ |
| 各バッチで移行するデータ間隔のサイズ。指定しない場合、パーティションテーブル自体の間隔が使用されます。 重要 デフォルトテーブルからデータを移動する場合、この値はパーティション間隔より小さくしてはいけません。パーティションセットの一部ではないデフォルトテーブルソースからデータを移動する場合、この間隔をパーティション間隔より小さく設定して、長時間実行されるトランザクションで大量のデータを移動するのを避けることができます。 |
|
| いいえ |
| 行ロックを待機する秒数。 |
|
| いいえ |
| データ移行の順序。
|
|
| いいえ |
| 新しいパーティションを作成した後に親テーブルで |
|
| いいえ |
| パーティションセットにデータを移動するソーステーブルを指定します。指定しない場合、データはデフォルトパーティションから移行されます。 |
|
| いいえ |
| データ移行中に無視する列名の配列。これは主に |
partition_data_proc()
この関数は、partition_data_* 関数を独立したトランザクションバッチでループ呼び出しするストアドプロシージャです。大量のデータを移行する際に、長時間実行されるトランザクションやロック競合を避けるために、このプロシージャを使用することを推奨します。
構文
partition_data_proc (
p_parent_table text
, p_loop_count int DEFAULT NULL
, p_interval text DEFAULT NULL
, p_lock_wait int DEFAULT 0
, p_lock_wait_tries int DEFAULT 10
, p_wait int DEFAULT 1
, p_order text DEFAULT 'ASC'
, p_source_table text DEFAULT NULL
, p_ignored_columns text[] DEFAULT NULL
, p_quiet boolean DEFAULT false
)パラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | パーティションセットの親テーブル。 |
|
| いいえ |
| ループする回数。設定しない場合、ソーステーブルのすべてのデータが処理されます。 |
|
| いいえ |
| 基になる関数に |
|
| いいえ |
| 行ロックを待機する秒数。 |
|
| いいえ |
| ロックを取得しようとする回数。 |
|
| いいえ |
| 書き込み負荷を軽減するために、各バッチコミット後に一時停止する秒数。 |
|
| いいえ |
| データ移行の順序。
|
|
| いいえ |
| データソーステーブル。 |
|
| いいえ |
| データ移行中に無視する列。 |
|
| いいえ |
| プロシージャは値を返せないため、デフォルトでは進捗状況を示すために |
パーティションのメンテナンス
これらの関数は、日常的なパーティション管理、監視、および情報クエリに使用されます。
run_maintenance()
pg_partman のコアメンテナンス関数であり、cron またはバックグラウンドワーカーを使用して定期的に呼び出す必要があります。新しいパーティションの自動作成とデータ保持ポリシーの適用を担当します。
構文
run_maintenance(
p_parent_table text DEFAULT NULL
, p_analyze boolean DEFAULT false
)
RETURNS voidパラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| いいえ |
| メンテナンスするパーティションセット。
|
|
| いいえ |
| 新しいパーティションを作成した後に親テーブルで 大規模なパーティションセットの場合、 |
run_maintenance_proc()
run_maintenance() のプロシージャ版です。各パーティションセットのメンテナンスに独立したトランザクションを使用するため、多数のパーティションセットを管理する際に長時間実行されるトランザクションによるロック競合を軽減できます。バックグラウンドワーカーはこのプロシージャを使用しません。標準の run_maintenance() 関数を使用します。
構文
run_maintenance_proc(
p_wait int DEFAULT 0
, p_analyze boolean DEFAULT NULL
)パラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| いいえ |
| 各パーティションセットのメンテナンス間に待機する秒数。 |
|
| いいえ |
|
|
check_default()
pg_partman が管理するすべてのデフォルトパーティションにデータが存在するかどうかをチェックし、データを含むデフォルトテーブルとその行数を返します。これは、パーティショニングが正しく機能しているかを監視するための重要な手段です。partition_data_time() と partition_data_id() を使用して、これらの親/デフォルトテーブルから正しいパーティションにデータを移動できます。
構文
check_default(
p_exact_count boolean DEFAULT true
)パラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| いいえ |
| 正確な行数を返すかどうか。 |
show_partitions()
指定されたパーティションセットのすべてのパーティションを一覧表示します。
テーブルは、名前のネイティブなソート順ではなく、パーティション間隔の論理的な順序で返されます。
構文
show_partitions(
p_parent_table text
, p_order text DEFAULT 'ASC'
, p_include_default boolean DEFAULT false
)
RETURNS TABLE (
partition_schemaname text
, partition_tablename text
)パラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | パーティションセットの親テーブル。 |
|
| いいえ |
| 結果のソート順。
|
|
| いいえ |
| 結果にデフォルトパーティションを含めるかどうか。 |
show_partition_name()
指定された値が属するべき子パーティションの名前を返します。パーティションが実際に存在するかどうかは関係ありません。
構文
show_partition_name(
p_parent_table text
, p_value text
, OUT partition_schema text
, OUT partition_table text
, OUT suffix_timestamp timestamptz
, OUT suffix_id bigint
, OUT table_exists boolean
)
RETURNS recordパラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | パーティションセットの親テーブル。 |
|
| はい | なし | それが属するパーティションを決定するために使用される時間または数値/ID 値 (テキストとして渡されます)。 説明 エポックタイムパーティショニングを使用している場合、整数エポック値ではなくタイムスタンプ値を指定してください。 |
|
| - | - | パーティションスキーマ名。 |
|
| - | - | パーティション名。 |
|
| - | - | パーティション名のサフィックス。 |
|
| - | - | パーティションが実際に存在するかどうか。 |
show_partition_info()
指定されたパーティション名について、その境界値に関する情報を返します。
構文
show_partition_info(
p_child_table text
, p_partition_interval text DEFAULT NULL
, p_parent_table text DEFAULT NULL
, OUT child_start_time timestamptz
, OUT child_end_time timestamptz
, OUT child_start_id bigint
, OUT child_end_id bigint
, OUT suffix text
)
RETURNS recordパラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | パーティションの名前 (スキーマ名を含める必要があります)。 |
|
| いいえ |
| 境界を計算するためのパーティション間隔を指定します。指定しない場合、 |
|
| いいえ |
| 内部クエリを最適化するために親テーブル名を指定します。 |
|
| - | - | パーティションセットが時間ベースの場合、関数はこれらの出力パラメーターの値を返します。それ以外の場合は NULL を返します。 説明 開始値 ( |
|
| - | - | パーティションセットが整数ベースの場合、関数はこれらの出力パラメーターの値を返します。それ以外の場合は NULL を返します。 説明 開始値 ( |
|
| - | - | パーティション名に追加される、その内容を識別するテキスト部分を出力します。 |
apply_constraints()/drop_constraints()/reapply_constraints_proc()
part_config の constraint_cols 列で定義された追加の CHECK 制約を管理します。
apply_constraints():指定されたパーティションセットのパーティションに制約を適用します。すべての制約名はpartmanconstr_で始まります。説明カスタム制約を維持するためにこの関数を手動で呼び出す必要はありません。古いパーティションへの制約の追加は、新しいパーティションが作成されるときに自動的に管理されます。
パーティションに
pg_partman制約が既に存在する場合、関数は既存の制をスキップして重複作成を回避します。指定されたすべての列が NULL の場合、制約は作成されません。
パーティションパラメーターが指定されている場合、制約はそのパーティションにのみ適用されます。
パーティションパラメーターが指定されていない場合、制約は
optimize_constraint値より古い最後のパーティションに適用されます。例えば、optimize_constraintが 30 の場合、パーティションの事前作成が最新であれば、制約は現在のパーティションより 31 番目のパーティションに適用されます。すべての古いパーティションに制約を適用するには、
reapply_constraints_procプロシージャを使用します。この方法には、最小限のパフォーマンスへの影響で制約の適用を簡素化するオプションがあります。p_job_idは内部使用向けで、この関数を呼び出した元のジョブにログをマージできます。
apply_constraints( p_parent_table text , p_child_table text DEFAULT NULL , p_analyze boolean DEFAULT FALSE , p_job_id bigint DEFAULT NULL ) RETURNS voiddrop_constraints():part_configで設定された列に対してpg_partmanが作成した制約を削除します。これにより、古いデータを編集する必要があり、制約がそれを許可しない場合に、制約を簡単にクリーンアップできます。説明指定されたパーティションと設定された列で、
partmanconstr_*で始まる制約のみを削除します。すべてのパーティションの制約を削除するには、
reapply_constraints_procプロシージャを使用します。この方法には、最小限のパフォーマンスへの影響で制約の削除を簡素化するオプションがあります。p_debugパラメーターは、使用される制約削除ステートメントを表示します。
drop_constraints( p_parent_table text , p_child_table text , p_debug boolean DEFAULT false ) RETURNS voidreapply_constraints_proc():すべてのパーティションに制約を一括で適用または削除し、ロック競合を避けるためにバッチでコミットします。reapply_constraints_proc( p_parent_table text , p_drop_constraints boolean DEFAULT false , p_apply_constraints boolean DEFAULT false , p_wait int DEFAULT 0 , p_dryrun boolean DEFAULT false )
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | 作成されたパーティションセットの親テーブル。 |
|
| いいえ |
|
|
|
| いいえ |
|
|
|
| いいえ |
| テーブルに制約の削除または追加を適用した後、次のテーブルに進む前に待機する秒数。 |
|
| いいえ |
| 実際に制約の削除/適用コマンドを実行せずにこのプロシージャを実行します。コマンドが実行されるテーブルを |
その他のメンテナンス関数
dump_partitioned_table_definition():パーティションセットの設定を再構築するためのcreate_parent()文と、part_configに保存されている追加パラメーターを設定するためのUPDATE文を生成します。説明現在、この関数は単一レベルのパーティションセットのみをサポートしています。
p_ignore_templateによって生成された SQL は、実行前にテンプレートテーブルが作成されている必要があります。テンプレートテーブルに変更を加えていない場合は、ここでtrueを渡しても安全です。生成された SQL はpg_partmanに新しいテンプレートテーブルを生成するように指示します。ただし、安全のため、pg_dumpを使用してテンプレートテーブルをエクスポートし、生成された SQL を使用する前に復元して、テンプレートのオーバーライド設定を保持することを推奨します。
dump_partitioned_table_definition( p_parent_table text, p_ignore_template_table boolean DEFAULT false ) RETURNS textpartition_gap_fill():パーティションシーケンスに存在する可能性のあるギャップをチェックして埋めます。現在の最小パーティションから始めて、パーティション間隔に基づいて遭遇したギャップを、現在の最大パーティションまで埋めます。作成されたパーティションの数を返します。パーティションが作成されなかった場合は 0 を返します。partition_gap_fill( p_parent_table text ) RETURNS integerreapply_privileges():親テーブルの所有権と権限をすべてのパーティションに再適用します。説明親テーブルが所有する権限はすべてのパーティションに付与されます。親テーブルが所有しない権限は取り消されます (
CASCADE)。チェックされる権限は、
SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、およびTRIGGERです。大規模なパーティションセットの場合、これは非常に時間のかかる操作になる可能性があるため、スタンドアロン関数として設計されています。この関数は、親テーブルと異なる権限のみを適用しますが、それでも各子パーティションとその個々のすべての権限についてシステムカタログの検索と比較が必要です。
reapply_privileges( p_parent_table text ) RETURNS voidstop_sub_partition():親パーティションのメンテナンスを維持しながら、サブパーティションセットの自動メンテナンスを停止します。デフォルトでは、パーティションでもあるパーティションを元に戻しても、その親パーティションセットも元に戻さない限り、その親パーティションセットの他のパーティションがサブパーティション化され続けるのを防ぐことはできません。親テーブルを削除したくないが、サブパーティションの作成を続けたくないというこの状況に対処するために、この関数を使用できます。説明この関数は、
part_config_subテーブルから親テーブルのエントリのみを削除します。stop_sub_partition( p_parent_table text ) RETURNS boolean
パーティションの破棄
これらの関数は、パーティション構造を元に戻したり、保持ポリシーに従って古いパーティションを削除したりするために使用されます。
undo_partition()
パーティションセットのすべてのパーティションから単一のターゲットテーブルにデータを移動し、パーティション構造を削除します。これはデータ移動操作なので、注意して使用してください。
この関数が実行されると、設定テーブルの
undo_in_progress列がtrueに設定されます。これにより、すべてのパーティション作成と保持管理が停止します。デフォルトでは、パーティションはドロップ (
DROP) されず、デタッチ (DETACH) されます。これにより、元のパーティションは空のスタンドアロンテーブルになります。バッチパラメーターが手動で設定されていない場合、関数の各実行で 1 つのパーティションからターゲットテーブルにすべてのデータが移動されます。
すべてのパーティションがデタッチまたはドロップされると、設定データは
pg_partmanから自動的に削除されます。サブパーティション化されたテーブルの場合、最下位レベルの親テーブルから元に戻す操作を開始し、レイヤーごとに上に進む必要があります。
構文
undo_partition(
p_parent_table text
, p_target_table text
, p_loop_count int DEFAULT 1
, p_batch_interval text DEFAULT NULL
, p_keep_table boolean DEFAULT true
, p_lock_wait numeric DEFAULT 0
, p_ignored_columns text[] DEFAULT NULL
, p_drop_cascade boolean DEFAULT false
, OUT partitions_undone int
, OUT rows_undone bigint)
RETURNS record
パラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | パーティションセットの親テーブル。スキーマ名を含め、 |
|
| はい | なし | 古いパーティションテーブルからデータを受け取るスキーマ名を持つテーブル。 |
| int | いいえ |
| 1 回の呼び出しで処理するバッチの数。 |
|
| いいえ |
| 各バッチで移動するデータ間隔のサイズ。非常に大きなパーティションをより小さなコミットバッチに分割するために、パーティション間隔より小さく設定できます。指定しない場合、または指定された間隔がパーティション間隔より大きい場合、設定されたパーティション間隔が使用されます。このパラメーターの値はテキストとして渡す必要があることに注意してください。 |
|
| いいえ |
| データ移行後に空のパーティションを保持するかドロップするか。
説明 パーティションセットからテーブルを実際に削除するには、少なくとも 2 つのバッチが必要です。 |
|
| いいえ |
| タイムアウトする前にテーブルまたは行のロックが解除されるのを待つ秒数。値 0 は無期限に待機することを意味します。 |
|
| いいえ |
| このオプションを使用すると、パーティションからターゲットテーブルにデータを移動する際に特定の列を除外できます。これは通常、 |
|
| いいえ |
| サブパーティションをカスケードドロップするかどうか。 説明 カスケードドロップにより、親テーブルがドロップされると、すべてのサブパーティションテーブルがドロップされます。 |
undo_partition_proc()
undo_partition() のプロシージャ版です。大量のデータを含むパーティションを元に戻す際に、バッチでコミットし、長時間実行されるトランザクションを避けるために、このプロシージャを使用することを推奨します。
構文
undo_partition_proc(
p_parent_table text
, p_target_table text DEFAULT NULL
, p_loop_count int DEFAULT NULL
, p_interval text DEFAULT NULL
, p_keep_table boolean DEFAULT true
, p_lock_wait int DEFAULT 0
, p_lock_wait_tries int DEFAULT 10
, p_wait int DEFAULT 1
, p_ignored_columns text[] DEFAULT NULL
, p_drop_cascade boolean DEFAULT false
, p_quiet boolean DEFAULT false
)パラメーター
そのパラメーターは undo_partition() と似ていますが、バッチ処理の動作を制御するための追加パラメーターがいくつかあります。
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| いいえ |
|
|
|
| いいえ |
| プロシージャが |
|
| いいえ |
| 書き込み負荷を軽減するために、プロシージャが各コミット (バッチ) 間に指定された秒数だけ一時停止するようにします。 |
|
| いいえ |
| サブプロシージャは値を返せないため、デフォルトでは進捗状況を示すために |
drop_partition_time()/drop_partition_id()
保持ポリシーに基づいて、古いテーブルの削除またはデタッチを手動でトリガーします。デフォルトでは、古いテーブルは実際に削除されるのではなく、デタッチされるだけです。この関数を直接呼び出すのではなく、設定された保持ポリシーを持つ run_maintenance() 関数を使用して古いテーブルを自動的に削除することを推奨します。
構文
drop_partition_time(
p_parent_table text
, p_retention interval DEFAULT NULL
, p_keep_table boolean DEFAULT NULL
, p_keep_index boolean DEFAULT NULL
, p_retention_schema text DEFAULT NULL
, p_reference_timestamp timestamptz DEFAULT CURRENT_TIMESTAMP
)
RETURNS int
drop_partition_id(
p_parent_table text
, p_retention bigint DEFAULT NULL
, p_keep_table boolean DEFAULT NULL
, p_keep_index boolean DEFAULT NULL
, p_retention_schema text DEFAULT NULL
)
RETURNS intパラメーター
パラメーター | 型 | 必須 | デフォルト | 説明 |
|
| はい | なし | パーティションセットの親テーブル。 |
|
| いいえ |
| 保持ポリシーを手動で指定します。指定しない場合、 |
|
| いいえ |
| 継承を解除する際にテーブルを保持するかドロップするか。
|
|
| いいえ |
| パーティションの継承を解除する際にインデックスを保持するかドロップするか。
|
|
| いいえ |
| 期限切れのテーブルをドロップする代わりに、アーカイブのためにこのスキーマに移動します。 |
|
| いいえ |
| (時間ベースのパーティショニングのみ) どのパーティションが影響を受けるかを決定するために、異なる参照タイムスタンプを指定します。 |
設定テーブル
pg_partman のすべての動作は、2 つのコア設定テーブルによって駆動されます。create_parent() または create_sub_parent() 関数を使用してパーティションセットを作成すると、対応する設定が自動的にこれらのテーブルに挿入されます。これらのテーブルのレコードを直接変更して、パーティションセットの動作を動的に調整することもできます。
part_config
このテーブルは pg_partman の主要な設定センターであり、すべてのトップレベルの親テーブルのパーティショニングポリシーとメンテナンス設定を保存します。
設定項目 (列名) | データ型 | デフォルト値 | 説明 |
|
| なし | パーティションセットの親テーブルの名前。 |
|
| なし | パーティショニングの基準として使用されるコントロール列の名前。時間または整数型の列である必要があります。 |
|
| なし | パーティション間隔。時間ベースのパーティショニングの場合、 |
|
|
| パーティションタイプ。現在 |
|
|
| 事前に作成するパーティションの数。現在のパーティションに加えて、この数だけ将来のパーティションが常に維持されることを意味します。 |
|
|
| このパーティションセットがグローバルな |
|
| なし | 新しいパーティションのテンプレートテーブル。新しく作成されたパーティションは、インデックス、制約、および親テーブルから継承できないその他の属性をこのテンプレートから継承します。 |
|
|
| データ保持ポリシー。時間ベースのパーティショニングの場合、 |
|
|
| 古いパーティションが期限切れになったとき、削除する代わりにアーカイブのためにこの指定されたスキーマに移動します。このオプションは |
|
|
| 期限切れのパーティションの処理方法を制御します。
|
|
|
| デタッチされるときにテーブル上のインデックスを保持するかどうかを制御します。
|
|
|
| デタッチされたテーブルを元の論理レプリケーションのパブリケーションに保持するかどうかを制御します。
|
|
|
| パーティションキー列が時間 (エポック) を表す整数である場合に使用します。
|
|
|
| 列名の配列。 |
|
|
|
|
|
|
|
|
|
|
| 新しいデータが書き込まれなくても新しい時間パーティションを作成し続けるかどうか。
|
|
| なし | パーティション名のサフィックスを生成するために使用される日時フォーマット文字列 (例: |
|
|
| 親テーブルの権限と所有権をすべてのパーティションに継承するかどうか。パーティションに直接アクセスする必要がある場合にのみ有効にします。
|
|
|
| メンテナンスタスクが新しいパーティションを作成するかどうかを決定する際に、デフォルトパーティションのデータを無視するかどうか。問題を修正するために一時的にこれを |
|
|
|
|
|
|
| メンテナンス実行時にリフレッシュする論理レプリケーションサブスクリプションの名前。パーティションセットがテーブルを追加/削除するパブリケーションをサブスクライブしており、パーティションセットがこれらの変更を認識する必要がある場合は、このオプションを使用してサブスクリプション名を指定する必要があります。そうしないと、他の方法でリフレッシュされない限り、サブスクリプションはパブリッシャーによって追加された新しいテーブルを認識しません。詳細については、「ALTER SUBSCRIPTION」をご参照ください。 |
|
|
| サブパーティションセットが完全に作成されたかどうかをマークします。多くのサブパーティションセットがある場合、これにより |
|
|
|
|
|
|
| このパーティションセットの最後の成功したメンテナンス実行のタイムスタンプを記録します。これは、パーティションメンテナンスが正常に実行されていることを確認するための監視メトリックとして使用できます。 |
part_config_sub
このテーブルはサブパーティションの設定を保存します。その構造は基本的に part_config と同じですが、1 つの重要な違いがあります。それは、sub_parent 列を使用して直属の親テーブルを識別することです。
sub_parent(text):サブパーティションセットの親テーブルの名前。このテーブル自体がトップレベルの親テーブルのパーティションです。その他の列:
partition_interval、retention、premakeなど、テーブル内の他のすべての列はpart_configと同じ意味を持ちますが、そのスコープは現在のサブパーティションセットです。
すべての列の定義を確認する必要はありません。基本的に、pg_partman がサブパーティションセットをメンテナンスするときは、sub_parent をキーとして part_config_sub テーブルの設定行を検索し、その行で定義されたポリシーを適用します。