PostgreSQL 用 Amazon Relational Database Service (Amazon RDS) の pg_cron 拡張機能に関する一般的な問題のトラブルシューティングを行いたいと思っています。
簡単な説明
AmazonRDS for PostgreSQL は、データベース内で実行される pg_cron 拡張機能をサポートしており、PostgreSQL コマンドをスケジュールすることができます。pg_cron 拡張機能を実行すると、ジョブがスケジュールされた時間に実行されなかったり、更新が有効にならなかったりする問題が発生する場合があります。
解決方法
AmazonRDS for PostgreSQL の pg_cron 拡張に関する問題のトラブルシューティングを行うには、以下の手順を実行してください。
注: 始める前に、pg_cron 拡張モジュールが正しく設定されていることを確認してください。詳細については、「pg_cron 拡張機能のセットアップ」を参照してください。
pg_cron ジョブがスケジュールされた時間に実行されない
スケジュールされた pg_cron ジョブが、スケジュールされた時刻に実行されない問題をトラブルシューティングするには、次の手順を実行します。
-
cron ジョブワーカーを起動するデータベースで、pg_cron ランチャーが実行されていることを確認します。
例:
postgres=> select application_name,usename,backend_type,query,state,wait_event_type,age(now(),backend_start) as backend_start_age,age(now(),query_start) as query_start_age,age(now(),state_change) state_change_age from pg_stat_activity where backend_type = 'pg_cron launcher';
出力例:
application_name | usename | backend_type | query | state | wait_event_type | backend_start_age | query_start_age | state_change_age
-------------------+----------+------------------+-------+--------+-----------------+------------------------------+-----------------+------------------
pg_cron scheduler | rdsadmin | pg_cron launcher | | [NULL] | Extension | 2 mons 28 days 15:16:41.6642 | [NULL] | [NULL]
(1 row)
注: 上記のクエリが 0 行を返す場合、pg_cron ランチャーは実行されていません。これを解決するには、AmazonRDS インスタンスを再起動してランチャーを起動し、スケジュールされたジョブの実行を許可します。
-
上記のクエリが行を返す場合は、前のジョブの状態が Running かどうかを確認してください。
注: Pg_cron は複数のジョブを並行して実行できますが、ジョブのインスタンスは一度に 1 つずつ実行します。最初のジョブの実行中に 2 番目のジョブ実行が開始するようにスケジュールされている場合、2 番目のジョブはキューに入れられます。2 番目のジョブは、最初のジョブの実行が完了した後に開始します。
例:
postgres=> select * FROM cron.job_run_details where status ='running';
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time
-------+-------+---------+----------+----------+---------+--------+----------------+------------+---------- 1 | 2 | 15712 | postgres | postgres | select pg_sleep(5) | running | [NULL] | 2024-07-10 16:40:00.025228+00 | [NULL] (1 row)
-
ジョブスケジュールが UTC タイムゾーンに合わせて設定されていることを確認します。pg_cron のスケジュール時刻は、Amazon RDS for PostgreSQL で、UTC タイムゾーンに基づいたものです。
cron.max_running_jobs の更新が有効にならない
**cron.max_running_jobs ** パラメータは、同時に実行できるジョブの最大数を決定します。cron.max_running_jobs を増やすには、max_worker_processes を cron.max_running_jobs と同じかそれ以上になるように更新します。Cron.max_running_jobs を max_worker_processes より大きくすることはできません。cron.max_running_jobs を max_worker_processes よりも大きくすると、いずれの更新も有効になりません。変更を有効にするには、cron.max_running_jobs パラメータの更新時に、AmazonRDS インスタンスを必ず再起動してください。
関連情報
ジョブのスケジュール設定とステータス取得用のテーブル