ApsaraDB RDS for PostgreSQL は、cron と同じ構文およびタスクスケジューリングの仕組みを持つ pg_cron 拡張機能をサポートしています。この拡張機能を使用すると、SQL コマンドを実行してデータベース内でスケジュールされたタスクを設定できます。
概要
pg_cron は、cron と同じ構文を使用する cron ベースのスケジューラです。SQL コマンドを実行してスケジュールされたタスクを設定できます。詳細については、「pg_cron」をご参照ください。
スケジュールされたタスクは、スケジュールとアクションで構成されます。このセクションでは、スケジュールされたタスクを例に、この 2 つの部分について説明します。このスケジュールされたタスクは、次のコマンドを実行して設定します。SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
-
スケジュール
この部分では、pg_cron 拡張機能がタスクを実行するスケジュールを指定します。標準の cron 式と同じ構文でスケジュールを指定できます。この構文では、フィールド内のアスタリスク ([*]) ワイルドカードはタスクがそのフィールドで指定された任意の時点で実行されることを示し、フィールド内の数値はタスクがこの値で指定された時点でのみ実行されることを示します。サンプルのスケジュールされたタスクでは、スケジュールは
30 3 * * 6であり、タスクが毎週土曜日の 03:30:00 (UTC) に実行されることを指定しています。┌───────────── 分: 0~59 │ ┌────────────── 時: 0~23 │ │ ┌─────────────── 日: 1~31 │ │ │ ┌──────────────── 月: 1~12 │ │ │ │ ┌───────────────── 曜日: 0~6 (値 0 は日曜日を示します) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * *pg_cron のスケジュールされたタスクのスケジュールは、crontab.guru で作成および解析できます。
-
アクション
この部分では、タスクとして実行するアクションを指定します。サンプルのスケジュールされたタスクでは、アクションは
$$DELETE FROM events WHERE event_time < now() - interval '1 week'$$で、events という名前のテーブルから期限切れのデータを削除することを指定しています。
前提条件
-
RDS インスタンスは、PostgreSQL 10 以降を実行している必要があります。
-
RDS インスタンスは、マイナーエンジンバージョン 20250430 以降を実行している必要があります。
重要この拡張機能は、20250430 より前の一部のマイナーエンジンバージョンでサポートされています。ただし、ApsaraDB RDS では、拡張機能管理の標準化と脆弱性に対するセキュリティ強化のため、マイナーエンジンバージョンの更新でサポート対象の拡張機能を最適化する予定です。そのため、20250430 より前のマイナーエンジンバージョンを実行している RDS インスタンスでは、この拡張機能を作成できません。詳細については、「RDS for PostgreSQLの拡張機能作成に関する制限事項」をご参照ください。
-
20250430 より前のマイナーエンジンバージョンを実行している RDS インスタンスでこの拡張機能をすでに作成している場合は、この拡張機能を引き続き使用できます。
-
初めてこの拡張機能を作成する場合、または RDS インスタンスでこの拡張機能を再作成する必要がある場合は、RDS インスタンスのマイナーエンジンバージョンを最新バージョンに更新する必要があります。詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
-
-
特権アカウントが作成されている必要があります。詳細については、「アカウントの作成」をご参照ください。
注意事項
-
スケジュールされたタスクのスケジュールで指定された時刻は、デフォルトで UTC です。必要に応じて、データベースの TIMEZONE パラメータに基づいて時刻を変換してください。スケジュールされたタスクがトリガーされない場合は、次のコマンドを実行して、毎分実行されるタスクを設定し、拡張機能が正常に動作するかどうかを確認してください。
SELECT cron.schedule('* * * * *', 'SELECT 1;'); -
設定したスケジュールされたタスクは、postgres という名前のデフォルトデータベースに保存されます。これらのスケジュールされたタスクは、他のデータベースからクエリできます。
-
pg_cron拡張機能は、cron.database_nameパラメーターで指定されたデータベースにインストールされます。このパラメーターのデフォルト値はpostgresです。pg_cron拡張機能を別のデータベースにインストールする場合は、cron.database_nameパラメーターの値を変更します。 詳細については、「インスタンスパラメーターの設定」をご参照ください。pg_cron拡張機能をインストールすると、インスタンスが再起動されます。 拡張機能はオフピーク時間にインストールしてください。 -
従来の pg_cron 拡張機能は、PostgreSQL 10、PostgreSQL 11、または PostgreSQL 12 を実行し、20201130 より前のマイナーエンジンバージョンを使用する RDS インスタンスでサポートされています。ただし、アップグレードされたバージョンの pg_cron を使用するには、RDS インスタンスのマイナーエンジンバージョンを最新バージョンに更新することを推奨します。詳細については、「マイナーエンジンバージョンの更新」をご参照ください。マイナーエンジンバージョンの更新前に pg_cron を使用していた場合は、pg_cron を再作成して新機能を利用してください。拡張機能を再作成すると、pg_cron を使用して設定したスケジュールされたタスクは失われますのでご注意ください。
-
pg_cron 拡張機能を作成または削除するには、特権アカウントを使用する必要があります。特権アカウントの作成方法の詳細については、「アカウントの作成」をご参照ください。
拡張機能の使用方法
pg_cron でサポートされているコマンドは、cron.database_name パラメーターで指定されたデータベースでのみ実行できます。デフォルト値は postgres です。pg_cron の使用方法の詳細については、「pg_cron」をご参照ください。
-
拡張機能の作成
-
拡張機能管理機能による拡張機能のインストール
-
ApsaraDB RDS コンソールにログインし、インスタンス ページに移動します。上部のナビゲーションバーで、対象の RDS インスタンスが所在するリージョンを選択します。次に、対象の RDS インスタンスを見つけて、インスタンス ID をクリックします。
-
左側のナビゲーションペインで、[プラグイン] をクリックします。
-
表示されたページで、[拡張機能の管理] タブ、次に [未インストールの拡張機能] タブをクリックします。次に、pg_cron 拡張機能を検索し、拡張機能をインストールするデータベースを選択して、[操作] 列の [インストール] をクリックします。
-
表示されたダイアログボックスで、特権アカウントを選択し、[OK] をクリックして、必要なデータベースに拡張機能をインストールします。
拡張機能のインストール中、RDS インスタンスのステータスは[インスタンスのメンテナンス中]に変更されます。 RDS インスタンスのステータスが[実行中]に変更されると、拡張機能のインストールは完了です。
-
-
SQL ステートメントの実行による拡張機能のインストール
-
ApsaraDB RDS コンソールで、必要なパラメーターを変更して、shared_preload_libraries パラメーターの [実行中の値] に pg_cron を追加します。 たとえば、このパラメーターの [実行中の値] を
'pg_stat_statements,auto_explain,pg_cron'に変更できます。 詳細については、「インスタンスパラメーターの設定」をご参照ください。 -
特権アカウントを使用して対象のデータベースに接続し、次のステートメントを実行します。
CREATE EXTENSION pg_cron;説明SELECT * FROM pg_extensionステートメントを実行すると、インストール済みの拡張機能を表示できます。
-
-
-
ジョブのスケジューリング
SELECT cron.schedule('<ジョブ名>','<スケジュール>', '<アクション>');説明ジョブ名は省略可能です。ジョブがスケジュールされると、ジョブ ID が返されます。
例:
-- 毎週土曜日の午前 3:30 (UTC) に期限切れのデータを削除します。 SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$); ---------- -- 毎日午前 10:00 (UTC) に VACUUM を実行します。 SELECT cron.schedule('0 10 * * *', 'VACUUM'); -
指定データベースでのジョブのスケジューリング
SELECT cron.schedule_in_database('<ジョブ名>', '<スケジュール>', '<アクション>', '<データベース名>');重要ジョブ名を指定する必要があります。指定しない場合、ジョブの作成に失敗します。
RDS for PostgreSQL インスタンスのマイナーエンジンバージョンが 20230530 より前の場合、次のコマンドを使用してスケジュールされたタスクを実行します。 データベースを指定しない場合、タスクは
cron.database_nameパラメーターで指定されたデータベースで実行されます。 デフォルトでは、このデータベースはpostgresです。SELECT cron.schedule('<スケジュール>', '<アクション>', '<データベース名>')例:
SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'some_other_database'); -
設定済みジョブの表示
SELECT * FROM cron.job; -
ジョブの削除
SELECT cron.unschedule(<ジョブ ID>);ジョブに名前が指定されている場合は、その名前でジョブを削除することもできます。
SELECT cron.unschedule('<ジョブ名>');例:
-- ID でジョブを削除します。 SELECT cron.unschedule(43); -- 名前でジョブを削除します。 SELECT cron.unschedule('test01'); -
拡張機能の削除
DROP EXTENSION pg_cron;説明-
上記のコマンドは、特権アカウントのみが実行できます。
-
[拡張機能管理] タブの [インストール済み拡張機能] タブで、拡張機能をアンインストールできます。
-