pg_cron adalah penjadwal pekerjaan berbasis cron untuk PostgreSQL 9.5 dan versi yang lebih baru, yang berjalan langsung di dalam database Anda sebagai ekstensi. Ekstensi ini menggunakan sintaks ekspresi cron standar, sehingga Anda dapat menjadwalkan perintah SQL apa pun—mulai dari eksekusi rutin VACUUM hingga kueri arsip data kustom—tanpa memerlukan penjadwal eksternal.
Sebelum menggunakan pg_cron, tingkatkan kernel Anda ke V1.1.19 atau versi yang lebih baru. Versi sebelumnya memiliki risiko memory leak yang diketahui.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster PolarDB for PostgreSQL yang berjalan dengan kernel V1.1.19 atau versi yang lebih baru
Aktifkan pg_cron
pg_cron dinonaktifkan secara default. Untuk mengaktifkannya, ajukan permohonan akses melalui Quota Center:
Buka Quota Center.
Temukan polardb_pg_pg_cron dalam daftar kuota.
Klik Apply pada kolom Actions.
Anda tidak dapat mengaktifkannya secara manual dengan CREATE EXTENSION.
Catatan penggunaan
Pekerjaan terjadwal dijalankan dalam GMT.
Semua pekerjaan disimpan di database PostgreSQL default, tetapi Anda dapat melakukan kueri terhadapnya dari database mana pun.
Demi pertimbangan keamanan, Anda hanya dapat mengeksekusi tugas terjadwal dengan menggunakan fungsi sistem. Sistem memungkinkan Anda menambah dan menghapus tugas terjadwal. Pengguna biasa hanya dapat melihat tugas terjadwal di tabel
cron.job.
Jadwalkan pekerjaan
Setiap pekerjaan terjadwal memiliki dua komponen: ekspresi cron yang menentukan waktu eksekusinya, dan perintah SQL yang akan dijalankan.
-- Jadwalkan pekerjaan di database PostgreSQL default
SELECT cron.schedule('<cron-expression>', '<sql-command>');
-- Jadwalkan pekerjaan di database tertentu
SELECT cron.schedule('<cron-expression>', '<sql-command>', '<database-name>');Jika Anda menghilangkan parameter database, database PostgreSQL default akan digunakan.
cron.schedule() mengembalikan jobid numerik yang dapat Anda gunakan untuk mengelola pekerjaan tersebut di kemudian hari.
Sintaks ekspresi cron
Ekspresi cron memiliki lima bidang yang dipisahkan spasi:
┌─────────────── Menit (0–59)
│ ┌───────────── Jam (0–23)
│ │ ┌─────────── Tanggal bulan (1–31)
│ │ │ ┌───────── Bulan (1–12)
│ │ │ │ ┌─────── Hari dalam minggu (0–6, di mana 0 = Minggu; 7 tetap menunjukkan hari akhir pekan)
│ │ │ │ │
* * * * *Karakter khusus:
| Karakter | Makna | Contoh |
|---|---|---|
* | Setiap nilai dalam bidang tersebut | * * * * * dijalankan setiap menit |
Contoh
Hapus data kedaluwarsa setiap Sabtu
-- Hapus event yang lebih lama dari 1 minggu pada pukul 03.30 GMT setiap Sabtu
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);Output:
schedule
----------
42Jalankan VACUUM setiap hari
-- Jalankan VACUUM pada pukul 10.00 GMT setiap hari
SELECT cron.schedule('0 10 * * *', 'VACUUM');Output:
schedule
----------
43Jalankan perintah setiap menit
SELECT cron.schedule('* * * * *', 'select 1;');Output:
schedule
----------
44Jalankan perintah pada menit ke-23 setiap jam
SELECT cron.schedule('23 * * * *', 'select 1;');Output:
schedule
----------
45Jalankan perintah pada tanggal 4 setiap bulan
SELECT cron.schedule('* * 4 * *', 'select 1;');Output:
schedule
----------
46Kelola pekerjaan
Lihat pekerjaan terjadwal
SELECT * FROM cron.job;Contoh output:
jobid | schedule | command | nodename | nodeport | database | username | active
-------+-------------+-----------+-----------+----------+----------+----------+--------
43 | 0 10 * * * | VACUUM; | localhost | 5433 | postgres | test | tHapus pekerjaan
-- Hapus pekerjaan dengan jobid 42
SELECT cron.unschedule(42);Output:
unschedule
------------
tNonaktifkan pg_cron
Untuk menonaktifkan ekstensi ini, jalankan:
DROP EXTENSION pg_cron;