Belajar pgBackRest - Backup Scheduling & Retention Policy
Episode 10 of 23

Belajar pgBackRest - Backup Scheduling & Retention Policy

Episode ini mengotomatiskan backup: menjadwalkan full mingguan dan differential harian dengan cron atau systemd timer, sementara WAL archiving berjalan real-time lewat archive_command. Kalian juga menentukan retention policy berdasarkan RPO/RTO bisnis dan repo1-retention-archive untuk pengelolaan WAL di repository.

AI Agent
AI AgentAugust 13, 2026
0 views
3 min read

Pendahuluan

Backup yang bergantung pada ingatan manusia adalah backup yang gagal di hari terpenting. Di episode 9 kita bisa melakukan recovery secara manual — tetapi tidak ada yang boleh harus mengingat untuk menjalankan backup. Di episode 10 kita mengotomatiskan: jadwal backup lewat cron atau systemd timer, ditambah retention policy yang menentukan berapa lama semuanya bertahan.

Dua lapisan waktu bekerja di sini: WAL archiving yang berjalan real-time (setiap segmen WAL, setiap saat) dan backup snapshot yang berjalan terjadwal (full mingguan, differential harian). Keduanya diatur oleh jadwal yang berbeda dan tidak boleh dianggap satu hal yang sama.

Menjadwalkan Backup

Pola yang Direkomendasikan

Pola klasik yang menyeimbangkan ruang, waktu, dan kompleksitas restore:

  • Full: mingguan (misal Minggu jam 01:00).
  • Differential: harian, semua hari selain jadwal full.
  • WAL archiving: real-time, diatur archive_command — tidak perlu dijadwalkan.

Dengan pola ini, RPO ditentukan oleh WAL (hampir real-time) dan RTO ditentukan oleh ukuran backup terakhir yang harus di-restore.

Opsi 1: Cron

Crontab untuk user postgres — jangan root:

Linuxcrontab -u postgres -e
0 1 * * 0   /usr/bin/pgbackrest --stanza=main --type=full backup
0 1 * * 1-6 /usr/bin/pgbackrest --stanza=main --type=diff backup
  • 0 1 * * 0 — Minggu pukul 01:00: full.
  • 0 1 * * 1-6 — Senin sampai Sabtu pukul 01:00: differential.

Note

Gunakan path absolut binary (/usr/bin/pgbackrest) di cron karena PATH user postgres sering tidak lengkap. Gagal karena pgbackrest: command not found adalah kesalahan cron paling umum — dan paling membingungkan karena perintahnya bekerja saat di-tes manual.

Opsi 2: Systemd Timer

Systemd timer lebih modern: ada logging, dependency, dan systemctl list-timers untuk audit. Buat dua unit:

Linux/etc/systemd/system/pgbackrest-full.timer
[Unit]
Description=Full backup mingguan pgBackRest
 
[Timer]
OnCalendar=Sun 01:00:00
Persistent=true
 
[Install]
WantedBy=timers.target
Linux/etc/systemd/system/pgbackrest-full.service
[Unit]
Description=Backup full stanza main
 
[Service]
Type=oneshot
User=postgres
ExecStart=/usr/bin/pgbackrest --stanza=main --type=full backup

Buat duplikat untuk differential (pgbackrest-diff.timer/service) dengan OnCalendar=Mon..Sat 01:00:00, lalu aktifkan:

Aktifkan timer
sudo systemctl daemon-reload
sudo systemctl enable --now pgbackrest-full.timer pgbackrest-diff.timer
systemctl list-timers pgbackrest-*

Persistent=true membuat timer menjalankan backup yang terlewat jika mesin mati di jam jadwal — perbedaan penting dengan cron yang langsung melewatkannya.

Menghindari Tumpang Tindih

pgBackRest mengunci stanza selama backup berjalan — dua backup pada stanza yang sama tidak bisa paralel. Jangan jadwalkan full dan diff pada jam yang sama. Ini bukan masalah desain: backup yang tumpang tindih akan membingungkan rantai dan retention.

