Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menjadwalkan pemeliharaan dengan ekstensi pg_cron PostgreSQL
Anda dapat menggunakan ekstensi pg_cron
PostgreSQL untuk menjadwalkan perintah pemeliharaan dalam basis data PostgreSQL. Untuk informasi selengkapnya tentang ekstensi, lihat Apa itu pg_cron
Ekstensi pg_cron
didukung pada mesin Aurora PostgreSQL versi 12.6 dan yang lebih tinggi
Untuk mempelajari selengkapnya tentang penggunaan pg_cron
, lihat Menjadwalkan pekerjaan dengan pg_cron di RDS for PostgreSQL atau basis data Edisi yang kompatibel dengan Aurora PostgreSQL
Topik
Menyiapkan ekstensi pg_cron
Siapkan ekstensi pg_cron
sebagai berikut:
-
Ubah grup parameter kustom yang terkait dengan instans DB PostgreSQL Anda dengan menambahkan
pg_cron
ke nilai parametershared_preload_libraries
.Mulai ulang instans DB PostgreSQL agar perubahan pada grup parameter dapat diterapkan. Untuk mempelajari selengkapnya tentang bekerja menggunakan grup parameter, lihat Parameter Amazon Aurora PostgreSQL.
-
Setelah instans DB PostgreSQL dimulai ulang, jalankan perintah berikut menggunakan akun yang memiliki izin
rds_superuser
. Misalnya, jika Anda menggunakan pengaturan default saat membuat klaster DB Aurora PostgreSQL, sambungkan sebagai penggunapostgres
dan buat ekstensi.CREATE EXTENSION pg_cron;
Penjadwal
pg_cron
diatur dalam basis data PostgreSQL default bernamapostgres
. Objekpg_cron
dibuat dalam basis datapostgres
ini dan semua tindakan penjadwalan berjalan dalam basis data ini. -
Anda dapat menggunakan pengaturan default, atau Anda dapat menjadwalkan pekerjaan untuk berjalan di basis data lain dalam instans DB PostgreSQL Anda. Untuk menjadwalkan pekerjaan untuk basis data lain dalam instans DB PostgreSQL Anda, lihat contoh di Menjadwalkan pekerjaan cron untuk basis data selain basis data default.
Memberikan izin pengguna basis data untuk menggunakan pg_cron
Menginstal ekstensi pg_cron
membutuhkan hak istimewa rds_superuser
. Namun, izin untuk menggunakan pg_cron
dapat diberikan (oleh anggota grup/peran rds_superuser
) kepada pengguna basis data lain, sehingga mereka dapat menjadwalkan pekerjaannya sendiri. Sebaiknya Anda memberikan izin untuk skema cron
hanya sesuai kebutuhan jika skema tersebut meningkatkan operasi di lingkungan produksi Anda.
Untuk memberikan izin pengguna basis data dalam skema cron
, jalankan perintah berikut:
postgres=>
GRANT USAGE ON SCHEMA cron TOdb-user
;
Perintah ini memberikan izin db-user
untuk mengakses skema cron
untuk menjadwalkan pekerjaan cron untuk objek yang izin aksesnya mereka miliki. Jika pengguna basis data tidak memiliki izin, tugas akan gagal setelah memposting pesan kesalahan ke file postgresql.log
, seperti yang ditunjukkan berikut:
2020-12-08 16:41:00 UTC::@:[30647]:ERROR: permission denied for table table-name
2020-12-08 16:41:00 UTC::@:[27071]:LOG: background worker "pg_cron" (PID 30647) exited with exit code 1
Dengan kata lain, pastikan bahwa pengguna database yang diberikan izin pada cron
skema juga memiliki izin pada objek (tabel, skema, dan sebagainya) yang mereka rencanakan untuk dijadwalkan.
Detail pekerjaan cron dan keberhasilan atau kegagalannya juga ditangkap dalam cron.job_run_details
tabel. Untuk informasi selengkapnya, lihat Tabel untuk menjadwalkan pekerjaan dan menangkap status .
Menjadwalkan pekerjaan pg_cron
Bagian berikut menunjukkan bagaimana Anda dapat menjadwalkan berbagai tugas manajemen menggunakan pekerjaan pg_cron
.
catatan
Saat Anda membuat pekerjaan pg_cron
, periksa apakah pengaturan max_worker_processes
lebih besar dari jumlah cron.max_running_jobs
. Pekerjaan pg_cron
akan gagal jika kehabisan proses pekerja latar belakang. Jumlah default pekerjaan pg_cron
adalah 5
. Untuk informasi selengkapnya, lihat Parameter untuk mengelola ekstensi pg_cron.
Topik
Mengosongkan tabel
Pengosongan otomatis menangani pemeliharaan vakum untuk kebanyakan kasus. Namun, Anda mungkin ingin menjadwalkan pengosongan tabel tertentu di waktu yang Anda pilih.
Berikut adalah contoh penggunaan fungsi cron.schedule
untuk menyiapkan pekerjaan untuk menggunakan VACUUM FREEZE
pada tabel tertentu setiap hari pukul 22.00 (GMT).
SELECT cron.schedule('manual vacuum', '0 22 * * *', 'VACUUM FREEZE pgbench_accounts');
schedule ---------- 1 (1 row)
Setelah contoh sebelumnya berjalan, Anda dapat memeriksa riwayat di tabel cron.job_run_details
seperti berikut.
postgres=>
SELECT * FROM cron.job_run_details;
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time -------+-------+---------+----------+----------+--------------------------------+-----------+----------------+-------------------------------+------------------------------- 1 | 1 | 3395 | postgres | adminuser| vacuum freeze pgbench_accounts | succeeded | VACUUM | 2020-12-04 21:10:00.050386+00 | 2020-12-04 21:10:00.072028+00 (1 row)
Berikut ini adalah query dari cron.job_run_details
tabel untuk melihat pekerjaan gagal.
postgres=>
SELECT * FROM cron.job_run_details WHERE status = 'failed';
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time ------+-------+---------+----------+----------+-------------------------------+--------+--------------------------------------------------+-------------------------------+------------------------------ 5 | 4 | 30339 | postgres | adminuser| vacuum freeze pgbench_account | failed | ERROR: relation "pgbench_account" does not exist | 2020-12-04 21:48:00.015145+00 | 2020-12-04 21:48:00.029567+00 (1 row)
Untuk informasi selengkapnya, lihat Tabel untuk menjadwalkan pekerjaan dan menangkap status .
Membersihkan tabel riwayat pg_cron
Tabel cron.job_run_details
berisi riwayat pekerjaan cron yang bisa menjadi sangat besar dari waktu ke waktu. Sebaiknya Anda menjadwalkan pekerjaan yang membersihkan tabel ini. Misalnya, menyimpan entri yang bernilai setara seminggu mungkin cukup untuk tujuan pemecahan masalah.
Contoh berikut menggunakan fungsi cron.schedule untuk menjadwalkan pekerjaan yang berjalan setiap hari di tengah malam untuk membersihkan tabel cron.job_run_details
. Pekerjaan yang disimpan hanya selama tujuh hari terakhir. Gunakan akun rds_superuser
untuk menjadwalkan pekerjaan seperti berikut.
SELECT cron.schedule('0 0 * * *', $$DELETE FROM cron.job_run_details WHERE end_time < now() - interval '7 days'$$);
Untuk informasi selengkapnya, lihat Tabel untuk menjadwalkan pekerjaan dan menangkap status .
Kesalahan pengelogan ke file postgresql.log saja
Untuk mencegah penulisan ke tabel cron.job_run_details
, ubah grup parameter yang terkait dengan instans DB PostgreSQL dan atur parameter cron.log_run
ke nonaktif. Ekstensi pg_cron
tidak lagi menulis ke tabel dan menangkap kesalahan ke file postgresql.log
saja. Untuk informasi selengkapnya, lihat Memodifikasi parameter dalam grup parameter DB di Aurora.
Gunakan perintah berikut untuk memeriksa nilai parameter cron.log_run
.
postgres=>
SHOW cron.log_run;
Untuk informasi selengkapnya, lihat Parameter untuk mengelola ekstensi pg_cron.
Menjadwalkan pekerjaan cron untuk basis data selain basis data default
Metadata untuk pg_cron
semua disimpan dalam basis data default PostgreSQL bernama postgres
. Karena pekerja latar belakang digunakan untuk menjalankan pekerjaan pemeliharaan cron, Anda dapat menjadwalkan pekerjaan di salah satu basis data Anda dalam instans DB PostgreSQL:
-
Dalam basis data cron, jadwalkan pekerjaan seperti yang biasa Anda lakukan menggunakan cron.schedule.
postgres=>
SELECT cron.schedule('database1 manual vacuum', '29 03 * * *', 'vacuum freeze test_table');
-
Sebagai pengguna dengan peran
rds_superuser
, perbarui kolom basis data untuk pekerjaan yang baru saja Anda buat agar berjalan di basis data lain dalam instans DB PostgreSQL Anda.postgres=>
UPDATE cron.job SET database = 'database1' WHERE jobid = 106;
-
Verifikasi dengan membuat kueri tabel
cron.job
.postgres=>
SELECT * FROM cron.job;
jobid | schedule | command | nodename | nodeport | database | username | active | jobname ------+-------------+--------------------------------+-----------+----------+----------+-----------+--------+------------------------- 106 | 29 03 * * * | vacuum freeze test_table | localhost | 8192 | database1| adminuser | t | database1 manual vacuum 1 | 59 23 * * * | vacuum freeze pgbench_accounts | localhost | 8192 | postgres | adminuser | t | manual vacuum (2 rows)
catatan
Dalam beberapa situasi, Anda mungkin menambahkan pekerjaan cron yang ingin Anda jalankan di basis data yang berbeda. Dalam kasus tersebut, pekerjaan mungkin mencoba untuk dijalankan dalam basis data default (postgres
) sebelum Anda memperbarui kolom basis data yang benar. Jika nama pengguna memiliki izin, berarti pekerjaan berhasil dijalankan di basis data default.
Referensi untuk ekstensi pg_cron
Anda dapat menggunakan parameter, fungsi, dan tabel berikut dengan ekstensi pg_cron
. Untuk informasi selengkapnya, lihat Apa itu pg_cron?
Topik
Parameter untuk mengelola ekstensi pg_cron
Berikut adalah daftar parameter yang mengontrol perilaku ekstensi pg_cron
.
Parameter | Deskripsi |
---|---|
cron.database_name |
Basis data tempat metadata |
cron.host |
Nama host untuk terhubung ke PostgreSQL. Anda tidak dapat mengubah nilai ini. |
cron.log_run |
Catat setiap pekerjaan yang berjalan di tabel |
cron.log_statement |
Catat semua pernyataan cron sebelum menjalankannya. Nilainya adalah |
cron.max_running_jobs |
Jumlah maksimum pekerjaan yang dapat dijalankan secara bersamaan. |
cron.use_background_workers |
Gunakan pekerja latar belakang, bukan sesi klien. Anda tidak dapat mengubah nilai ini. |
Gunakan perintah SQL berikut untuk menampilkan parameter ini dan nilainya.
postgres=>
SELECT name, setting, short_desc FROM pg_settings WHERE name LIKE 'cron.%' ORDER BY name;
Referensi fungsi: cron.schedule
Fungsi ini menjadwalkan pekerjaan cron. Pada mulanya, pekerjaan dijadwalkan di basis data postgres
default. Fungsi tersebut menampilkan nilai bigint
yang mewakili ID pekerjaan. Untuk menjadwalkan pekerjaan agar berjalan di basis data lain dalam instans DB PostgreSQL Anda, lihat contohnya di Menjadwalkan pekerjaan cron untuk basis data selain basis data default.
Fungsi ini memiliki dua format sintaks.
- Sintaksis
-
cron.schedule (job_name, schedule, command ); cron.schedule (schedule, command );
- Parameter
-
Parameter Deskripsi job_name
Nama pekerjaan cron.
schedule
Teks yang menunjukkan jadwal untuk pekerjaan cron. Formatnya adalah format cron standar.
command
Teks perintah yang akan dijalankan. - Contoh-contoh
-
postgres=>
SELECT cron.schedule ('test','0 10 * * *', 'VACUUM pgbench_history');
schedule ---------- 145 (1 row)
postgres=>
SELECT cron.schedule ('0 15 * * *', 'VACUUM pgbench_accounts');schedule ---------- 146 (1 row)
Referensi fungsi: cron.unschedule
Fungsi ini menghapus pekerjaan cron. Anda dapat menentukan job_name
atau job_id
. Suatu kebijakan memastikan bahwa Anda adalah pemilik guna menghapus jadwal untuk pekerjaan. Fungsi ini menampilkan Boolean yang menunjukkan keberhasilan atau kegagalan.
Fungsi tersebut memiliki format sintaks berikut.
- Sintaksis
-
cron.unschedule (job_id); cron.unschedule (job_name);
- Parameter
-
Parameter Deskripsi job_id
ID pekerjaan yang ditampilkan dari fungsi
cron.schedule
saat pekerjaan cron dijadwalkan.job_name
Nama pekerjaan cron yang dijadwalkan dengan fungsi
cron.schedule
. - Contoh-contoh
-
postgres=>
SELECT cron.unschedule(108);unschedule ------------ t (1 row)
postgres=>
SELECT cron.unschedule('test');
unschedule ------------ t (1 row)
Tabel untuk menjadwalkan pekerjaan dan menangkap status
Tabel berikut digunakan untuk menjadwalkan pekerjaan cron dan mencatat bagaimana pekerjaan tersebut diselesaikan.
Tabel | Deskripsi |
---|---|
cron.job |
Berisi metadata tentang setiap pekerjaan yang dijadwalkan. Sebagian besar interaksi dengan tabel ini akan dilakukan menggunakan fungsi pentingSebaiknya Anda tidak memberikan pembaruan atau memasukkan hak istimewa secara langsung ke tabel ini. Dengan begitu, pengguna dapat memperbarui kolom |
cron.job_run_details |
Berisi informasi historis tentang pekerjaan terjadwal terdahulu yang dijalankan. Hal ini berguna untuk menyelidiki status, pesan kembali, dan waktu mulai dan akhir dari pekerjaan yang berjalan. catatanUntuk mencegah tabel ini berkembang tanpa batas waktu, bersihkan secara teratur. Sebagai contoh, lihat Membersihkan tabel riwayat pg_cron. |