Menjadwalkan pemeliharaan dengan ekstensi pg_cron PostgreSQL - Amazon Aurora

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? dalam dokumentasi 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.

Menyiapkan ekstensi pg_cron

Siapkan ekstensi pg_cron sebagai berikut:

  1. Ubah grup parameter kustom yang terkait dengan instans DB PostgreSQL Anda dengan menambahkan pg_cron ke nilai parameter shared_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.

  2. 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 pengguna postgres dan buat ekstensi.

    CREATE EXTENSION pg_cron;

    Penjadwal pg_cron diatur dalam basis data PostgreSQL default bernama postgres. Objek pg_cron dibuat dalam basis data postgres ini dan semua tindakan penjadwalan berjalan dalam basis data ini.

  3. 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 TO db-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.

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:

  1. 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');
  2. 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;
  3. 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? dalam dokumentasi pg_cron.

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 pg_cron disimpan.

cron.host

Nama host untuk terhubung ke PostgreSQL. Anda tidak dapat mengubah nilai ini.

cron.log_run

Catat setiap pekerjaan yang berjalan di tabel job_run_details. Nilainya adalah on atau off. Untuk informasi selengkapnya, lihat Tabel untuk menjadwalkan pekerjaan dan menangkap status .

cron.log_statement

Catat semua pernyataan cron sebelum menjalankannya. Nilainya adalah on atau off.

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 cron.schedule dan cron.unschedule.

penting

Sebaiknya Anda tidak memberikan pembaruan atau memasukkan hak istimewa secara langsung ke tabel ini. Dengan begitu, pengguna dapat memperbarui kolom username agar berjalan sebagai rds-superuser.

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.

catatan

Untuk mencegah tabel ini berkembang tanpa batas waktu, bersihkan secara teratur. Sebagai contoh, lihat Membersihkan tabel riwayat pg_cron.