

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\$1cron PostgreSQL
<a name="PostgreSQL_pg_cron"></a>

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\$1cron?](https://github.com/citusdata/pg_cron) dalam dokumentasi pg\$1cron. 

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\$1cron di RDS for PostgreSQL atau basis data Aurora Edisi Kompatibel PostgreSQL](https://aws.amazon.com/blogs/database/schedule-jobs-with-pg_cron-on-your-amazon-rds-for-postgresql-or-amazon-aurora-for-postgresql-databases/).

**catatan**  
Versi `pg_cron` ekstensi ditampilkan sebagai versi dua digit, misalnya, 1.6, dalam tampilan pg\$1available\$1extensions. Meskipun Anda mungkin melihat versi tiga digit, misalnya, 1.6.4 atau 1.6.5, tercantum dalam beberapa konteks, Anda harus menentukan versi dua digit saat melakukan peningkatan ekstensi.

**Topics**
+ [Menyiapkan ekstensi pg\$1cron](#PostgreSQL_pg_cron.enable)
+ [Mengizinkan pengguna basis data untuk menggunakan pg\$1cron](#PostgreSQL_pg_cron.permissions)
+ [Menjadwalkan pekerjaan pg\$1cron](#PostgreSQL_pg_cron.examples)
+ [Referensi untuk ekstensi pg\$1cron](#PostgreSQL_pg_cron.reference)

## Menyiapkan ekstensi pg\$1cron
<a name="PostgreSQL_pg_cron.enable"></a>

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 penginstalan ekstensi PostgreSQL](PostgreSQL.Concepts.General.FeatureSupport.Extensions.md#PostgreSQL.Concepts.General.FeatureSupport.Extensions.Restriction).

   Mulai ulang instans DB PostgreSQL untuk menerapkan perubahan pada grup parameter. Untuk mempelajari selengkapnya tentang penggunaan grup parameter, lihat [](USER_WorkingWithParamGroups.Modifying.md). 

1. 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.

1. 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](#PostgreSQL_pg_cron.otherDB).

## Mengizinkan pengguna basis data untuk menggunakan pg\$1cron
<a name="PostgreSQL_pg_cron.permissions"></a>

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](#PostgreSQL_pg_cron.tables).

## Menjadwalkan pekerjaan pg\$1cron
<a name="PostgreSQL_pg_cron.examples"></a>

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\$1cron](#PostgreSQL_pg_cron.parameters).

**Topics**
+ [Mengosongkan tabel](#PostgreSQL_pg_cron.vacuum)
+ [Membersihkan tabel riwayat pg\$1cron](#PostgreSQL_pg_cron.job_run_details)
+ [Mencatat log kesalahan ke file postgresql.log saja](#PostgreSQL_pg_cron.log_run)
+ [Menjadwalkan pekerjaan cron untuk basis data selain basis data default](#PostgreSQL_pg_cron.otherDB)

### Mengosongkan tabel
<a name="PostgreSQL_pg_cron.vacuum"></a>

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

Lihat juga, [](Appendix.PostgreSQL.CommonDBATasks.Autovacuum.md). 

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](#PostgreSQL_pg_cron.tables).

### Membersihkan tabel riwayat pg\$1cron
<a name="PostgreSQL_pg_cron.job_run_details"></a>

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](#PostgreSQL_pg_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](#PostgreSQL_pg_cron.tables).

### Mencatat log kesalahan ke file postgresql.log saja
<a name="PostgreSQL_pg_cron.log_run"></a>

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 [](USER_WorkingWithParamGroups.Modifying.md). 

Gunakan perintah berikut untuk memeriksa nilai parameter `cron.log_run`.

```
postgres=> SHOW cron.log_run;
```

Untuk informasi selengkapnya, lihat [Parameter untuk mengelola ekstensi pg\$1cron](#PostgreSQL_pg_cron.parameters).

### Menjadwalkan pekerjaan cron untuk basis data selain basis data default
<a name="PostgreSQL_pg_cron.otherDB"></a>

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](#PostgreSQL_pg_cron.schedule).

   ```
   postgres=> SELECT cron.schedule('database1 manual vacuum', '29 03 * * *', 'vacuum freeze test_table');
   ```

1. 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;
   ```

1.  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\$1cron
<a name="PostgreSQL_pg_cron.reference"></a>

Anda dapat menggunakan parameter, fungsi, dan tabel berikut dengan ekstensi `pg_cron`. Untuk informasi selengkapnya, lihat [What is pg\$1cron?](https://github.com/citusdata/pg_cron) dalam dokumentasi pg\$1cron.

**Topics**
+ [Parameter untuk mengelola ekstensi pg\$1cron](#PostgreSQL_pg_cron.parameters)
+ [Referensi fungsi: cron.schedule](#PostgreSQL_pg_cron.schedule)
+ [Referensi fungsi: cron.unschedule](#PostgreSQL_pg_cron.unschedule)
+ [Tabel untuk menjadwalkan pekerjaan dan menangkap status](#PostgreSQL_pg_cron.tables)

### Parameter untuk mengelola ekstensi pg\$1cron
<a name="PostgreSQL_pg_cron.parameters"></a>

Berikut adalah daftar parameter yang mengontrol perilaku ekstensi `pg_cron`. 


| Parameter | Deskripsi | 
| --- | --- | 
| cron.database\$1name |  Basis data penyimpanan metadata `pg_cron`.  | 
| cron.host |  Nama host untuk menghubungkan ke PostgreSQL. Anda tidak dapat mengubah nilai ini.  | 
| cron.log\$1run |  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](#PostgreSQL_pg_cron.tables).  | 
| cron.log\$1statement |  Catat log semua pernyataan cron sebelum menjalankannya. Nilainya adalah `on` atau `off`.  | 
| cron.max\$1running\$1jobs |  Jumlah maksimum pekerjaan yang dapat dijalankan secara bersamaan.  | 
| cron.use\$1background\$1workers |  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
<a name="PostgreSQL_pg_cron.schedule"></a>

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](#PostgreSQL_pg_cron.otherDB).

Fungsi ini memiliki dua format sintaks.

**Sintaks**  

```
cron.schedule (job_name,
    schedule,
    command
);

cron.schedule (schedule,
    command
);
```

**Parameter**      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html)

**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
<a name="PostgreSQL_pg_cron.unschedule"></a>

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**      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html)

**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
<a name="PostgreSQL_pg_cron.tables"></a>

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`.  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\$1run\$1details |  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.  Agar ukuran tabel ini tidak bertambah besar, bersihkan secara rutin. Sebagai contoh, lihat [Membersihkan tabel riwayat pg\$1cron](#PostgreSQL_pg_cron.job_run_details).   | 