すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:pg_cron

最終更新日:Dec 19, 2025

AnalyticDB for PostgreSQL では、pg_cron 拡張機能を使用して、特定の時間にジョブをスケジュールできます。この機能は、データ更新、バックアップ、期限切れデータのクリーンアップなどの定期的なタスクを自動化するのに最適です。この自動化により、タスクが確実にスケジュールどおりに実行されるため、時間と労力が節約され、システムの効率と管理が向上します。

仕組み

pg_cron は cron ベースのジョブスケジューラであり、標準の cron 構文を使用して、データベースから直接 PostgreSQL コマンドを実行できます。

スケジュールされたジョブは、主に 2 つの部分で構成されます:

  • コマンド:実行するタスク (例:VACUUM)。

  • スケジュール:タスクを実行する時間 (例:1 分ごと)。

    スケジュールは標準の cron 構文を使用します:

     ┌───────────── 分 (0 - 59)
     │ ┌────────────── 時 (0 - 23)
     │ │ ┌─────────────── 日 (1 - 31)
     │ │ │ ┌──────────────── 月 (1 - 12)
     │ │ │ │ ┌───────────────── 曜日 (0 - 6、0 は日曜日)
     │ │ │ │ │
     │ │ │ │ │
     │ │ │ │ │
     * * * * *
    • *:任意の値を表します。

    • 特定の数値:この時間のみ実行します。

    • ,:複数の値を区切ります。

    • -:値の範囲を定義します。

    • /:ステップ値を指定します。

    スケジュールの作成またはプレビューについては、Crontab.guru をご参照ください。

    例:

    • 毎週土曜日の午前 3:30 (GMT):

      30 3 * * 6
    • 毎月 1 日と 30 日の午前 1:45 (GMT):

      45 1 1,30 * *
    • 毎週平日 (月曜日から金曜日) の午前 3:00 (GMT):

      00 3 * * 1-5
    • 午前 8:00 から午後 8:00 (GMT) まで、2 時間ごとの正時:

      0 8-20/2 * * *

注意事項

  • スケジュールされたジョブは、協定世界時 (UTC) と同等のグリニッジ標準時 (GMT) で実行されます。ジョブをスケジュールする際は、ローカルタイムを GMT に変換してください。

  • スケジュールされたすべてのジョブは、デフォルトの postgres データベースに保存され、そこからクエリを実行する必要があります。

  • ご利用のインスタンスのバージョンが v6.3.6.0 (AnalyticDB for PostgreSQL V6.0 の場合)、v7.0.3.0 (AnalyticDB for PostgreSQL V7.0 の場合)、または v2.0.0.1 (AnalyticDB for PostgreSQL Serverless mode の場合) より前の場合、このトピックで説明されている一部の機能が利用できないことがあります。すべての機能を使用するには、インスタンスのマイナーバージョンを更新してください。手順については、「マイナーエンジンバージョンのアップグレード」をご参照ください。

拡張機能のインストールまたはアンインストール

拡張機能のインストール

AnalyticDB for PostgreSQL は、インスタンスの作成時にデフォルトで pg_cron 拡張機能をインストールします。手動でインストールする必要はありません。

拡張機能のアンインストール

pg_cron 拡張機能はカーネルに依存しているため、削除できません。

ジョブのスケジュール

ジョブのスケジュール

構文:

SELECT cron.schedule('<schedule>', '<command>');

例:

  • 毎週土曜日の午前 3:30 (GMT) に期限切れのデータを削除する:

    SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
  • 毎日午前 10:00 (GMT) に test() 関数を実行する:

    SELECT cron.schedule('0 10 * * *', 'select test()');
  • 指定された SQL 文を 1 分ごとに実行する:

    SELECT cron.schedule('* * * * *', 'select 1');
  • 毎月 1 日と 30 日、および毎週土曜日と日曜日の午前 2:30 (GMT) に VACUUM FULL を実行する:

    SELECT cron.schedule('30 2 1,30 * 6,0', 'VACUUM FULL');

ジョブ名の指定

スケジュールされたジョブに名前を割り当てることができます。構文は次のとおりです:

SELECT cron.schedule('<job_name>', '<schedule>', '<command>');

