ApsaraDB RDS for PostgreSQL は、タスクのスケジューリング用に pg_cron 拡張機能をサポートしています。この拡張機能は、cron ベースのジョブスケジューリングを使用し、標準の cron ユーティリティと同じ構文を採用しています。SQL コマンドを使用して、データベース内で直接スケジュールされたタスクを設定できます。
概要
pg_cron は、cron ベースのジョブスケジューリング拡張機能であり、標準の cron ユーティリティと同じ構文を使用します。これにより、SQL コマンドを使用して、データベース内で直接スケジュールされたタスクを設定できます。詳細については、「pg_cron」をご参照ください。
各スケジュールされたタスクは、スケジュールとアクションの 2 つの主要な部分で構成されます。たとえば、毎週土曜日の午前 3:30 (UTC) に `events` テーブルから期限切れのデータを削除する次のタスクを考えてみましょう:SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
スケジュールは cron 式
30 3 * * 6で定義され、毎週土曜日の午前 3:30 (GMT) にタスクを実行します。cron 構文では、* は任意の時間に実行を意味し、特定の数字はこの時間のみ実行を意味します。┌───────────── 分: 0-59 │ ┌────────────── 時: 0-23 │ │ ┌─────────────── 日: 1-31 │ │ │ ┌──────────────── 月: 1-12 │ │ │ │ ┌───────────────── 曜日: 0-6 (0 は日曜日) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * *crontab.guru ウェブサイトを使用して、pg_cron のスケジュールされたタスクの時間設定を作成し、理解することができます。
アクションは
$$DELETE FROM events WHERE event_time < now() - interval '1 week'$$で、`events` テーブルから期限切れのデータを削除します。
前提条件
インスタンスは ApsaraDB RDS for PostgreSQL 10 以降のバージョンを実行していること。
インスタンスのマイナーエンジンバージョンが 20250430 以降であること。
重要この拡張機能は、20250430 より前の一部のマイナーエンジンバージョンでもサポートされています。拡張機能の管理を標準化し、ApsaraDB RDS for PostgreSQL のセキュリティを向上させるため、Alibaba Cloud はマイナーエンジンバージョンの反復中に拡張機能のセキュリティリスクに対処しています。その結果、これらの古いマイナーエンジンバージョンを実行しているインスタンスでは、この拡張機能を作成できません。詳細については、「拡張機能の作成に関する制限」をご参照ください。
ご利用のインスタンスが 20250430 より前のマイナーエンジンバージョンを実行しており、すでにこの拡張機能を使用している場合、拡張機能の使用に影響はありません。
この拡張機能を初めて作成する場合、または再作成する場合は、マイナーエンジンバージョンを最新バージョンに更新する必要があります。
特権アカウントが作成済みであること。特権アカウントの作成方法の詳細については、「アカウントの作成」をご参照ください。
注意事項
デフォルトでは、スケジュールされたタスクは協定世界時 (UTC) で実行されます。タスクを設定する際は、データベースの `TIMEZONE` パラメーターに基づいて時間を変換する必要があります。スケジュールされたタスクが期待どおりにトリガーされない場合は、毎分実行されるタスクを設定して、拡張機能の可用性を確認できます。例:
SELECT cron.schedule('* * * * *', 'SELECT 1;');スケジュールされたタスクは、デフォルトの `postgres` データベースに保存されます。ただし、他のデータベースからスケジュールされたタスクをクエリすることは可能です。
pg_cron 拡張機能は、
cron.database_nameパラメーターで指定されたデータベースにインストールされます。cron.database_nameパラメーターのデフォルト値はpostgresです。pg_cron 拡張機能を別のデータベースにインストールする場合は、cron.database_nameパラメーターの値を変更する必要があります。詳細については、「インスタンスパラメーターの設定」をご参照ください。pg_cron 拡張機能は、マイナーエンジンバージョンが 20201130 より前の ApsaraDB RDS for PostgreSQL 10、11、または 12 を実行しているインスタンスでサポートされています。ただし、拡張機能はアップグレードされています。マイナーエンジンバージョンを最新バージョンにアップグレードすることを推奨します。アップグレード前に pg_cron を使用していた場合、新しい機能を使用するには拡張機能を再作成する必要があります。注意:拡張機能を再作成すると、既存のスケジュールされたタスクは削除されます。
pg_cron 拡張機能の作成または削除には、特権アカウントを使用する必要があります。特権アカウントの作成方法の詳細については、「アカウントの作成」をご参照ください。
拡張機能の使用方法
pg_cron 拡張機能は、cron.database_name パラメーターで指定されたデータベースにインストールされます。デフォルトのデータベースは postgres です。拡張機能がサポートするコマンドは、その特定のデータベースでのみ実行できます。pg_cron 拡張機能の使用方法の詳細については、「pg_cron」をご参照ください。
拡張機能の作成
コンソールからの拡張機能のインストール
インスタンスページに移動します。上部のナビゲーションバーで、インスタンスが配置されているリージョンを選択します。次に、インスタンスを見つけてその ID をクリックします。
左側のナビゲーションウィンドウで、[拡張機能の管理] をクリックします。
[拡張機能の管理] > [アンインストール済みの拡張機能] ページで、pg_cron 拡張機能を見つけます。拡張機能をインストールするデータベースを選択し、[インストール] をクリックします。
ダイアログボックスで、特権アカウントを選択し、[インストール] をクリックして、ターゲットデータベースに拡張機能をインストールします。
インストール中、インスタンスのステータスは [インスタンスのメンテナンス中] に変わります。ステータスが [実行中] に変わると、拡張機能は正常にインストールされています。
SQL コマンドを使用した拡張機能のインストール
インスタンスパラメーターを設定します。shared_preload_libraries パラメーターの [実行中のパラメーター値] に pg_cron を追加します。たとえば、[実行中のパラメーター値] を
'pg_stat_statements, auto_explain, pg_cron'に変更します。特権アカウントを使用してターゲットデータベースに接続し、次の SQL 文を実行します。
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('<タスク名>', '<スケジュール>', '<アクション>', '<データベース>');重要タスク名を指定する必要があります。指定しない場合、タスクは作成できません。
ご利用の ApsaraDB 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;説明このコマンドは特権アカウントのみが実行できます。
[拡張機能の管理] ページの [インストール済みの拡張機能] タブで拡張機能をアンインストールすることもできます。