ApsaraDB RDS untuk PostgreSQL mendukung ekstensi pg_cron untuk penjadwalan tugas. Ekstensi ini menggunakan penjadwalan berbasis cron dengan sintaks yang sama seperti utilitas cron standar. Anda dapat mengonfigurasi tugas terjadwal secara langsung di dalam database menggunakan perintah SQL.
Ikhtisar
pg_cron adalah ekstensi penjadwalan berbasis cron yang menggunakan sintaks yang sama seperti utilitas cron standar. Ekstensi ini memungkinkan Anda mengonfigurasi tugas terjadwal secara langsung di dalam database melalui perintah SQL. Untuk informasi selengkapnya, lihat pg_cron.
Setiap tugas terjadwal terdiri dari dua bagian utama: scheduling dan action. Sebagai contoh, pertimbangkan tugas berikut yang menghapus data kedaluwarsa dari tabel `events` pada pukul 03.30 (UTC) setiap hari Sabtu: SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);.
Scheduling didefinisikan oleh ekspresi cron
30 3 * * 6, yang menjadwalkan tugas pada pukul 03.30 (GMT) setiap hari Sabtu. Dalam sintaks cron, * berarti Runs At Any Time, sedangkan angka tertentu berarti Runs Only At This Time.┌───────────── menit: 0-59 │ ┌────────────── jam: 0-23 │ │ ┌─────────────── tanggal bulan: 1-31 │ │ │ ┌──────────────── bulan: 1-12 │ │ │ │ ┌───────────────── hari dalam minggu: 0-6 (0 adalah Minggu) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * * * * *Anda dapat menggunakan situs web crontab.guru untuk membuat dan memahami pengaturan waktu tugas terjadwal pg_cron.
Action adalah
$$DELETE FROM events WHERE event_time < now() - interval '1 week'$$, yang menghapus data kedaluwarsa dari tabel `events`.
Prasyarat
Instans menjalankan ApsaraDB RDS untuk PostgreSQL versi 10 atau yang lebih baru.
Versi mesin minor instans adalah 20250430 atau yang lebih baru.
PentingEkstensi ini didukung pada beberapa versi mesin minor yang lebih lama dari 20250430. Namun, untuk menstandarkan manajemen ekstensi dan meningkatkan keamanan ApsaraDB RDS untuk PostgreSQL, Alibaba Cloud telah mengatasi risiko keamanan pada ekstensi selama iterasi versi mesin minor. Akibatnya, Anda tidak dapat membuat ekstensi ini pada instans yang menjalankan versi mesin minor tersebut. Untuk informasi selengkapnya, lihat Pembatasan pembuatan ekstensi.
Jika instans Anda menjalankan versi mesin minor yang lebih lama dari 20250430 dan Anda telah menggunakan ekstensi ini, penggunaan ekstensi Anda tidak terpengaruh.
Jika Anda ingin membuat ekstensi ini untuk pertama kalinya atau membuat ulang, Anda harus memperbarui versi mesin minor ke versi terbaru.
Anda telah membuat Akun istimewa. Untuk informasi selengkapnya tentang cara membuat Akun istimewa, lihat Buat akun.
Catatan penggunaan
Secara default, tugas terjadwal dijalankan dalam Coordinated Universal Time (UTC). Saat menyiapkan tugas, Anda harus mengonversi waktunya berdasarkan parameter TIMEZONE database Anda. Jika tugas terjadwal tidak dipicu sesuai harapan, Anda dapat menyiapkan tugas yang berjalan setiap menit untuk memeriksa ketersediaan ekstensi. Contohnya:
SELECT cron.schedule('* * * * *', 'SELECT 1;');Tugas terjadwal disimpan di database `postgres` default. Namun, Anda dapat mengkueri tugas terjadwal tersebut dari database lain.
Ekstensi pg_cron diinstal di database yang ditentukan oleh parameter
cron.database_name. Nilai default parametercron.database_nameadalahpostgres. Jika Anda ingin menginstal ekstensi pg_cron di database lain, Anda harus mengubah nilai parametercron.database_name. Untuk informasi selengkapnya, lihat Atur parameter instans.Ekstensi pg_cron didukung pada instans yang menjalankan ApsaraDB RDS untuk PostgreSQL 10, 11, atau 12 dengan versi mesin minor yang lebih lama dari 20201130. Namun, ekstensi tersebut telah ditingkatkan. Kami menyarankan agar Anda meningkatkan versi mesin minor ke versi terbaru. Jika Anda menggunakan pg_cron sebelum peningkatan, Anda harus membuat ulang ekstensi tersebut untuk menggunakan fitur-fitur barunya. Catatan: Saat Anda membuat ulang ekstensi, tugas terjadwal yang ada akan dihapus.
Anda harus menggunakan Akun istimewa untuk membuat atau menghapus ekstensi pg_cron. Untuk informasi selengkapnya tentang cara membuat Akun istimewa, lihat Buat akun.
Cara menggunakan ekstensi
Ekstensi pg_cron diinstal di database yang ditentukan oleh parameter cron.database_name. Database default adalah postgres. Perintah yang didukung oleh ekstensi hanya dapat dijalankan di database tersebut. Untuk informasi selengkapnya tentang cara menggunakan ekstensi pg_cron, lihat pg_cron.
Buat ekstensi
Instal ekstensi dari Konsol
Buka halaman Instances. Di bilah navigasi atas, pilih wilayah tempat instans berada. Lalu, temukan instans tersebut dan klik ID-nya.
Di panel navigasi kiri, klik Extension Management.
Di halaman Extension Management > Uninstalled Extensions, temukan ekstensi pg_cron. Pilih database tempat ekstensi akan diinstal dan klik Install.
Di kotak dialog, pilih Akun istimewa dan klik Install untuk menginstal ekstensi pada database tujuan.
Status instans berubah menjadi Maintaining Instance selama proses instalasi. Ekstensi berhasil diinstal ketika status berubah menjadi Running.
Instal ekstensi menggunakan perintah SQL
Atur parameter instans. Tambahkan pg_cron ke Running Parameter Value untuk parameter shared_preload_libraries. Misalnya, ubah Running Parameter Value menjadi
'pg_stat_statements, auto_explain, pg_cron'.Gunakan Akun istimewa untuk terhubung ke database tujuan dan jalankan pernyataan SQL berikut.
CREATE EXTENSION pg_cron;CatatanAnda dapat menjalankan
SELECT * FROM pg_extensionuntuk melihat ekstensi yang telah diinstal.
Buat tugas terjadwal
SELECT cron.schedule('<Task Name>','<Schedule>', '<Action>');CatatanNama tugas bersifat opsional. Saat tugas dibuat, ID tugasnya dikembalikan.
Contoh:
-- Hapus data kedaluwarsa pada pukul 03.30 (UTC) setiap hari Sabtu. SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$); ---------- -- Jalankan pekerjaan vacuum pada pukul 10.00 (UTC) setiap hari. SELECT cron.schedule('0 10 * * *', 'VACUUM');Buat tugas terjadwal di database tertentu
SELECT cron.schedule_in_database('<Task Name>', '<Schedule>', '<Action>', '<Database>');PentingAnda harus menentukan nama tugas. Jika tidak, tugas tidak dapat dibuat.
Jika instans ApsaraDB RDS untuk PostgreSQL Anda menjalankan versi mesin minor yang lebih lama dari 20230530, gunakan perintah berikut. Jika Anda tidak menentukan database, tugas akan dijalankan di database yang ditentukan oleh parameter
cron.database_name. Database default adalahpostgres.SELECT cron.schedule('<Schedule>', '<Action>', '<Database>')Contoh:
SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'some_other_database');Lihat daftar tugas terjadwal
SELECT * FROM cron.job;Hapus tugas terjadwal
SELECT cron.unschedule(<Task ID>);Jika Anda menentukan nama untuk tugas terjadwal tersebut, Anda juga dapat menghapus tugas berdasarkan namanya.
SELECT cron.unschedule('<Task Name>');Contoh:
-- Hapus berdasarkan ID tugas SELECT cron.unschedule(43); -- Hapus berdasarkan nama tugas SELECT cron.unschedule('test01');Hapus ekstensi
DROP EXTENSION pg_cron;CatatanHanya Akun istimewa yang dapat menjalankan perintah ini.
Anda juga dapat menguninstall ekstensi di tab Installed Extensions pada halaman Extension Management.