例:

  • スケジュールされたジョブ名を「Delete Expired Data」に設定する:

    SELECT cron.schedule('Delete Expired Data','30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
  • スケジュールされたジョブ名を「Select Per Minute」に設定する:

    SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1');
  • スケジュールされたジョブ名を「Do Vacuum」に設定する:

    SELECT cron.schedule('Do Vacuum', '0 23 * * *' , 'VACUUM FULL');

ジョブのデータベースを指定する

1.4 より前のバージョンの pg_cron では、ジョブは拡張機能がインストールされているデータベースでのみ実行できました。他のデータベースでジョブを実行するには、cron.job テーブルを直接操作する必要があり、不便で安全ではありませんでした。

pg_cron バージョン 1.4 では、スケジュールされたジョブを実行するデータベースとデータベースアカウントを指定できます。構文は次のとおりです:

SELECT cron.schedule('<job_name>', '<schedule>', '<command>', '<database>', '<username>', '<active>');
  • '<database>':ジョブが実行されるデータベース。指定しない場合、デフォルトで postgres データベースになります。

  • '<username>:ジョブを実行するデータベースアカウント。指定しない場合、デフォルトで現在のアカウントになります。

  • '<active>':スケジュールされたジョブが有効かどうかを指定します。デフォルト値は true です。

例:

  • dw データベースで毎日午後 11:00 (GMT) に VACUUM を実行する:

    SELECT cron.schedule('Do Vacuum', '0 23 * * *' , 'VACUUM FULL', 'dw');
  • dw データベースで、ユーザー gp1234 として指定された SQL 文を 1 分ごとに実行する:

    SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1', 'dw', 'gp1234');
  • dw データベースで、ユーザー user1 として毎日午前 10:00 (GMT) に test() 関数を実行する:

    SELECT cron.schedule('DO Function', '0 10 * * *', 'select test()', 'dw', 'user1', true);

スケジュールされたジョブの更新

cron.alter_job 関数を使用して、スケジュールされたジョブを更新します。構文は次のとおりです:

SELECT cron.alter_job(<job_id>, '<schedule>', '<command>', '<database>', '<username>', '<active>');
  • <job_id>:必須。これはジョブの自動生成された ID で、cron.job テーブルで確認できます。

  • その他のパラメーター:任意。オプションのパラメーターに値を指定しない場合、その値は変更されません。

例:

  • ID 3 のジョブのスケジュールを毎日午前 11:00 (GMT) に実行するように変更する:

    SELECT cron.alter_job(3, '0 11 * * *');
  • ID 1 のジョブのコマンドを VACUUM に変更する:

    SELECT cron.alter_job(1, null , 'VACUUM');
  • ID 2 のジョブのユーザーを gp1234 に変更する:

    SELECT cron.alter_job(2, null , null, null, 'gp1234');

ジョブ実行詳細の表示

cron.job_run_details テーブルには、各ジョブ実行の詳細が記録されます。

説明

スケジュールされたジョブが多い場合、cron.job_run_details テーブルが非常に大きくなる可能性があります。このテーブルを定期的にクリーンアップするジョブをスケジュールしてください。ジョブ実行の詳細を記録する必要がない場合は、し、チケットを起票、テクニカルサポートに cron.log_runfalse に設定してロギングを無効にするよう依頼することもできます。

例:

  • 失敗したすべてのジョブの詳細を表示する:

    SELECT * FROM cron.job_run_details WHERE status = 'failed';
  • ID 1 のジョブの実行詳細を表示する:

    SELECT * FROM cron.job_run_details WHERE jobid = '1';

スケジュールされたジョブのリストの表示

例:

SELECT * FROM cron.job;

ジョブのスケジュール解除

  • ジョブ名でジョブのスケジュールを解除します。構文は次のとおりです:

    SELECT cron.unschedule('<job_name>');
    重要

    pg_cron では、重複した名前のジョブを作成できます。複数のジョブに適用される名前でジョブのスケジュールを解除すると、pg_cron は最も小さい jobid を持つジョブのみを削除します。

    例:

    「Do Vacuum」という名前のジョブのスケジュールを解除する:

    SELECT cron.unschedule('Do Vacuum');
  • ID でジョブのスケジュールを解除します。構文は次のとおりです:

    SELECT cron.unschedule(<job_id>);

    pg_cron は、ジョブの作成時にジョブ ID を自動的に生成します。jobidcron.job テーブルで確認できます。

    例:

    ID 21 のジョブのスケジュールを解除する:

    SELECT cron.unschedule(21);

関連ドキュメント