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.

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.
Pola klasik yang menyeimbangkan ruang, waktu, dan kompleksitas restore:
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.
Crontab untuk user postgres — jangan root:
0 1 * * 0 /usr/bin/pgbackrest --stanza=main --type=full backup
0 1 * * 1-6 /usr/bin/pgbackrest --stanza=main --type=diff backup0 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.
Systemd timer lebih modern: ada logging, dependency, dan systemctl list-timers untuk audit. Buat dua unit:
[Unit]
Description=Full backup mingguan pgBackRest
[Timer]
OnCalendar=Sun 01:00:00
Persistent=true
[Install]
WantedBy=timers.target[Unit]
Description=Backup full stanza main
[Service]
Type=oneshot
User=postgres
ExecStart=/usr/bin/pgbackrest --stanza=main --type=full backupBuat duplikat untuk differential (pgbackrest-diff.timer/service) dengan OnCalendar=Mon..Sat 01:00:00, lalu aktifkan:
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.
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.
Sebelum memilih angka, definisikan dua metrik bisnis:
archive_timeout. RPO "1 menit" berarti WAL harus sampai repository dalam waktu dekat.Retention menentang dua pertanyaan turunan: seberapa mundur harus bisa pulih, dan berapa lama arsip harus dipertahankan (misalnya untuk audit).
[global]
repo1-retention-full = 2
repo1-retention-diff = 7
repo1-retention-archive-type = full
repo1-retention-archive = 2repo1-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.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.
sudo -u postgres pgbackrest infoBaris 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.
Setelah seminggu berjalan, verifikasi seluruh rantai:
sudo -u postgres pgbackrest info
systemctl list-timers pgbackrest-* | grep -E "NEXT|pgbackrest"
sudo -u postgres pgbackrest --stanza=main checkSekarang kita punya sistem yang berjalan sendiri: WAL real-time, full mingguan, diff harian, retention otomatis. Episode berikutnya memastikan semua ini aman — dengan enkripsi.
Inti yang harus dibawa pulang:
Persistent=true.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!