karawaci.kode

2026-06-02 · 5 min

PostgreSQL 17 Incremental Backup: Ganti pgBackRest Setelah 5 Tahun

PostgreSQL 17 keluar tahun lalu, dan salah satu feature yang paling saya tunggu: native incremental backup via pg_basebackup --incremental. Saya pakai pgBackRest selama 5 tahun, dan setiap re-config ada drama. Sekarang ada alternatif yang lebih simple.

Cara native incremental backup

# Full backup (Sunday)
pg_basebackup -D /backup/full-2026-06-01 -Ft -X stream

# Incremental backup (Monday-Saturday)
pg_basebackup -D /backup/incr-2026-06-02 -Ft -X stream \
  --incremental /backup/full-2026-06-01/backup_manifest

That’s it. No separate tool, no config file with 40 options, no plugins.

Restore

pg_combinebackup /backup/full-2026-06-01 /backup/incr-2026-06-02 -o /restore/2026-06-02
pg_ctl start -D /restore/2026-06-02

Lebih clean dari pgBackRest restore workflow. Tidak butuh installation di server target.

Yang HILANG

pgBackRest yang saya pakai 5 tahun punya:

  1. Encryption at rest: AES-256 native. Postgres 17 backup file plain. Anda harus encrypt sendiri via LUKS atau s3 SSE.
  2. Parallel compression: pgBackRest pakai 8+ thread parallel zstd. Postgres 17 native single-thread gzip default. Untuk 50GB DB, backup 25 menit vs 8 menit.
  3. S3-native upload: pgBackRest upload langsung ke S3-compatible. Postgres 17 native: backup ke filesystem, lalu sync manual via rclone/aws cli.
  4. Async replication awareness: pgBackRest tahu kalau Anda punya streaming replication; native pg_basebackup juga, tapi setup-nya manual.

Migrasi yang saya lakukan

# Workflow lama (pgBackRest)
pgbackrest --stanza=warungdb --type=full backup
pgbackrest --stanza=warungdb --type=incr backup

# Workflow baru (pg_basebackup + rclone)
WEEK_DATE=$(date +%Y-%U)
DAILY_DATE=$(date +%Y-%m-%d)

# Sunday: full backup
if [ "$(date +%u)" = "7" ]; then
  pg_basebackup -D /backup/$WEEK_DATE-full -Ft -X stream -P
  rclone copy /backup/$WEEK_DATE-full r2:warung-backup/$WEEK_DATE-full
fi

# Monday-Saturday: incremental
pg_basebackup -D /backup/$DAILY_DATE-incr -Ft -X stream -P \
  --incremental /backup/$WEEK_DATE-full/backup_manifest
rclone copy /backup/$DAILY_DATE-incr r2:warung-backup/$DAILY_DATE-incr

# Cleanup local backup older than 14 days
find /backup -type d -mtime +14 -exec rm -rf {} +

35 lines of shell. Replace 200+ lines pgBackRest config.

Performance comparison

DB: warungdb, 12GB total, 200 tables, avg 50 write/sec.

pgBackRest full backup: 4 min 12 sec pg_basebackup full: 5 min 38 sec (slower karena single-thread)

pgBackRest incremental: 23 sec pg_basebackup incremental: 31 sec (similar)

Untuk database < 50GB, performance gap acceptable. Untuk DB > 100GB, pgBackRest masih winner.

Verdict

Kalau Anda:

  • ✅ DB kecil-medium (< 50GB)
  • ✅ Tidak punya budget untuk learning curve tool tambahan
  • ✅ Sudah pakai Postgres 17 atau bisa upgrade
  • ✅ Bisa handle encryption via filesystem-level

→ Switch ke native incremental backup. Lebih simple, more robust dependency-wise.

Kalau Anda:

  • ❌ DB > 100GB
  • ❌ Compliance ketat (HIPAA, SOC2 audit yang butuh tool dengan track record)
  • ❌ Multi-tenant Postgres dengan banyak stanza yang butuh isolated retention policy

→ Tetap pakai pgBackRest. Saya migrasi salah satu klien, yang lain saya kasih pgBackRest tetap.

Saya akan terus kasih kabar setelah pgBackRest 3.0 keluar (rumor ada feature parallel restore dari S3 langsung — kalau itu beneran, saya mungkin balik).

Ditulis oleh Reza Pradipta