F.37. pg_cron#
F.37. pg_cron
F.37.1. О расширении pg_cron
Версия: 1.6.2
Страница проекта www.citusdata.com
Copyright © Citus Data, Inc.
F.37.2. Что такое pg_cron?
pg_cron - это простой планировщик заданий на основе cron для Tantor SE который работает внутри базы данных в качестве расширения. Он использует ту же синтаксическую конструкцию, что и обычный cron, но позволяет вам планировать Tantor SE команды непосредственно из базы данных:
-- Delete old data on Saturday at 3:30am (GMT) SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$); schedule ---------- 42 -- Vacuum every day at 10:00am (GMT) SELECT cron.schedule('nightly-vacuum', '0 10 * * *', 'VACUUM'); schedule ---------- 43 -- Change to vacuum at 3:00am (GMT) SELECT cron.schedule('nightly-vacuum', '0 3 * * *', 'VACUUM'); schedule ---------- 43 -- Stop scheduling jobs SELECT cron.unschedule('nightly-vacuum' ); unschedule ------------ t (1 row) SELECT cron.unschedule(42); unschedule ------------ t
pg_cron может выполнять несколько заданий параллельно, но одновременно может выполняться только один экземпляр задания. Если второй запуск должен начаться до завершения первого, то второй запуск ставится в очередь и начинается сразу после завершения первого запуска.
Расписание использует стандартный синтаксис cron, в котором * означает “запускать каждый период времени”, а конкретное число означает “но только в это время”:
┌───────────── min (0 - 59) │ ┌────────────── hour (0 - 23) │ │ ┌─────────────── day of month (1 - 31) │ │ │ ┌──────────────── month (1 - 12) │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to │ │ │ │ │ Saturday, or use names; 7 is also Sunday) │ │ │ │ │ │ │ │ │ │ * * * * *
Код в pg_cron, который обрабатывает разбор и планирование, взят непосредственно из исходного кода cron Пола Викси, поэтому поддерживаются те же параметры.
F.37.3. Настройка pg_cron
Чтобы запустить фоновый рабочий процесс pg_cron, когда
Tantor SE
начинается, вам нужно добавить pg_cron в shared_preload_libraries
в postgresql.conf. Обратите внимание, что pg_cron не выполняет задания, пока сервер находится в режиме горячего резервирования, но автоматически запускается при повышении сервера.
# add to postgresql.conf # required to load pg_cron background worker on start-up shared_preload_libraries = 'pg_cron'
По умолчанию фоновый рабочий процесс pg_cron ожидает, что его метаданные таблицы будут созданы в базе данных “postgres”.
Однако, вы можете настроить это, установив параметр конфигурации cron.database_name
в файле postgresql.conf.
# add to postgresql.conf # optionally, specify the database in which the pg_cron background worker should run (defaults to postgres) cron.database_name = 'postgres'
После перезапуска
Tantor SE
,
вы можете создать функции pg_cron и метаданные таблиц, используя
CREATE EXTENSION pg_cron
.
-- run as superuser: CREATE EXTENSION pg_cron; -- optionally, grant usage to regular users: GRANT USAGE ON SCHEMA cron TO marco;
Важно
По умолчанию pg_cron использует libpq для открытия нового соединения с локальной базой данных, что требует разрешения в файле pg_hba.conf. Может потребоваться включить аутентификацию trust
для соединений, поступающих с localhost, для пользователя, выполняющего задание cron, или вы можете добавить пароль в файл .pgpass, который будет использоваться libpq при открытии соединения.
В качестве альтернативы, pg_cron может быть настроен для использования фоновых
рабочих процессов. В этом случае количество одновременных заданий ограничено
параметром max_worker_processes
, поэтому вам может
потребоваться его увеличить.
# Schedule jobs via background workers instead of localhost connections cron.use_background_workers = on # Increase the number of available background workers from the default of 8 max_worker_processes = 20
Вы также можете использовать каталог unix-домена в качестве имени хоста и включить аутентификацию trust
для локальных соединений в файле pg_hba.conf, что обычно безопасно.
# Connect via a unix domain socket cron.host = '/tmp'
Для обеспечения безопасности задания выполняются в базе данных, в которой вызывается функция cron.schedule
с теми же разрешениями, что и у текущего пользователя. Кроме того, пользователи могут видеть только свои собственные задания в таблице cron.job
.
pg_cron
может быть установлен только в одну базу данных в кластере.
Если необходимо запускать задания в нескольких базах данных, используйте cron.schedule_in_database()
.
Ранее pg_cron
мог использовать только время по Гринвичу, но теперь вы можете адаптировать
ваше время, установив cron.timezone
в postgresql.conf
.
# add to postgresql.conf # optionally, specify the timezone in which the pg_cron background worker should run (defaults to GMT). E.g: cron.timezone = 'PRC'