Jak uruchamiać cykliczne zadania na Postgresql bez zewnętrznego narzędzia podobnego do crona?

41

Chciałbym regularnie wywoływać procedurę przechowywaną. Na Oracle stworzyłbym do tego zadanie. Przekonałem się, że Postgresql może naśladować to dobrze za pomocą zewnętrznego narzędzia (cron itp.) I PgAgent.

Czy znasz „wewnętrzną” alternatywę, która nie wymagałaby użycia zewnętrznego narzędzia?

  • Chcę uniknąć problemów związanych z bezpieczeństwem hasła zapisanego w wierszu polecenia pgAgent.
  • Chcę uniknąć dodatkowej konfiguracji systemu w celu ukrycia hasła ( ~/.pgpass).

Postgresql 8.3
Linux RedHat 64bit

Stephan
źródło
Czy możesz dodać, dlaczego nie możesz używać pgAgent lub crontab? konkretnie jakich funkcji brakuje.
WrinkleFree
@Rohan Zaktualizowałem swoje pytanie
Stephan
Post wydaje się zostać skopiowany i wklejony na stackoverflow.com/q/16958625/398670
Craig Ringer

Odpowiedzi:

30

Nawet jeśli korzystałeś z wkrótce dostępnej (w momencie pisania) wersji PostgreSQL 10 lub obecnej wersji PostgreSQL 9.6, a nie starej wersji, takiej jak 8.3, nadal nie ma wbudowanego harmonogramu zadań.

Wymagane jest coś takiego jak PgAgent lub zewnętrzne zadania cron, nie ma wygodnego obejścia.

Mam nadzieję, że funkcja pracująca w tle, wprowadzona w 9.3, powinna pozwolić na przeniesienie narzędzia takiego jak PgAgent do rdzenia PostgreSQL w późniejszym wydaniu, ale jeszcze tego nie zrobiono. Nawet w wersji 9.3 nadal musisz uruchomić crona lub pgagenta.

Kilka osób pracuje nad harmonogramami opartymi na pracownikach działających w tle, a nadchodzi kilka poprawek, które powinny zapewnić ułatwienia w tym zakresie. Ale od PostgreSQL 10 nadal nie ma dobrej jakości, powszechnie przyjętego harmonogramu, a większość ludzi korzysta z harmonogramu zadań cron / ms / itp.

Zobacz także zasady dotyczące wersji ; używasz przestarzałej i nieobsługiwanej wersji.

Craig Ringer
źródło
Please take a look at the version policy, aktualizacja Postgresql nie jest opcją.
Stephan
2
@Alex W pewnym momencie będziesz musiał dokonać aktualizacji, a będzie to tylko trudniejsze. Nawiasem mówiąc, jakie wydanie 8.3 pkt.? Ile znaczących poprawek brakuje? A może masz co najmniej 8.3.23? To powiedziawszy, jak wyjaśniłem, pożądana funkcja nie istnieje nawet w nadchodzącej wersji 9.3, chociaż dodano pewne podstawy umożliwiające jej dodanie.
Craig Ringer
Porozmawiam z moim szefem :)
Stephan
1
@Alex Dobry pomysł :-). Przy minimalnej aktualizacji do 8.3.23 natychmiast rozpocznij pracę nad planami aktualizacji do nowszej wersji. To nie rozwiąże tego pytania, ale bardzo dobrym pomysłem jest uratowanie przyszłego bólu. Liczba obsługiwanych przeze mnie klientów, którzy mają problemy, których nigdy by nie mieli, gdyby byli na bieżąco, jest niesamowita. Nie wydajemy nowych wersji tylko dla kopnięć ;-). Zapoznaj się z uwagami do wydania dla każdej wersji .0, aby uzyskać wskazówki na temat rzeczy, z którymi możesz sobie poradzić, i przeczytaj instrukcję dotyczącą aktualizacji. Twoje jedyne prawdopodobne punkty bólu to standard_conforming_stringsi bytea_output.
Craig Ringer
Craig, co sądzisz o pg_cron?
mehmet
21

Począwszy od PostgreSQL 9.5, możesz używać rozszerzenia pg_cron , które jest ładowane jako biblioteka współdzielona do PostgreSQL.

Po skonfigurowaniu utworzenie zadania jest dość proste:

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

Spowoduje to uruchomienie polecenia delete zgodnie z określonym harmonogramem cron. Możesz także użyć @rebootdo zaplanowania zadania po ponownym uruchomieniu serwera, a pg_cron automatycznie uruchomi zadania, jeśli promujesz gorący stan gotowości.

Zamiast używać .pgpass, możesz zapewnić dostęp do hosta lokalnego dla użytkownika cron w pg_hba.conf.

Marco Slot
źródło
-1

Naprawdę, naprawdę nie chcesz tego robić. Postgres nie jest systemem operacyjnym, to serwer bazy danych. Nawet jeśli baza danych obsługuje uruchamianie zaplanowanych zadań, nie jest dobrym pomysłem nadużywanie takiej bazy danych.

Jeśli martwisz się, że nie chcesz konfigurować hasła i innych elementów, łatwo to rozwiązać. Skonfiguruj lokalne połączenie z gniazdem uniksowym, używając zamiast tego uwierzytelniania zaufania lub tożsamości , uruchom cronjob jako ten użytkownik.

W konfiguracji „po wyjęciu z pudełka” zazwyczaj postgres konfiguruje użytkownika systemu postgresdo uruchamiania serwera db, a ten użytkownik systemu jest zwykle już wstępnie skonfigurowany, aby mógł połączyć się z serwerem lokalnym za pomocą uwierzytelnienia zaufania podczas łączenia przez lokalne gniazdo unix. Możesz uruchomić cronjob jako użytkownik systemu postgres, połączyć się z lokalnym gniazdem, a następnie zmienić rolę, jeśli nie chcesz, aby procedura składowana działała z uprawnieniami administratora.

W domyślnej konfiguracji możesz po prostu to zrobić:

$ sudo -u postgres crontab -e

W edytorze dodaj do wpisu crontab w następujący sposób:

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

a w pliku /path/to/run_stored_procedure.sh wystarczy użyć psql, aby wywołać procedurę sklepów

#!/usr/bin/env bash
psql my_db_name <<END
    SET ROLE limited_user;
    SELECT my_stored_proc();
    SELECT 1 FROM my_stored_proc();
END
Lie Ryan
źródło
1
„nie jest dobrym pomysłem nadużywanie takiej bazy danych”. Jak myślisz, dlaczego to nadużycie? Różne główne RDBMS mają podobne podejście i nie sądzę, że jest to takie straszne. Ponadto, jeśli nie masz dostępu do systemu operacyjnego, brakuje Ci crontab.
dezso