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_run を false に設定してロギングを無効にするよう依頼することもできます。
例:
失敗したすべてのジョブの詳細を表示する:
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 を自動的に生成します。jobidはcron.jobテーブルで確認できます。例:
ID 21 のジョブのスケジュールを解除する:
SELECT cron.unschedule(21);
関連ドキュメント
pg_cron の詳細については、GitHub の pg_cron リポジトリをご参照ください。
ご利用のインスタンスが RDS for PostgreSQL インスタンスの場合は、「スケジュールされたジョブ (pg_cron)」をご参照ください。