Postgresql'de yinelenen görevler harici bir cron benzeri araç olmadan nasıl gerçekleştirilir?


41

Düzenli olarak saklı yordam çağırmak istiyorum. Oracle'da bunun için bir iş yaratacağım. Postgresql'in harici bir araç (cron vb.) Ve PgAgent kullanarak bu durumu taklit edebileceğini öğrendim.

Dış aracı içermeyen "iç" bir alternatif biliyor musunuz?

  • PgAgent'ın komut satırında depolanan şifre ile güvenlik endişelerinden kaçınmak istiyorum.
  • Şifreyi ( ~/.pgpass) gizlemek için herhangi bir ek sistem yapılandırmasından kaçınmak istiyorum .

Postgresql 8.3
Linux RedHat 64bit


PgAgent veya crontab'ı neden kullanamadığınızı ekleyebilir misiniz? özellikle hangi özellikler eksik ..
WrinkleFree

@Rohan Sorumu güncellendi
Stephan

Yanıtlar:


30

Yakında piyasaya sürülecek (yazarken) PostgreSQL 10 veya mevcut PostgreSQL 9.6'yı 8.3 gibi eski bir sürümle çalıştırmamış olsanız bile, hala yerleşik bir görev zamanlayıcısı yoktur.

PgAgent veya harici cron işleri gibi bir şey gereklidir, uygun bir geçici çözüm yoktur.

9.3'te sunulan arka plan çalışanları özelliği, PgAgent gibi bir aracın daha sonraki bir sürümde PostgreSQL çekirdeğine taşınmasına izin vermelidir, ancak henüz yapılmamıştır. 9.3'te bile cron veya pgagent çalıştırmanız gerekiyor.

Birkaç kişi arka plan çalışanı tabanlı programlayıcılar üzerinde çalışıyor ve bu konuda yardımcı olacak olanakları sağlayacak bazı yamalar var. Ancak PostgreSQL 10'dan itibaren hala iyi bir kalite, yaygın olarak benimsenen zamanlayıcı yoktur ve çoğu insan cron / ms görev zamanlayıcısı / vb. Kullanır.

Lütfen sürüm politikasına da bir göz atın ; eski ve desteklenmeyen bir sürüm yayınlıyorsunuz.


Please take a look at the version policy, Postgresql yükseltme bir seçenek değildir.
Stephan,

2
@Alex Bir noktada yükseltme yapmanız gerekecek ve bu sadece daha da zorlaşacak. Bu arada, 8.3 puan kaçış? Kaç tane önemli hata düzeltmesi eksik? Yoksa en azından 8.3.23'te misin? Bununla birlikte, istediğiniz özelliği açıkladığım gibi, gelecek 9.3 sürümünde bile mevcut değil, eklenmesine izin verecek temel çalışmalar da eklenmiş.
Craig Ringer,

Patronumla konuşacağım :)
Stephan

1
@Alex İyi fikir :-). En az 8.3.23 güncellemesinde acilen, daha sonra yeni bir sürüm için yükseltme planları üzerinde çalışmaya başlayın. Bu soruyu çözmeyecek, ancak gelecekteki acıyı kurtarmak için çok iyi bir fikir. Güncel kalmaları durumunda, asla problem yaşamamış oldukları desteklediğim müşteri sayısı şaşırtıcı. Sadece tekmeler için yeni sürümler yayınlamıyoruz ;-). Başa çıkmanız gerekebilecek şeyler hakkında bilgi almak için her .0 sürümü için sürüm notlarını okuyun ve yükseltme ile ilgili kılavuzu okuyun. Tek olası ağrı puanınız standard_conforming_stringsve bytea_output.
Craig Ringer,

Craig, pg_cron hakkında ne düşünüyorsun?
mehmet

21

PostgreSQL 9.5'ten itibaren, paylaşılan bir kitaplık olarak yüklenen pg_cron uzantısını PostgreSQL'e kullanabilirsiniz.

Ayarladıktan sonra, bir iş oluşturmak oldukça basittir:

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

Bu, belirtilen cron programına göre delete komutunu çalıştıracaktır. Ayrıca @reboot, sunucu yeniden başlatıldığında bir iş zamanlamak için kullanabilirsiniz ve sıcak bir bekleme modunu teşvik ederseniz pg_cron otomatik olarak işleri başlatmaya başlayacaktır.

.Pgpass kullanmak yerine, pg_hba.conf dosyasındaki cron kullanıcısına localhost erişimi sağlayabilirsiniz.


-1

Gerçekten, gerçekten bunu yapmak istemiyorsun. Postgres bir işletim sistemi değil, bir veritabanı sunucusu. Veritabanı zamanlanmış görevlerin çalışmasını desteklese bile, veritabanını kötüye kullanmak gerçekten iyi bir fikir değildir.

Endişeniz, parola ve malzeme ayarlamak istemiyorsanız, çözülmesi kolaydır. Bir ayarlama güven veya ident kimlik doğrulaması kullanarak yerel Unix soket bağlantısı yerine, o kullanıcı olarak cronjob çalıştırın.

Kutu dışı yapılandırmasında, genellikle postgres, sistem kullanıcısını postgresdb sunucusunu çalıştırması için ayarlar ve bu sistem kullanıcısı zaten önceden yapılandırılmıştır, böylece yerel unix soketi ile bağlanırken, güven kimlik doğrulaması kullanarak yerel sunucuya bağlanabilir. Cronjob'ınızı postgres sistemi kullanıcısı olarak çalıştırabilir, yerel prize bağlanabilir ve ardından saklı yordamınızın süper kullanıcı ayrıcalığıyla çalışmasını istemiyorsanız rolünü değiştirebilirsiniz .

Varsayılan ayarlarda, sadece şunu yapabilirsiniz:

$ sudo -u postgres crontab -e

Editörde crontab girişine şöyle ekleyin:

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

ve /path/to/run_stored_procedure.sh dosyanızda mağaza prosedürlerinizi çağırmak için sadece psql kullanın.

#!/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
'Veritabanını bu şekilde kötüye kullanmak gerçekten iyi bir fikir değil' Neden kötüye kullandığını düşünüyorsun? Farklı ana akım RDBMS'ler benzer yaklaşımlara sahip olma eğilimindedir ve bence çok fena değil. Ayrıca, işletim sistemine erişiminiz yoksa, crontab'da yoksundur.
dezso
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.