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) に実行されることを指定します。┌───────────── Minute: 0 to 59 │ ┌────────────── Hour: 0 to 23 │ │ ┌─────────────── Date: 1 to 31 │ │ │ ┌──────────────── Month: 1 to 12 │ │ │ │ ┌───────────────── Day of the week: 0 to 6 (The value 0 indicates Sunday.) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * *
crontab.guruでpg_cronスケジュールタスクのスケジュールを作成および解決できます。
Action
この部分は、タスクを実行して実行するアクションを指定します。 サンプルのスケジュールされたタスクでは、アクションは
$$DELETE FROM events WHERE event_time < now() - interval '1 week '$$
で、スケジュールされたタスクを実行してeventsという名前のテーブルから期限切れのデータを削除することを指定します。
前提条件
RDSインスタンスはPostgreSQL 10以降を実行します。
説明この拡張機能は、PostgreSQL 17を実行するApsaraDB RDS for PostgreSQLインスタンスではサポートされていません。
RDSインスタンスは、20230830以降のマイナーエンジンバージョンを実行します。
重要この拡張機能は、20230830以前の一部のマイナーエンジンバージョンでサポートされています。 ただし、ApsaraDB RDSは、標準化された拡張機能管理とセキュリティ強化のために、マイナーエンジンバージョンの更新で脆弱な拡張機能を最適化する予定です。 したがって、20230830より前のマイナーエンジンバージョンを実行するRDSインスタンスでは、この拡張機能を作成することはできません。 詳細については、「 [製品の変更 /機能の変更] ApsaraDB RDS For PostgreSQLインスタンスの拡張機能作成の制限」をご参照ください。
20230830より前のマイナーエンジンバージョンを実行するRDSインスタンス用にこの拡張機能を既に作成している場合は、引き続きこの拡張機能を使用できます。
このエクステンションを初めて作成する場合、またはRDSインスタンスのエクステンションを再作成する必要がある場合は、RDSインスタンスのマイナーエンジンバージョンを最新バージョンに更新する必要があります。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
拡張機能を使用する前に、ApsaraDB RDSコンソールのshared_preload_librariesパラメーターのRunning Valueにpg_cronを追加する必要があります。 たとえば、このパラメーターの実行中の値を
'pg_stat_statements,auto_explain, pg_cron '
に変更できます。 インスタンスのパラメーター設定の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。
使用上の注意
スケジュールタスクのスケジュールで指定された時間はUTCに従います。 必要に応じて時間を変換します。
設定されたスケジュールタスクは、postgresという名前のデフォルトデータベースに格納されます。 他のデータベースでこれらのスケジュール済みタスクを照会できます。
pg_cron拡張子は、
cron.database_name
パラメーターで指定されたデータベースにインストールされます。デフォルト値はpostgres
です。 pg_cron拡張子を別のデータベースにインストールする場合は、cron.database_name
パラメーターの値を変更します。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。オリジナルのpg_cron拡張機能は、PostgreSQL 10、PostgreSQL 11、またはPostgreSQL 12を実行し、20201130より前のマイナーエンジンバージョンを使用するRDSインスタンスでサポートされています。 ただし、RDSインスタンスのマイナーエンジンバージョンを最新バージョンに更新して、pg_cronのアップグレードバージョンを使用することを推奨します。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。 マイナーエンジンバージョンの更新前にpg_cronを使用していた場合は、pg_cronを再作成してその新機能を利用します。 pg_cronを使用して設定したスケジュール済みタスクは、拡張機能の再作成後に失われることに注意してください。
pg_cron拡張機能を作成または削除するには、特権アカウントを使用する必要があります。 特権アカウントの作成方法の詳細については、「アカウントの作成」をご参照ください。
拡張機能を使用するUse the extension
pg_cronでサポートされているコマンドは、デフォルト値がpostgres
であるcron.database_name
パラメーターで指定されたデータベースでのみ実行できます。 pg_cronの使用方法の詳細については、「pg_cron」をご参照ください。
拡張機能の作成
CREATE EXTENSION pg_cron;
説明特権アカウントのみ、上記のコマンドを実行する権限があります。 特権アカウントの作成方法の詳細については、「アカウントの作成」をご参照ください。
次のステートメントを実行して、インストールされている拡張機能を表示できます。
SELECT * FROM pg_extension;
スケジュール済みタスクの設定
SELECT cron.schedule('<Scheduled Task Name>','<Schedule>', '<Action>');
説明スケジュールタスク名は指定しないでください。 スケジュールされたタスクが設定されると、タスクIDが返されます。
例:
-- Delete expired data at 3:30 AM (GMT) every Saturday. SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$); ---------- -- Clear the disk at 10:00 AM (GMT) every day. SELECT cron.schedule('0 10 * * *', 'VACUUM');
指定されたデータベースでのスケジュールタスクの設定
SELECT cron.schedule_in_database('<Scheduled Task Name>', '<Schedule>', '<Action>', '<Specified Database>');
重要スケジュールタスク名を指定する必要があります。 そうしないと、タスクの作成に失敗します。
RDS for PostgreSQLインスタンスが20230530より前のマイナーエンジンバージョンを実行している場合は、次のコマンドを使用してスケジュールタスクを実行します。 データベースを指定しない場合、タスクは
cron.database_name
パラメーターで指定されたデータベースで実行されます。 デフォルトでは、このデータベースはpostgres
です。SELECT cron.schedule('<Schedule>', '<Action>', '<Specified Database>')
例:
SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'some_other_database');
設定されたスケジュール済みタスクの表示
SELECT * FROM cron.job;
スケジュール済みタスクの削除
SELECT cron.unschedule(<Scheduled Task ID>);
スケジュールタスクに名前が指定されている場合は、名前を指定してタスクを削除することもできます。
SELECT cron.unschedule('<Scheduled Task Name>');
例:
-- Delete a scheduled task by its ID. SELECT cron.unschedule(43); -- Delete a scheduled task by its name. SELECT cron.unschedule('test01');
拡張機能を削除する
DROP EXTENSION pg_cron;
説明特権アカウントだけが上記のコマンドを実行する権限を持っています。