Episode ini membalik arah: memulihkan backup. Kalian belajar pgbackrest restore dengan tipe default/immediate untuk kondisi terakhir, PITR presisi dengan --type=time, --type=lsn, dan --type=name, serta --delta untuk menyinkronkan cluster yang sudah ada. Ini momen pembuktian bahwa seluruh backup kalian benar-benar bisa dipulihkan.

Semua episode sebelumnya membangun: stanza, backup, WAL, retention. Tetapi seluruh sistem itu baru bermakna saat restore bekerja. Inilah ironi backup: ia paling sering diabaikan justru saat dibutuhkan paling kritis. Di episode 8 kita membalik arah dan menguasai pgbackrest restore — dari memulihkan kondisi terakhir, hingga PITR yang presisi ke waktu, LSN, atau restore point.
Bayangkan pgBackRest sebagai arsip foto: backup adalah kamera yang memotret, WAL adalah film yang merekam setiap momen, dan restore adalah mesin cuci cetak yang menghasilkan foto di momen yang kalian minta. Episode 8 adalah latihan menggunakan mesin itu dengan benar.
pgbackrest restore memerlukan direktori PGDATA target dalam kondisi yang benar. Default pgBackRest adalah menyalin ke pg1-path dari config — dan menolak menimpa file yang sudah ada. Untuk target kosong (cluster baru), tidak perlu opsi tambahan:
sudo -u postgres pgbackrest --stanza=main restoreDefaultnya pgBackRest mengambil backup terakhir yang tersedia untuk stanza. Untuk memilih backup spesifik, gunakan --set dengan label dari pgbackrest info:
sudo -u postgres pgbackrest --stanza=main --set=20260813-090000F restoreUntuk memulihkan ke kondisi paling akhir yang tersedia (memutar ulang semua WAL yang diarsipkan sampai titik terakhir), gunakan --type=immediate:
sudo -u postgres pgbackrest --stanza=main --type=immediate restoreIni pilihan paling umum untuk recovery total dari bencana: kalian ingin kembali ke kondisi "sebelum semuanya hancur", sebaru mungkin.
PITR sejati — pulihkan ke waktu spesifik. Sangat berguna untuk membatalkan kesalahan yang terjadi pada waktu tertentu (misalnya DROP TABLE jam 09:30):
sudo -u postgres pgbackrest --stanza=main --type=time '2026-08-13 09:30:00+07' restoreFormat waktunya mengikuti konfigurasi timezone cluster. Saat restore tipe ini selesai, PostgreSQL berhenti di titik yang diminta.
Untuk presisi maksimal, tentukan titik dalam bentuk LSN (Log Sequence Number). LSN bisa diambil dari log error, output aplikasi, atau pg_current_wal_lsn():
sudo -u postgres pgbackrest --stanza=main --type=lsn '16/B374D848' restoreLSN memungkinkan pemulihan di antara dua transaksi — presisi yang tidak bisa dijamin waktu karena jam bisa tidak sinkron.
PostgreSQL memungkinkan membuat restore point dengan nama — penanda logis dalam aliran WAL. Buat di database, lalu pulihkan ke nama tersebut:
SELECT pg_create_restore_point('sebelum-migrasi-v2');sudo -u postgres pgbackrest --stanza=main --type=name 'sebelum-migrasi-v2' restoreTip
Buat restore point sebelum operasi berisiko (migrasi skema, batch update, drop tabel). Ini memberi kalian penanda bernama yang bisa di-restore kapan pun — jauh lebih mudah diingat daripada LSN atau timestamp.
Jika PGDATA masih berisi data (misalnya server gagal di tengah jalan, atau kalian ingin "menimpa" cluster yang berjalan), restore default menolak bekerja karena file sudah ada. Menghapus semua lalu restore berarti downtime lebih lama.
--delta membandingkan file di PGDATA dengan isi backup dan hanya menimpa yang berbeda — file yang sama dibiarkan. Inilah cara tercepat memulihkan cluster yang sebagian besar masih utuh:
sudo -u postgres pgbackrest --stanza=main --delta restore--delta juga berguna untuk menurunkan cluster lama ke versi backup tertentu (episode 19), atau sync setelah crash parsial. Tambahkan --force bila ingin memaksa restore ke direktori yang tidak kosong tanpa delta check.
Warning
--delta menghapus file yang ada di PGDATA tapi tidak ada di backup — itu yang membuatnya konsisten dengan isi backup. Pastikan kalian memahami ini: jangan pakai --delta pada PGDATA yang berisi data lebih baru yang ingin dipertahankan. Untuk kasus itu, restore ke direktori terpisah.
Setelah PITR berhenti di titik yang diminta, cluster masuk mode recovery. Untuk kontrol saat drill (episode 16), setel aksi target:
sudo -u postgres pgbackrest --stanza=main --type=time '2026-08-13 09:30:00+07' --target-action=pause restoreDengan --target-action=pause, PostgreSQL berhenti di target tanpa membuka write — memungkinkan verifikasi data sebelum membiarkan cluster melayani traffic. Setelah yakin, resume dengan SELECT pg_wal_replay_resume();.
Setelah restore selesai, start cluster dan periksa:
sudo systemctl start postgresql
psql -U postgres -c "SELECT count(*) FROM aplikasi.pelanggan;"Jika kalian restore ke waktu sebelum transaksi tertentu, row yang ditambahkan setelah waktu itu harus hilang. Itulah bukti PITR bekerja.
Inti yang harus dibawa pulang:
restore default memakai backup terakhir; --set memilih backup spesifik.--type=immediate = kondisi terakhir; --type=time = PITR; --type=lsn = presisi log; --type=name = restore point bernama.--delta menimpa PGDATA existing hanya yang berbeda — recovery tercepat.--target-action=pause memungkinkan verifikasi sebelum cluster melayani traffic.Di episode 9 selanjutnya kita akan menguji skenario recovery nyata: cluster korup yang dipulihkan ke backup terakhir + WAL, kehilangan seluruh direktori data yang harus di-rebuild, dan cloning instance standby baru dari backup. Semua diakhiri dengan latihan simulasi crash dan PITR ke waktu spesifik — skill yang membedakan DBA sungguhan!