pg_cron — это расширение PostgreSQL, которое запускает задачи по расписанию прямо внутри базы, используя стандартный синтаксис cron. Если ты пишешь фоновые джобы, которые в основном сводятся к SQL-запросам, проще отдать это Postgres’у через pg_cron. Получается проще, стабильнее и без внешнего планировщика.Настройка
В managed PostgreSQL (например, Crunchy Bridge и похожие провайдеры)
pg_cron обычно уже доступен.Если поднимаешь Postgres сам, ставишь пакет:
sudo apt install postgresql-18-cron
Дальше подключаешь расширение при старте сервера через
postgresql.conf:shared_preload_libraries = 'pg_cron'
cron.database_name = 'postgres'
shared_preload_libraries обязателен — без него расширение не загрузится.Как работает
По умолчанию задачи выполняются в той базе, где создано расширение.
Можно явно указать другую базу через
cron.schedule_in_database.Задачи выполняются от имени роли, которая их создала. Значит, права на таблицы и команды берутся из этой роли.
Создание задач
Основная функция —
cron.schedule. У неё несколько перегрузок, поведение зависит от количества аргументов.Типичный вариант из трёх частей:
имя задачи
cron-расписание
SQL-команда
Пример:
SELECT cron.schedule(
'nightly_vacuum',
'0 3 * * *',
'VACUUM ANALYZE big_table'
);
Управление и мониторинг
Список задач лежит в
cron.job.Там есть:
имя
расписание
SQL
активна ли задача
История запусков —
cron.job_run_details.Там видно:
время старта
длительность
успех или ошибка
Повторов при ошибке нет. Задача просто логируется и ждёт следующего запуска.
Частые кейсы
чистка старых логов
nightly VACUUM для горячих таблиц
агрегация метрик по часам
перенос старых строк в архив
обновление materialized views
Реже используемые сценарии
Иногда
pg_cron используют не только для базы:батчинг запросов к внешним API (в связке с
http)ETL-процессы и выгрузка в data warehouse (например, через
pg_lake)прогрев кэша через
pg_prewarm перед пиками нагрузки👉 @SQLPortal
