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 ini, lihat What is pg_cron?
Ekstensi pg_cron
didukung pada mesin RDS for PostgreSQL versi 12.5 dan yang lebih tinggi.
Untuk mempelajari selengkapnya tentang penggunaan pg_cron
, lihat Menjadwalkan pekerjaan dengan pg_cron di RDS for PostgreSQL atau basis data Aurora Edisi Kompatibel PostgreSQL
Topik
Menyiapkan ekstensi pg_cron
Siapkan ekstensi pg_cron
sebagai berikut:
-
Modifikasi grup parameter kustom yang terkait dengan instans DB PostgreSQL Anda dengan menambahkan
pg_cron
ke nilai parametershared_preload_libraries
.Jika instans DB RDS for PostgreSQL menggunakan parameter
rds.allowed_extensions
untuk secara eksplisit mencantumkan ekstensi yang dapat diinstal, Anda perlu menambahkan ekstensipg_cron
ke daftar. Hanya versi RDS for PostgreSQL tertentu yang mendukung parameterrds.allowed_extensions
. Secara default, semua ekstensi yang tersedia diizinkan. Untuk informasi selengkapnya, lihat Membatasi pemasangan ekstensi Postgre SQL.
Mulai ulang instans DB PostgreSQL untuk menerapkan perubahan pada grup parameter. Untuk mempelajari selengkapnya tentang penggunaan grup parameter, lihat Memodifikasi parameter dalam grup parameter DB di Amazon RDS Aurora.
-
Setelah instans DB PostgreSQL dimulai ulang, jalankan perintah berikut menggunakan akun yang memiliki izin
rds_superuser
. Misalnya, jika Anda menggunakan pengaturan default saat membuat instans DB RDS for PostgreSQL, hubungkan 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 basis data lain dalam instans DB PostgreSQL Anda, lihat contoh di Menjadwalkan pekerjaan cron untuk basis data selain basis data default.
Mengizinkan 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 hanya berikan izin yang diperlukan ke skema cron
sesuai kebutuhan ketika skema ini dapat 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
;
Ini memberikan db-user
izin untuk mengakses cron
skema untuk menjadwalkan pekerjaan cron untuk objek yang mereka memiliki izin untuk mengakses. 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 membuat pekerjaan pg_cron
, periksa apakah pengaturan jumlah max_worker_processes
lebih besar dari 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 pada waktu yang Anda pilih.
Berikut adalah contoh penggunaan fungsi cron.schedule
guna menyiapkan pekerjaan untuk menggunakan VACUUM FREEZE
pada tabel tertentu setiap hari pada 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 riwayatnya 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 ukurannya bisa menjadi sangat besar dari waktu ke waktu. Sebaiknya jadwalkan pekerjaan untuk membersihkan tabel ini. Sebagai contoh, menyimpan entri selama seminggu mungkin sudah cukup untuk tujuan pemecahan masalah.
Contoh berikut ini menggunakan fungsi cron.schedule untuk menjadwalkan pekerjaan yang berjalan setiap hari pada tengah malam untuk membersihkan tabel cron.job_run_details
. Pekerjaan ini hanya menyimpan 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 .
Mencatat log kesalahan ke file postgresql.log saja
Untuk mencegah penulisan ke tabel cron.job_run_details
, modifikasi grup parameter yang terkait dengan instans DB PostgreSQL dan nonaktifkan parameter cron.log_run
. 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 Amazon RDS 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
Semua metadata untuk pg_cron
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:
catatan
Hanya pengguna dengan rds_superuser
peran atau rds_superuser
hak istimewa yang dapat mencantumkan semua pekerjaan cron dalam database. Pengguna lain hanya dapat melihat pekerjaan mereka sendiri di cron.job
tabel.
-
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 kolom basis data ditentukan dengan 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 What is 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 penyimpanan metadata |
cron.host |
Nama host untuk menghubungkan ke PostgreSQL. Anda tidak dapat mengubah nilai ini. |
cron.log_run |
Catat log setiap pekerjaan yang berjalan di tabel |
cron.log_statement |
Catat log 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 mengembalikan nilai bigint
yang mewakili pengidentifikasi pekerjaan. Untuk menjadwalkan pekerjaan agar berjalan di basis data lain dalam instans DB PostgreSQL Anda, lihat contoh di Menjadwalkan pekerjaan cron untuk basis data selain basis data default.
Fungsi ini memiliki dua format sintaks.
- Sintaks
-
cron.schedule (job_name, schedule, command ); cron.schedule (schedule, command );
- Parameter
-
Parameter Deskripsi job_name
Nama pekerjaan cron.
schedule
Teks yang menunjukkan jadwal pekerjaan cron. Formatnya adalah format cron standar.
command
Teks perintah yang akan dijalankan. - 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 pekerjaan. Fungsi akan mengembalikan Boolean yang menunjukkan keberhasilan atau kegagalan.
Fungsi memiliki format sintaks berikut.
- Sintaks
-
cron.unschedule (job_id); cron.unschedule (job_name);
- Parameter
-
Parameter Deskripsi job_id
Pengidentifikasi pekerjaan yang dikembalikan dari fungsi
cron.schedule
saat pekerjaan cron dijadwalkan.job_name
Nama pekerjaan cron yang dijadwalkan dengan fungsi
cron.schedule
. - 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 harus dilakukan menggunakan fungsi pentingSebaiknya jangan memberikan pembaruan atau memasukkan hak istimewa secara langsung ke tabel ini. Hal tersebut akan memungkinkan pengguna untuk memperbarui kolom |
cron.job_run_details |
Berisi informasi historis tentang pekerjaan terjadwal yang telah dijalankan sebelumnya. Hal ini berguna untuk menyelidiki status, pesan kembali, dan waktu mulai dan akhir dari pekerjaan yang berjalan. catatanAgar ukuran tabel ini tidak bertambah besar, bersihkan secara rutin. Sebagai contoh, lihat Membersihkan tabel riwayat pg_cron. |