PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Ikhtisar Alat Penjadwalan Pekerjaan untuk PostgreSQL

Tidak seperti sistem manajemen basis data lain yang memiliki penjadwal bawaan sendiri (seperti Oracle, MSSQL, atau MySQL), PostgreSQL masih belum memiliki fitur semacam ini.

Untuk menyediakan fungsionalitas penjadwalan di PostgreSQL, Anda perlu menggunakan alat eksternal seperti...

  • Linux crontab
  • Agen pgAgent
  • Ekstensi pg_cron

Dalam blog ini kita akan menjelajahi alat-alat ini dan menyoroti cara mengoperasikannya dan fitur-fitur utamanya.

Crontab Linux

Ini adalah yang tertua, namun, cara yang efisien dan berguna untuk menjalankan tugas penjadwalan. Program ini didasarkan pada daemon (cron) yang memungkinkan tugas dijalankan secara otomatis di latar belakang secara berkala dan secara teratur memverifikasi file konfigurasi ( disebut file crontab) yang menentukan skrip/perintah yang akan dieksekusi dan penjadwalannya.

Setiap pengguna dapat memiliki file crontabnya sendiri dan untuk rilis Ubuntu terbaru berada di: 

/var/spool/cron/crontabs (for other linux distributions the location could be different):

[email protected]:/var/spool/cron/crontabs# ls -ltr

total 12

-rw------- 1 dbmaster crontab 1128 Jan 12 12:18 dbmaster

-rw------- 1 slonik   crontab 1126 Jan 12 12:22 slonik

-rw------- 1 nines    crontab 1125 Jan 12 12:23 nines

Sintaks file konfigurasi adalah sebagai berikut:

mm hh dd mm day <<command or script to execute>>



mm: Minute(0-59)

hh: Hour(0-23)

dd: Day(1-31)

mm: Month(1-12)

day: Day of the week(0-7 [7 or 0 == Sunday])

Beberapa operator dapat digunakan dengan sintaks ini untuk merampingkan definisi penjadwalan dan simbol-simbol ini memungkinkan untuk menentukan beberapa nilai dalam suatu bidang:

Asterisk (*)  - artinya semua kemungkinan nilai untuk suatu bidang

Koma (,) - digunakan untuk menentukan daftar nilai

Dash (-) - digunakan untuk menentukan rentang nilai

Separator (/) - menentukan nilai langkah

Script all_db_backup.sh akan dieksekusi sesuai dengan setiap ekspresi penjadwalan:

0 6 * * * /home/backup/all_db_backup.sh

Pada pukul 6 pagi setiap hari

20 22 * ​​* Sen, Sel, Rab, Kam, Jum /home/backup/all_db_backup.sh

Pukul 22.20, setiap hari kerja

0 23 * * 1-5 /home/backup/all_db_backup.sh

Pada jam 11 malam selama seminggu

0 0/5 14 * * /home/backup/all_db_backup.sh

Setiap lima jam mulai pukul 14.00. dan berakhir pada 14:55, setiap hari

Meskipun tidak terlalu sulit, sintaks ini dapat dibuat secara otomatis di beberapa halaman web.

Jika file crontab tidak ada untuk pengguna, file tersebut dapat dibuat dengan perintah berikut:

[email protected]:~$ crontab -e

atau mempresentasikannya menggunakan parameter -l:

[email protected]:~$ crontab -l

Jika perlu untuk menghapus file ini, parameter yang sesuai adalah -r:

[email protected]:~$ crontab -r

Status daemon cron ditunjukkan oleh eksekusi perintah berikut:

Agen pgAgent

PgAgent adalah agen penjadwalan pekerjaan yang tersedia untuk PostgreSQL yang memungkinkan eksekusi prosedur tersimpan, pernyataan SQL, dan skrip shell. Konfigurasinya disimpan di database postgres di cluster.

Tujuannya adalah agar agen ini berjalan sebagai daemon di sistem Linux dan secara berkala melakukan koneksi ke database untuk memeriksa apakah ada tugas yang harus dijalankan.

Penjadwalan ini mudah dikelola oleh PgAdmin 4, tetapi tidak diinstal secara default setelah pgAdmin diinstal, Anda perlu mendownload dan menginstalnya sendiri.

Selanjutnya dijelaskan semua langkah yang diperlukan agar pgAgent berfungsi dengan baik:

Langkah Pertama

Instalasi pgAdmin 4

$ sudo apt install pgadmin4 pgadmin4-apache

Langkah Kedua

Pembuatan bahasa prosedural plpgsql jika tidak ditentukan

CREATE TRUSTED PROCEDURAL LANGUAGE ‘plpgsql’

     HANDLER plpgsql_call_handler

          HANDLER plpgsql_validator;

Langkah Ketiga

Pemasangan  pgAgent

$ sudo apt-get install pgagent

Langkah Empat

Pembuatan ekstensi pgagent

CREATE EXTENSION pageant 

Ekstensi ini akan membuat semua tabel dan fungsi untuk operasi pgAgent dan selanjutnya ditampilkan model data yang digunakan oleh ekstensi ini:

Sekarang antarmuka pgAdmin sudah memiliki opsi "Pekerjaan pgAgent" untuk mengelola pgAgent: 

Untuk menentukan pekerjaan baru, cukup pilih "Buat" menggunakan tombol kanan pada “pgAgent Jobs”, dan itu akan menyisipkan penunjukan untuk pekerjaan ini dan menentukan langkah-langkah untuk menjalankannya:

Dalam tab “Jadwal” harus ditentukan penjadwalan untuk pekerjaan baru ini :

