我想对 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 中 pg_cron 扩展的常见问题进行故障排除。
简短描述
Amazon RDS for PostgreSQL 支持在数据库内部运行的 pg_cron 扩展,允许您调度 PostgreSQL 命令。当您运行 pg_cron 扩展时,可能会遇到任务未按计划时间运行以及更新未生效的问题。
解决方法
要对 Amazon RDS for PostgreSQL 中 pg_cron 扩展的问题进行故障排除,请完成以下步骤:
**注意:**在开始之前,请确保 pg_cron 扩展设置正确。有关更多信息,请参阅设置 pg_cron 扩展。
未在预定时间运行的既定 pg_cron 作业
要对未按预定时间运行的既定 pg_cron 作业问题进行故障排除,请完成以下步骤:
-
确认 pg_cron 启动器在启动 cron 作业 worker 的数据库中运行:
示例:
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 启动器未运行。要解决此问题,请重启 Amazon RDS 实例,以启动启动器并允许既定任务运行。
-
如果先前的查询返回了行,则检查前之前的作业是否处于正在运行状态。
注意: Pg_cron 可以并行运行多个作业,但一次只能运行一个作业实例。如果计划在第一个作业运行时启动第二个作业,则第二个作业将排队。第二个作业将在第一个作业运行完成后启动。
示例:
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 参数时,请务必重启 Amazon RDS 实例,以使更改生效。
相关信息
用于调度作业和捕获状态的表