Menjadwalkan pemeliharaan dengan ekstensi pg_cron PostgreSQL - Layanan Basis Data Relasional Amazon

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

Menyiapkan ekstensi pg_cron

Siapkan ekstensi pg_cron sebagai berikut:

  1. Modifikasi grup parameter kustom yang terkait dengan instans DB PostgreSQL Anda dengan menambahkan pg_cron ke nilai parameter shared_preload_libraries.

    • Jika instans DB RDS for PostgreSQL menggunakan parameter rds.allowed_extensions untuk secara eksplisit mencantumkan ekstensi yang dapat diinstal, Anda perlu menambahkan ekstensi pg_cron ke daftar. Hanya versi RDS for PostgreSQL tertentu yang mendukung parameter rds.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.

  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 instans DB RDS for PostgreSQL, hubungkan 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 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 TO db-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.

Mengosongkan tabel

Pengosongan otomatis menangani pemeliharaan vakum untuk kebanyakan kasus. Namun, Anda mungkin ingin menjadwalkan pengosongan tabel pada waktu yang Anda pilih.

Lihat juga, .

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.

  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 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? 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 penyimpanan metadata pg_cron.

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 job_run_details. Nilainya adalah on atau off. Untuk informasi selengkapnya, lihat Tabel untuk menjadwalkan pekerjaan dan menangkap status .

cron.log_statement

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

penting

Sebaiknya jangan memberikan pembaruan atau memasukkan hak istimewa secara langsung ke tabel ini. Hal tersebut akan memungkinkan pengguna untuk memperbarui kolom username agar berjalan sebagai rds-superuser.

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.

catatan

Agar ukuran tabel ini tidak bertambah besar, bersihkan secara rutin. Sebagai contoh, lihat Membersihkan tabel riwayat pg_cron.