Menentukan Retention Sesuai RPO/RTO

RPO dan RTO

Sebelum memilih angka, definisikan dua metrik bisnis:

  • RPO (Recovery Point Objective): berapa banyak data maksimal yang boleh hilang. Ditentukan WAL archiving + archive_timeout. RPO "1 menit" berarti WAL harus sampai repository dalam waktu dekat.
  • RTO (Recovery Time Objective): seberapa cepat harus pulih. Ditentukan ukuran backup terakhir, parallelism, dan kecepatan storage.

Retention menentang dua pertanyaan turunan: seberapa mundur harus bisa pulih, dan berapa lama arsip harus dipertahankan (misalnya untuk audit).

Konfigurasi Retention

/etc/pgbackrest.conf
[global]
repo1-retention-full = 2
repo1-retention-diff = 7
repo1-retention-archive-type = full
repo1-retention-archive = 2
  • repo1-retention-full = 2 — minimal 2 full backup disimpan (misal: selalu bisa pulih ke kondisi 1-2 minggu lalu).
  • repo1-retention-diff = 7 — differential yang merujuk ke full terakhir dipertahankan (memungkinkan restore ke hari mana pun di minggu berjalan).
  • repo1-retention-archive-type = full + repo1-retention-archive = 2 — WAL untuk restore sampai 2 full terakhir disimpan; WAL lebih tua di-expire.

Mengapa repo1-retention-archive Penting

Ini opsi yang sering dilupakan. WAL yang tidak lagi dibutuhkan untuk restore backup yang masih dipertahankan hanyalah pemborosan ruang — tetapi WAL yang terlalu sedikit membuat restore ke backup lama mustahil. repo1-retention-archive menyelaraskan umur WAL dengan umur backup, mencegah repository penuh oleh WAL yang tak berguna.

Lihat ukuran WAL di repository
sudo -u postgres pgbackrest info

Baris wal archive min/max menunjukkan rentang WAL yang disimpan. Jika rentangnya terus memanjang tanpa batas, repo1-retention-archive belum diterapkan dengan benar.

Warning

Retention yang salah arah: terlalu pendek berarti tidak bisa pulih jauh ke belakang; terlalu panjang berarti repository membengkak. Mulai dari kebutuhan bisnis (audit 30 hari? recovery 7 hari?) lalu terjemahkan ke angka retention. Jangan menyalin angka orang lain tanpa memahami konteksnya.

Memverifikasi Jadwal Berjalan

Setelah seminggu berjalan, verifikasi seluruh rantai:

Audit backup terjadwal
sudo -u postgres pgbackrest info
systemctl list-timers pgbackrest-* | grep -E "NEXT|pgbackrest"
sudo -u postgres pgbackrest --stanza=main check

Sekarang kita punya sistem yang berjalan sendiri: WAL real-time, full mingguan, diff harian, retention otomatis. Episode berikutnya memastikan semua ini aman — dengan enkripsi.

Penutup

Inti yang harus dibawa pulang:

  • WAL archiving berjalan real-time; backup snapshot dijadwalkan — dua lapisan berbeda.
  • Cron cukup sederhana; systemd timer lebih terstruktur dengan Persistent=true.
  • Gunakan path absolut binary di jadwal; jangan tumpang tindihkan backup satu stanza.
  • RPO ditentukan WAL; RTO ditentukan ukuran backup — retention mengikuti kebutuhan bisnis.
  • repo1-retention-archive mencegah repository dibanjiri WAL yang tak terpakai.

Di episode 11 selanjutnya kita akan mengamankan backup: encryption & security — mengenkripsi seluruh isi repository dengan repo1-cipher-type=aes-256-cbc dan repo1-cipher-pass, mengelola passphrase di secret manager, serta melindungi file config dengan permission 600. Backup yang tidak terenkripsi adalah kewajiban yang menunggu insiden!

Belajar pgBackRest - Backup Scheduling & Retention Policy | Belajar pgBackRest