pg_cron. Планировщик заданий по расписанию
Версия: 1.6.4.
В исходном дистрибутиве установлено по умолчанию: да.
Связанные компоненты:
Схема размещения:
ext
.
Расширение pg_cron
используется в СУБД Pangolin для выполнения задач по расписанию (Job scheduler for PostgreSQL).
Рекомендовано использовать для задач:
- периодический вызов VACUUM в соответствии со спецификой загруженности сервера;
- секционирование таблиц. Например, для гибкого управления данными (удаление или перенос отдельных секций вместо целой таблицы). Соответственно, добавление новой секции — это часть процесса управления секционированной таблицей, необходимая при расширении таблицы с течением времени и созданием новых секций.
Обновление pg_cron
до актуальной версии добавляет новые возможности в виде новых функций, параметров конфигурирования и режима работы.
При этом имя пользователя передается неявно, через чтение текущего пользователя, поэтому пользователь может завершить только свою задачу.
Работа внутри кластера
pg_cron
можно безопасно использовать в схеме с реализацией. Данные cron
можно модифицировать только с текущего лидер-сервера.
Примечание:
Так как
pg_cron
для выполнения задач сохраняетhost:ip
сервера (127.0.0.1:5433), необходимо на всех экземплярах выставить одинаковый порт. В противном случае приswitchover/failover
pg_cron
попытается подключиться к старому лидеру-серверу.
Доработка
Ранее было произведено добавление расширения pg_cron
в состав дистрибутива Pangolin для обеспечения возможности выполнения задач по расписанию.
Ограничения
Ограничения отсутствуют.
Установка
Установка расширения может быть произведена в процессе развертывании СУБД Pangolin при использовании настроек по умолчанию (документ «Руководство по установке», раздел «Автоматизированная установка при помощи Ansible-скриптов»).
Для начала использования расширения выполните следующие действия:
-
Пропишите в конфигурационном файле Pangolin:
shared_preload_libraries = 'pg_cron'
cron.database_name = 'postgres'Где
postgres
- имя БД, в которой будет работатьcron
. -
От пользователя с правами
superuser
включите расширение:CREATE EXTENSION pg_cron;
-
Выдайте права на схему
cron
нужному пользователю:GRANT USAGE ON SCHEMA cron TO <имя пользователя pg_cron>;
-
Перезагрузите Pangolin. Так как процессу
pg_cron
необходимо создавать подключение к БД, добавьте пароль пользователя, созданного на предыдущем шаге, в хранилище паролей:SELECT add_auth_record_to_storage('localhost', <порт СУБД>, <имя БД>, <имя пользователя pg_cron>, 'пароль пользователя pg_cron');
Настройка
Выдача прав на схему cron
Выдача прав на схему cron
нужному пользователю:
GRANT USAGE ON SCHEMA cron TO <имя пользователя pg_cron>;
Создание пользователя для расширения pg_cron
-
Проверьте, что расширение установлено.
-
Создайте пользователя (например,
cronuser
):CREATE USER cronuser WITH PASSWORD 'passwd'
-
Разрешите использование схемы
cron
новому пользователю:GRANT USAGE ON SCHEMA cron TO cronuser;
-
Добавьте пароль пользователя в хранилище паролей.
SELECT add_auth_record_to_storage('localhost', <порт СУБД>, <имя БД>, `cronuser`, 'passwd');
Управление задачами планировщика
Внимание!
Задачи запускаются только на лидер-сервере. Пока сервер в состоянии горячего резерва (Hot Standby), задачи не запускаются и ждут, пока сервер не станет лидером.
Задачи запускаются с правами пользователя, создавшего задачу.
Формат таблицы cron.job
Таблица содержит все запланированные задачи.
Только пользователь с правами суперпользователя может напрямую работать с данной таблицей (см. «Продвинутая работа с таблицей запланированных задач»).
Поле | Описание |
---|---|
jobid | Идентификатор задачи |
schedule | Дата и время выполнения задачи или временной период для выполнения задачи |
command | Выполняемая команда |
nodename | Имя узла, где будет выполнена команда. В качестве имени узла можно использовать одно из возможных значений: hostname , localhost , IP-адрес, Unix-сокет (значение конфигурационного параметра - unix_socket_directories ). Какое именно указать значение - зависит от правила, прописанного в pg_hba.conf для пользователя создавшего команду |
nodeport | Порт для подключения к узлу PostgreSQL (по умолчанию 5432 ) |
database | Имя базы данных, в который будет выполнена команда |
username | Пользователь, создавший команду |
Создание задачи в pg_cron
-
Зайдите под пользователем, созданным в при настройке расширения.
-
Создайте задачу в
cron
:SELECT cron.schedule(period, command);
где:
-
period
– строка, означающая дату или временной период для выполнения задачи. Формат строки:* * * * * минуты (0-59) часы (0-23) день (1-31) месяц (1-12) день недели (0-6, 7 равноценно 0) Значение
*
означает повторение события.Примеры:
- * * * * * - каждую минуту;
- 0 5 * * * - каждый день в 5:00;
- */10 * * * * - каждые 10 минут;
- 0 0 1 1 * - 1 января каждого года;
- 0 9 * * 1,3,5 - в понедельник, среду и пятницу в 9 утра;
- 0 0 1 * * - каждое 1-е число месяца.
-
command
– исполняемая команда, форматы:$$ SQL-req $$
- для SQL-запроса;'PostreSQL SQL command'
- одиночная PostreSQL SQL команда.
Примеры:
-
Вывести все задачи в планировщике:
SELECT cron.schedule('59 23 * * *', $$SELECT * FROM cron.job$$);
-
Выполнить команду VACUUM:
SELECT cron.schedule('59 23 * * *', 'VACUUM');
-
-
Выведите содержимое таблицы
cron.job
, чтобы проверить, что задача создана:SELECT * from cron.job;