Як запустити повторювані завдання на Postgresql без зовнішнього інструмента, схожого на хрони?


41

Я хотів би регулярно викликати збережену процедуру. У Oracle я б створив роботу для цього. Я виявив, що Postgresql може імітувати це добре, використовуючи зовнішній інструмент (cron тощо) та PgAgent.

Чи знаєте ви про "внутрішню" альтернативу, яка не передбачає зовнішнього інструменту?

  • Я хочу уникнути проблем безпеки з паролем, що зберігається в командному рядку pgAgent.
  • Я хочу уникати будь-якої додаткової конфігурації системи для приховування пароля ( ~/.pgpass).

Postgresql 8.3
Linux RedHat 64bit


Чи можете ви додати, чому ви не можете використовувати pgAgent або crontab? конкретно які функції відсутні ..
WrinkleFree

@Rohan Я оновив своє запитання
Stephan

Здається, повідомлення було скопійовано та вставлено на stackoverflow.com/q/16958625/398670
Крейг Рінгер

Відповіді:


30

Навіть якщо ви працювали над скоро випущеним (на момент написання) PostgreSQL 10 або поточним PostgreSQL 9.6, не стародавнім випуском, як 8.3, все ще немає вбудованого планувальника завдань.

Потрібно щось на зразок PgAgent або зовнішніх робочих місць, немає зручного рішення.

Функція фонових робітників, представлена ​​в 9.3, сподіваємось, дозволить перенести такий інструмент, як PgAgent, в ядро ​​PostgreSQL в більш пізньому випуску, але це ще не було зроблено. Навіть на 9.3 вам все одно доведеться запускати cron або pgagent.

Кілька людей працюють над плановими планувальниками на основі робочих груп, і є кілька виправлень, які повинні забезпечити засоби для вирішення цього питання. Але, що стосується PostgreSQL 10, досі немає хорошої якості, широко прийнятого планувальника, і більшість людей використовують планувальник завдань cron / ms / тощо.

Погляньте і на політику версій ; ви використовуєте застарілий і непідтримуваний випуск.


Please take a look at the version policy, оновлення Postgresql - це не варіант.
Стефан

2
@Alex Вам потрібно буде оновити в якийсь момент, і це стане лише важче. Який 8,3 бальний реліз, до речі? Скільки значних виправлень помилок не вистачає? Або ти принаймні 8.3.23? Однак, як я пояснив, потрібна вам функція не існує навіть у майбутньому випуску 9.3, хоча деякі основні елементи, щоб дозволити її додавання, були додані.
Крейг Рінгер

Я поговорю з моїм начальником :)
Стефан

1
@ Алекс Гарна ідея :-). Як мінімум терміново оновіть до 8.3.23, тоді почніть працювати над планами оновлення до нової версії. Це питання не вирішить, але це дуже гарна ідея, щоб врятувати біль у майбутньому. Чимало клієнтів, яких я підтримую, у яких виникають проблеми, яких у них ніколи не було б, якби вони просто залишалися в курсі, дивує. Ми не випускаємо нових версій лише для ударів ;-). Прочитайте примітки до випусків для кожної версії .0, щоб отримати вказівки щодо того, що вам може знадобитися, і прочитайте посібник з оновлення. Ваші єдині ймовірні больові точки - standard_conforming_stringsі bytea_output.
Крейг Рінгер

Крейг, що ти думаєш про pg_cron?
mehmet

21

Станом на PostgreSQL 9.5, ви можете використовувати розширення pg_cron , яке завантажується як спільна бібліотека в PostgreSQL.

Після його налаштування створити роботу досить просто:

SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);

Це запустить команду delete відповідно до заданого графіка cron. Ви також @rebootможете запланувати роботу, коли сервер перезапуститься, і pg_cron автоматично почне виконувати завдання, якщо ви сприятимете гарячому режиму очікування.

Замість використання .pgpass, ви можете надати localhost доступ для користувача cron в pg_hba.conf.


-1

Ти справді, дуже не хочеш цього робити. Postgres - це не операційна система, це сервер баз даних. Навіть якщо база даних підтримує виконання запланованих завдань, зловживати такою базою даних не дуже добре.

Якщо ви стурбовані тим, що не хочете встановлювати пароль та інше, це легко вирішити. Налаштуйте локальне з'єднання для сокетів Unix, використовуючи замість цього довіру або автентифікацію ідентифікації , запустіть cronjob як цей користувач.

У своїй конфігурації вікна зазвичай postgres налаштовує системного користувача postgresдля запуску db-сервера, і цей системний користувач, як правило, вже попередньо налаштований, тому він може підключитися до локального сервера, використовуючи автентифікацію довіри при підключенні через локальний сокет Unix. Ви можете запустити cronjob як користувач системи postgres, підключитися до локального сокета і потім переключити роль, якщо ви не хочете, щоб ваша збережена процедура запускалася з привілеєм суперпользователя.

У налаштуваннях за замовчуванням ви можете просто зробити це:

$ sudo -u postgres crontab -e

У редакторі додайте до запису crontab так:

0    0    *     *    * bash /path/to/run_stored_procedure.sh

а у вашому /path/to/run_stored_procedure.sh файлі ви просто використовуєте psql для виклику процедури зберігання

#!/usr/bin/env bash
psql my_db_name <<END
    SET ROLE limited_user;
    SELECT my_stored_proc();
    SELECT 1 FROM my_stored_proc();
END

1
"Зловживати такою базою даних не дуже добре" Чому, на вашу думку, це зловживання? Різні основні RDBMS мають тенденцію до подібних підходів, і я не думаю, що це так страшно. Крім того, якщо ви не маєте доступу до ОС, вам не вистачає програми crontab.
dezso
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.