ApsaraDB RDS for PostgreSQLはpg_cron拡張機能をサポートしています。 拡張機能を使用して、スケジュール済みタスクを設定できます。
前提条件
RDSインスタンスはPostgreSQL 10以降を実行します。
RDSインスタンスは、20230830以降のマイナーエンジンバージョンを実行します。
重要拡張機能は、20230830より前のマイナーエンジンバージョンでサポートされています。 ApsaraDB RDS for PostgreSQLの拡張機能管理を標準化し、拡張機能のセキュリティを強化するために、ApsaraDB RDSはマイナーエンジンバージョンのイテレーションで脆弱な拡張機能を最適化する予定です。 その結果、以前のマイナーエンジンバージョンを実行するRDSインスタンスに対して、一部の拡張機能を作成できなくなりました。 詳細については、「 [製品の変更 /機能の変更] ApsaraDB RDS For PostgreSQLインスタンスの拡張機能作成の制限」をご参照ください。
20230830より前のマイナーエンジンバージョンを実行するRDSインスタンスの拡張機能を作成した場合、その拡張機能は影響を受けません。
RDSインスタンスの拡張機能を初めて作成する場合、または拡張機能を再作成する場合は、RDSインスタンスのマイナーエンジンバージョンを最新バージョンに更新する必要があります。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
RDSインスタンスのshared_preload_librariesパラメーターの値にpg_cronを追加する必要があります。
shared_preload_librariesパラメーターの値にpg_cronを追加する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。
背景情報
pg_cron拡張機能を使用すると、CRONを使用してタスクをスケジュールできます。 pg_cron拡張機能は、標準のCRON式と同じ構文を使用しますが、データベースからPostgreSQLコマンドを開始できます。
スケジュールされた各タスクは、次の部分で構成されます。
スケジュール
設定したタスクを実行するためにシステムがpg_cron拡張機能を使用するスケジュール。 たとえば、スケジュールは、タスクが1分間隔で実行されることを指定します。
スケジュールは、標準のCRON式と同じ構文に従います。 構文では、ワイルドカード (*) はタスクが任意の時点で実行されることを指定し、数値はタスクがこの値で指定された時点でのみ実行されることを指定します。
「 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 分: 0から59 │ ┌────────────── 时间: 0 ~ 23 │ │ ┌─────────────── 日付: 1 ~ 31 │ │ │ Month月: 1 ~ 12 週の曜日: 0〜6 (値0は日曜日を示します) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * *
次のスケジュールでは、タスクが毎週土曜日にUTC 03:30で実行されることを指定します。
30 3 * * 6
タスク
設定したタスク。 例:
select * from some_table
使用上の注意
スケジュールされたタスクはUTCに基づいて実行されます。
スケジュールされたタスクは、postgresという既定のデータベースに保存されます。 他のデータベースでスケジュールされたタスクを照会できます。
pg_cron拡張子は、
cron.database_name
パラメーターで指定されたデータベースにインストールされます。cron.database_name
パラメーターのデフォルト値はpostgres
です。 pg_cron拡張子を別のデータベースにインストールする場合は、cron.database_name
パラメーターの値を変更します。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。pg_cron拡張機能は、PostgreSQL 10、PostgreSQL 11、またはPostgreSQL 12を実行し、20201130より前のマイナーエンジンバージョンを使用するRDSインスタンスでサポートされています。 pg_cron拡張が更新されました。 したがって、RDSインスタンスのマイナーエンジンバージョンを更新して、拡張機能を使用することを推奨します。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。 拡張機能が更新される前にpg_cron拡張機能を使用し、拡張機能の新機能を使用する場合は、拡張機能を再作成する必要があります。 pg_cron拡張を再作成すると、pg_cron拡張の元のバージョンを使用して作成されたスケジュール済みタスクは失われます。
拡張機能を使用するUse the extension
次の方法は、20230530より前のマイナーエンジンバージョンを実行するRDSインスタンスにのみ適用されます。 RDSインスタンスが20230530以降のマイナーエンジンバージョンを実行している場合、pg_cron拡張機能の使用方法は公式ドキュメントで確認できます。
エクステンションを作成します。
拡張の作成pg_cron;
説明特権アカウントのみがステートメントを実行する権限を持っています。
拡張を削除します。
ドロップ延長pg_cron;
説明特権アカウントのみがステートメントを実行する権限を持っています。
スケジュールされたタスクを実行します。
SELECT cron.schedule('<スケジュール>', '<タスク>');
例
-毎週土曜日のUTC 03:30に古いデータを削除します。 SELECT cron.schedule('30 3 * * 6 '、$$DELETE WHERE event_time < now() - interval '1 week'$$$); ---------- -毎日UTC 10:00にディスクをクリアします。 SELECT cron.schedule('0 10 * * * ', 'VACUUM'); ---------- -- 指定したスクリプトを1分間隔で実行します。 SELECT cron.schedule('* * * *', 'select 1;'); ---------- -1時間の23分に指定されたスクリプトを実行します。 SELECT cron.schedule('23 * * * * ', 'select 1;'); ---------- -- 毎月4日目に指定したスクリプトを実行します。 SELECT cron.schedule('* * 4 * *', 'select 1;');
データベースでスケジュールされたタスクを実行します。
SELECT cron.schedule('<Schedule>', '<Task>', '<Database>')
説明データベースを指定しない場合、スケジュールされたタスクは、構成ファイルで指定されたpostgresという名前の既定のデータベースで実行されます。
スケジュールされたタスクを削除します。
SELECT cron.unschedule(<スケジュールされたタスクのID>)
例
SELECT cron.unschedule(43);
スケジュールされたすべてのタスクを表示します。
SELECT * からcron.job;