Bagaimana menjalankan tugas berulang di Postgresql tanpa alat seperti cron eksternal?

41

Saya ingin memanggil prosedur tersimpan secara teratur. Di Oracle, saya akan menciptakan pekerjaan untuk ini. Saya telah menemukan bahwa Postgresql dapat meniru ini dengan baik dengan menggunakan alat eksternal (cron dll) dan PgAgent.

Apakah Anda tahu alternatif "internal" yang tidak akan melibatkan alat eksternal?

  • Saya ingin menghindari masalah keamanan dengan kata sandi yang disimpan pada baris perintah pgAgent.
  • Saya ingin menghindari konfigurasi sistem tambahan untuk menyembunyikan kata sandi ( ~/.pgpass).

Postgresql 8.3
Linux RedHat 64bit

Stephan
sumber
Bisakah Anda menambahkan mengapa Anda tidak bisa menggunakan pgAgent atau crontab? khususnya fitur apa yang hilang ..
WrinkleFree
@Rohan Saya telah memperbarui pertanyaan saya
Stephan
Postingan tampaknya telah disalin dan ditempelkan ke stackoverflow.com/q/16958625/398670
Craig Ringer

Jawaban:

30

Bahkan jika Anda menjalankan PostgreSQL 10 yang akan segera dirilis (saat penulisan) atau PostgreSQL 9.6 saat ini bukan rilis kuno seperti 8.3, masih belum ada penjadwal tugas bawaan.

Sesuatu seperti pekerjaan PgAgent atau cron eksternal diperlukan, tidak ada solusi yang nyaman.

Fitur latar belakang pekerja yang diperkenalkan di 9.3 semoga memungkinkan alat seperti PgAgent untuk dipindahkan ke inti PostgreSQL dalam rilis berikutnya, tetapi belum dilakukan. Bahkan pada 9.3 Anda masih harus menjalankan cron atau pgagent.

Beberapa orang sedang mengerjakan penjadwal berbasis pekerja latar belakang, dan ada beberapa tambalan yang datang yang harus menyediakan fasilitas untuk membantu dengan itu. Tetapi pada PostgreSQL 10 masih belum ada kualitas yang baik, penjadwal yang diadopsi secara luas, dan kebanyakan orang menggunakan penjadwal tugas cron / ms / dll.

Silakan lihat kebijakan versi juga; Anda menjalankan rilis yang usang dan tidak didukung.

Craig Ringer
sumber
Please take a look at the version policy, memutakhirkan Postgresql bukanlah suatu pilihan.
Stephan
2
@Alex Anda harus meningkatkan pada titik tertentu, dan itu hanya akan semakin sulit. Ngomong-ngomong, apa yang dikeluarkan 8,3 poin? Berapa banyak perbaikan bug signifikan yang Anda lewatkan? Atau setidaknya Anda berada di 8.3.23? Yang mengatakan, seperti yang saya jelaskan fitur yang Anda inginkan tidak ada bahkan di rilis 9,3 mendatang, meskipun beberapa dasar untuk mengizinkan penambahannya telah ditambahkan.
Craig Ringer
Saya akan bicara dengan bos saya :)
Stephan
1
@ Alex Ide bagus :-). Pada pembaruan minimum ke 8.3.23 mendesak, kemudian mulai bekerja pada rencana peningkatan ke rilis yang lebih baru. Itu tidak akan menyelesaikan pertanyaan ini, tapi itu ide yang sangat bagus untuk menyelamatkan rasa sakit di masa depan. Jumlah pelanggan yang saya dukung yang mengalami masalah yang tidak akan pernah mereka miliki jika mereka tetap bertahan saat ini luar biasa. Kami tidak merilis versi baru hanya untuk iseng ;-). Baca catatan rilis untuk setiap versi .0 untuk panduan tentang hal-hal yang mungkin perlu Anda tangani, dan baca manual tentang peningkatan. Satu-satunya kemungkinan titik nyeri Anda adalah standard_conforming_stringsdan bytea_output.
Craig Ringer
Craig, apa pendapat Anda tentang pg_cron?
mehmet
21

Pada PostgreSQL 9.5, Anda dapat menggunakan ekstensi pg_cron , yang dimuat sebagai pustaka bersama ke PostgreSQL.

Setelah mengaturnya, menciptakan pekerjaan cukup sederhana:

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

Ini akan menjalankan perintah hapus sesuai dengan jadwal cron yang ditentukan. Anda juga dapat menggunakan @rebootuntuk menjadwalkan pekerjaan ketika server memulai kembali, dan pg_cron secara otomatis akan mulai menjalankan pekerjaan jika Anda mempromosikan siaga panas.

Alih-alih menggunakan .pgpass, Anda dapat memberikan akses localhost untuk pengguna cron di pg_hba.conf.

Marco Slot
sumber
-1

Anda benar-benar tidak ingin melakukan ini. Postgres bukan sistem operasi, ini adalah server database. Bahkan jika database mendukung menjalankan tugas yang dijadwalkan, itu bukan ide yang baik untuk menyalahgunakan database seperti itu.

Jika kekhawatiran Anda adalah Anda tidak ingin mengatur kata sandi dan barang, itu mudah diselesaikan. Siapkan koneksi soket Unix lokal menggunakan kepercayaan atau otentikasi identitas , jalankan cronjob Anda sebagai pengguna itu.

Dalam konfigurasi out-of-the-nya, biasanya postgres mengatur pengguna sistem postgresuntuk menjalankan server db, dan pengguna sistem ini biasanya sudah dikonfigurasikan sebelumnya sehingga dapat terhubung ke server lokal menggunakan otentikasi kepercayaan saat menghubungkan melalui soket unix lokal. Anda dapat menjalankan cronjob sebagai pengguna sistem postgres, menyambungkan ke soket lokal, dan kemudian beralih peran jika Anda tidak ingin prosedur tersimpan Anda dijalankan dengan hak superuser.

Dalam pengaturan default, Anda bisa melakukan ini:

$ sudo -u postgres crontab -e

Di editor, tambahkan ke entri crontab seperti:

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

dan dalam file /path/to/run_stored_procedure.sh Anda cukup menggunakan psql untuk memanggil prosedur store Anda

#!/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
sumber
1
'Itu benar-benar bukan ide yang baik untuk menyalahgunakan basis data seperti itu' Mengapa kamu pikir itu penyalahgunaan? RDBMS arus utama yang berbeda cenderung memiliki pendekatan yang sama, dan saya tidak berpikir itu sangat mengerikan. Juga, jika Anda tidak memiliki akses ke OS, Anda tidak memiliki crontab.
dezso