Di AnalyticDB for PostgreSQL, gunakan ekstensi pg_cron untuk menjadwalkan pekerjaan pada waktu tertentu. Fitur ini ideal untuk mengotomatiskan tugas berulang seperti pembaruan data, pencadangan, atau pembersihan data kedaluwarsa. Otomatisasi ini menghemat waktu dan upaya dengan memastikan tugas dijalankan secara andal dan tepat waktu, sehingga meningkatkan efisiensi serta manajemen sistem.
Cara kerja
pg_cron adalah penjadwal pekerjaan berbasis cron yang menggunakan sintaksis standar cron dan memungkinkan Anda menjalankan perintah PostgreSQL langsung dari database.
Pekerjaan terjadwal terdiri dari dua bagian utama:
Command: Tugas yang akan dijalankan, seperti
VACUUM.Schedule: Waktu saat tugas dijalankan, misalnya sekali setiap menit.
Jadwal menggunakan sintaksis cron standar:
┌───────────── minute (0 - 59) │ ┌────────────── hour (0 - 23) │ │ ┌─────────────── day of month (1 - 31) │ │ │ ┌──────────────── month (1 - 12) │ │ │ │ ┌───────────────── day of week (0 - 6, 0 is Sunday) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * **: Mewakili nilai apa pun.Bilangan spesifik: Hanya dijalankan pada waktu tersebut.
,: Memisahkan beberapa nilai.-: Menentukan rentang nilai./: Menentukan nilai langkah (step).
Untuk membuat atau melihat pratinjau jadwal, kunjungi Crontab.guru.
Contoh:
Setiap Sabtu pukul 03.30 (GMT):
30 3 * * 6Pukul 01.45 (GMT) pada tanggal 1 dan 30 setiap bulan:
45 1 1,30 * *Setiap hari kerja (Senin hingga Jumat) pukul 03.00 (GMT):
00 3 * * 1-5Setiap dua jam tepat, dari pukul 08.00 hingga 20.00 (GMT):
0 8-20/2 * * *
Catatan penggunaan
Pekerjaan terjadwal dijalankan dalam Greenwich Mean Time (GMT), yang setara dengan Coordinated Universal Time (UTC). Saat menjadwalkan pekerjaan, konversikan waktu lokal Anda ke GMT.
Semua pekerjaan terjadwal disimpan di dan harus di-query dari database default
postgres.Jika versi instans Anda lebih awal dari v6.3.6.0 (untuk AnalyticDB for PostgreSQL V6.0), v7.0.3.0 (untuk AnalyticDB for PostgreSQL V7.0), atau v2.0.0.1 (untuk AnalyticDB for PostgreSQL Serverless mode), beberapa fitur yang dijelaskan dalam topik ini mungkin tidak tersedia. Untuk menggunakan semua fitur, perbarui versi minor instans Anda. Petunjuknya tersedia di Upgrade the minor engine version.
Instal atau uninstal ekstensi
Instal ekstensi
AnalyticDB for PostgreSQL menginstal ekstensi pg_cron secara default saat Anda membuat instans. Anda tidak perlu menginstalnya secara manual.
Uninstal ekstensi
Ekstensi pg_cron memiliki dependensi kernel dan tidak dapat dihapus.
Jadwalkan pekerjaan
Jadwalkan pekerjaan
Sintaksis:
SELECT cron.schedule('<schedule>', '<command>');Contoh:
Hapus data kedaluwarsa setiap Sabtu pukul 03.30 (GMT):
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);Jalankan fungsi
test()setiap hari pukul 10.00 (GMT):SELECT cron.schedule('0 10 * * *', 'select test()');Jalankan pernyataan SQL tertentu setiap menit:
SELECT cron.schedule('* * * * *', 'select 1');Jalankan
VACUUM FULLpukul 02.30 (GMT) pada tanggal 1 dan 30 setiap bulan, serta setiap Sabtu dan Minggu:SELECT cron.schedule('30 2 1,30 * 6,0', 'VACUUM FULL');
Tentukan nama pekerjaan
Anda dapat memberikan nama pada pekerjaan terjadwal. Sintaksisnya sebagai berikut:
SELECT cron.schedule('<job_name>', '<schedule>', '<command>');Contoh:
Tetapkan nama pekerjaan terjadwal menjadi "Delete Expired Data":
SELECT cron.schedule('Delete Expired Data','30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);Tetapkan nama pekerjaan terjadwal menjadi "Select Per Minute":
SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1');Tetapkan nama pekerjaan terjadwal menjadi "Do Vacuum":
SELECT cron.schedule('Do Vacuum', '0 23 * * *' , 'VACUUM FULL');
Tentukan database untuk pekerjaan
Pada versi pg_cron sebelum 1.4, pekerjaan hanya dapat dijalankan di database tempat ekstensi diinstal. Untuk menjalankan pekerjaan di database lain, Anda harus memanipulasi tabel cron.job secara langsung, yang tidak praktis dan tidak aman.
Versi pg_cron 1.4 memungkinkan Anda menentukan database dan akun database untuk menjalankan pekerjaan terjadwal. Sintaksisnya sebagai berikut:
SELECT cron.schedule('<job_name>', '<schedule>', '<command>', '<database>', '<username>', '<active>');'<database>': Database tempat pekerjaan dijalankan. Jika tidak ditentukan, default-nya adalah databasepostgres.'<username>: Akun database yang menjalankan pekerjaan. Jika tidak ditentukan, default-nya adalah akun saat ini.'<active>': Menentukan apakah pekerjaan terjadwal diaktifkan. Nilai default-nya adalahtrue.
Contoh:
Jalankan
VACUUMpada databasedwsetiap hari pukul 23.00 (GMT):SELECT cron.schedule('Do Vacuum', '0 23 * * *' , 'VACUUM FULL', 'dw');Jalankan pernyataan SQL tertentu di database
dwsetiap menit sebagai penggunagp1234:SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1', 'dw', 'gp1234');Jalankan fungsi
test()di databasedwsetiap hari pukul 10.00 (GMT) sebagai penggunauser1:SELECT cron.schedule('DO Function', '0 10 * * *', 'select test()', 'dw', 'user1', true);
Perbarui pekerjaan terjadwal
Gunakan fungsi cron.alter_job untuk memperbarui pekerjaan terjadwal. Sintaksisnya sebagai berikut:
SELECT cron.alter_job(<job_id>, '<schedule>', '<command>', '<database>', '<username>', '<active>');<job_id>: Wajib diisi. Ini adalah ID pekerjaan yang dihasilkan secara otomatis, yang dapat Anda temukan di tabelcron.job.Parameter lainnya: Opsional. Jika Anda tidak menentukan nilai untuk parameter opsional, nilainya tetap tidak berubah.
Contoh:
Ubah jadwal pekerjaan dengan ID 3 agar dijalankan setiap hari pukul 11.00 (GMT):
SELECT cron.alter_job(3, '0 11 * * *');Ubah perintah pekerjaan dengan ID 1 menjadi
VACUUM:SELECT cron.alter_job(1, null , 'VACUUM');Ubah pengguna pekerjaan dengan ID 2 menjadi
gp1234:SELECT cron.alter_job(2, null , null, null, 'gp1234');
Lihat detail eksekusi pekerjaan
Tabel cron.job_run_details mencatat detail setiap eksekusi pekerjaan.
Dengan banyaknya pekerjaan terjadwal, tabel cron.job_run_details dapat menjadi sangat besar. Jadwalkan pekerjaan untuk membersihkan tabel ini secara berkala. Jika Anda tidak perlu mencatat detail eksekusi pekerjaan, Anda juga dapat Submit a ticket untuk meminta dukungan teknis menonaktifkan pencatatan log dengan mengatur cron.log_run menjadi false.
Contoh:
Lihat detail semua pekerjaan yang gagal:
SELECT * FROM cron.job_run_details WHERE status = 'failed';Lihat detail eksekusi pekerjaan dengan ID 1:
SELECT * FROM cron.job_run_details WHERE jobid = '1';
Lihat daftar pekerjaan terjadwal
Contoh:
SELECT * FROM cron.job;Batalkan penjadwalan pekerjaan
Batalkan penjadwalan pekerjaan berdasarkan namanya. Sintaksisnya sebagai berikut:
SELECT cron.unschedule('<job_name>');Pentingpg_cronmemungkinkan Anda membuat pekerjaan dengan nama duplikat. Jika Anda membatalkan penjadwalan pekerjaan berdasarkan nama yang digunakan oleh beberapa pekerjaan,pg_cronhanya menghapus pekerjaan denganjobidterkecil.Contoh:
Batalkan penjadwalan pekerjaan bernama 'Do Vacuum':
SELECT cron.unschedule('Do Vacuum');Batalkan penjadwalan pekerjaan berdasarkan ID-nya. Sintaksisnya sebagai berikut:
SELECT cron.unschedule(<job_id>);pg_cronmenghasilkan ID pekerjaan secara otomatis saat Anda membuat pekerjaan tersebut. Anda dapat menemukanjobiddi tabelcron.job.Contoh:
Batalkan penjadwalan pekerjaan dengan ID 21:
SELECT cron.unschedule(21);
Dokumen terkait
Untuk informasi selengkapnya tentang pg_cron, lihat repositori pg_cron di GitHub.
Jika instans Anda adalah instans RDS for PostgreSQL, lihat Scheduled jobs (pg_cron).