Terakhir, agar agen berjalan di latar belakang, perlu meluncurkan proses berikut secara manual:

/usr/bin/pgagent host=localhost dbname=postgres user=postgres port=5432 -l 1

Namun demikian, opsi terbaik untuk agen ini adalah membuat daemon dengan perintah sebelumnya.

Ekstensi pg_cron

Pg_cron adalah penjadwal pekerjaan berbasis cron untuk PostgreSQL yang berjalan di dalam database sebagai ekstensi (mirip dengan DBMS_SCHEDULER di Oracle) dan memungkinkan eksekusi tugas database langsung dari database, karena pekerja latar belakang.

Tugas yang harus dilakukan dapat berupa salah satu dari berikut ini:

  • prosedur tersimpan
  • pernyataan SQL
  • Perintah PostgreSQL (sebagai VACUUM, atau VACUUM ANALYZE)

pg_cron dapat menjalankan beberapa pekerjaan secara paralel, tetapi hanya satu program yang dapat dijalankan pada satu waktu.

Jika run kedua harus dimulai sebelum run pertama selesai, maka run kedua akan diantrekan dan akan dimulai segera setelah run pertama selesai.

Ekstensi ini ditetapkan untuk PostgreSQL versi 9.5 atau lebih tinggi.

Instalasi pg_cron

Penginstalan ekstensi ini hanya memerlukan perintah berikut:

[email protected]:~$ sudo apt-get -y install postgresql-10-cron

Memperbarui File Konfigurasi

Untuk memulai pg_cron background worker setelah server PostgreSQL dimulai, Anda perlu menyetel pg_cron ke parameter shared_preload_libraries di postgresql.conf: 

shared_preload_libraries = ‘pg_cron’

Anda juga perlu mendefinisikan dalam file ini, database tempat ekstensi pg_cron akan dibuat, dengan menambahkan parameter berikut:

cron.database_name= ‘postgres’

Sebaliknya, dalam file pg_hba.conf yang mengelola otentikasi, perlu untuk mendefinisikan login postgres sebagai kepercayaan untuk koneksi IPV4, karena pg_cron mengharuskan pengguna tersebut untuk dapat terhubung ke database tanpa memberikan kata sandi apa pun, jadi baris berikut perlu ditambahkan ke file ini:

host postgres postgres 192.168.100.53/32 trust

Metode otentikasi kepercayaan memungkinkan siapa saja untuk terhubung ke database yang ditentukan dalam file pg_hba.conf, dalam hal ini database postgres. Ini adalah metode yang sering digunakan untuk mengizinkan koneksi menggunakan soket domain Unix pada mesin pengguna tunggal untuk mengakses database dan hanya boleh digunakan jika ada perlindungan tingkat sistem operasi yang memadai pada koneksi ke server.

Kedua perubahan memerlukan restart layanan PostgreSQL:

[email protected]:~$ sudo system restart postgresql.service

Penting untuk diperhatikan bahwa pg_cron tidak menjalankan tugas apa pun selama server dalam mode siaga panas, tetapi secara otomatis dimulai saat server dipromosikan.

Pembuatan ekstensi pg_cron

Ekstensi ini akan membuat meta-data dan prosedur untuk mengelolanya, jadi perintah berikut harus dijalankan pada psql:

postgres=#CREATE EXTENSION pg_cron;

CREATE EXTENSION

Sekarang, objek yang diperlukan untuk menjadwalkan pekerjaan sudah ditentukan pada skema cron :

Ekstensi ini sangat sederhana, hanya tabel pekerjaan yang cukup untuk mengelola semua fungsi ini:

Definisi Pekerjaan Baru

Sintaks penjadwalan untuk mendefinisikan tugas pada pg_cron sama dengan yang digunakan pada alat cron, dan definisi tugas baru sangat sederhana, hanya perlu memanggil fungsi cron.schedule:

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(12356,''DAILY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(998934,''WEEKLY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(45678,''DAILY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(1010,''WEEKLY_DATA'');')

select cron.schedule('*/5 * * * *','CALL reporting.p_compute_client_data(1001,''MONTHLY_DATA'');')

select cron.schedule('*/5 * * * *','select reporting.f_reset_client_data(0,''DATA'')')

select cron.schedule('*/5 * * * *','VACUUM')

select cron.schedule('*/5 * * * *','$$DELETE FROM reporting.rep_request WHERE create_dt<now()- interval '60 DAYS'$$)

Penyiapan tugas disimpan di tabel tugas: 

Cara lain untuk mendefinisikan pekerjaan adalah dengan menyisipkan data langsung di cron .tabel pekerjaan:

INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username)

VALUES ('0 11 * * *','call loader.load_data();','postgresql-pgcron',5442,'staging', 'loader');

dan gunakan nilai khusus untuk nodename dan nodeport untuk terhubung ke mesin yang berbeda (serta database lain).

Menonaktifkan Pekerjaan

Sebaliknya, untuk menonaktifkan pekerjaan, Anda hanya perlu menjalankan fungsi berikut:

select cron.schedule(8)

Log Pekerjaan

Log tugas ini dapat ditemukan di file log PostgreSQL /var/log/postgresql/postgresql-12-main.log:


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy tidak ada kesalahan yang diberikan kata sandi

  2. ActiveRecord::Konfigurasi database AdapterNotSpecified tidak menentukan adaptor

  3. Mendapatkan nama fungsi saat ini di dalam fungsi dengan plpgsql

  4. Kueri PostgreSQL berjalan lebih cepat dengan pemindaian indeks, tetapi mesin memilih hash join

  5. Pertahankan UUID di PostgreSQL menggunakan JPA