Episode ini membahas backup database dan aplikasi: plugin Enterprise untuk VMware, Hyper-V, MSSQL, MySQL/PostgreSQL agents, dan NDMP versus pendekatan script-based di Community dengan hook pre-backup dan post-cleanup. Kalian juga memahami pentingnya konsistensi data dan strategi snapshot.

Backup file statis itu mudah: salin, selesai. Tapi database dan aplikasi punya satu musuh besar: inkonsistensi. Menyalin file .ibd atau postgresql.conf saat database sedang menulis adalah cara tercepat membuat backup yang tidak bisa di-restore. Di episode 10 kita mempelajari cara backup workload hidup dengan benar.
Pendekatannya beragam tergantung edisi: plugin aplikasi terintegrasi di Enterprise, atau pola script-based pre/post di Community. Dan di balik keduanya ada prinsip yang sama — buat data konsisten dulu, baru salin.
Database tidak pernah menulis satu file besar; ia menulis ke banyak file dengan buffer internal dan WAL (write-ahead log). Menyalin file saat transaksi berlangsung menghasilkan snapshot yang tidak konsisten: setengah transaksi tersimpan, setengah tidak. Ketika database dibuka dari salinan ini, ia gagal.
Ada dua jalan keluar:
Bacula Enterprise menyediakan keduanya lewat plugin; Community mengandalkan script yang memanggil tool bawaan database.
Bacula Enterprise menyediakan plugin yang berkomunikasi langsung dengan aplikasi untuk memastikan konsistensi:
Keuntungan plugin: konsistensi dijamin, tidak perlu script manual, dan restore bisa dilakukan secara aplikasi-aware. Harganya: lisensi komersial dan konfigurasi tambahan di sisi aplikasi.
Note
Plugin Bacula Enterprise tidak berjalan di Community. Jika kalian butuh backup aplikasi yang benar-benar zero-script, hitung biaya lisensi Enterprise dibanding nilai data yang dilindungi — analisis ini kita dalami di episode 18.
Di Community, strategi standarnya adalah hook pre/post yang dipicu job Bacula. Bacula menjalankan perintah lewat directive ClientRunBeforeJob dan ClientRunAfterJob di resource Job:
Untuk PostgreSQL, pola paling andal: dump dulu ke file, baru backup file dump-nya.
#!/bin/bash
set -euo pipefail
BACKUP_DIR=/var/backup/pg_dump
mkdir -p "$BACKUP_DIR"
PGPASSWORD=rahasia pg_dump -h 127.0.0.1 -U bacula myapp > "$BACKUP_DIR/myapp.sql"Job {
Name = "Backup PostgreSQL"
Type = Backup
Client = client-fd
FileSet = "Set PG Dump"
ClientRunBeforeJob = "/etc/bacula/scripts/pg_dump.sh"
ClientRunAfterJob = "/etc/bacula/scripts/pg_cleanup.sh"
Storage = FileStorage
Pool = FilePool
}Alurnya: Bacula menjalankan pg_dump.sh sebelum mulai membaca file → hasil dump di-backup bersama FileSet → pg_cleanup.sh menghapus dump lama setelah selesai.
MySQL memakai mysqldump dengan cara yang sama:
mysqldump --single-transaction -u backup -p'rahasia' myapp > /var/backup/mysql_dump/myapp.sql--single-transaction penting: ia mengambil snapshot konsisten tanpa mengunci seluruh tabel.
Jangan biarkan dump menumpuk di client — file dump adalah duplikat besar. ClientRunAfterJob membersihkannya:
#!/bin/bash
find /var/backup -name "*.sql" -mtime +1 -deleteImportant
Jika ClientRunBeforeJob gagal (script exit non-zero), Bacula membatalkan job. Ini perilaku yang benar: lebih baik tidak ada backup daripada backup yang tidak konsisten. Pastikan script memakai set -e agar kegagalan dump terdeteksi.
Hook pre-backup memaksa aplikasi "berhenti sebentar" (membuat dump). Pendekatan snapshot berbeda: aplikasi tetap berjalan, tetapi file system memotret kondisi konsisten (misal LVM snapshot atau VSS di Windows) yang lalu di-backup.
lvcreate -L 10G -s -n snapsata /dev/vg0/dbdataSnapshot yang di-backup adalah gambar statis; aplikasi tidak pernah terblokir. Inilah alasan kenapa Enterprise dan vendor VM memakai snapshot: zero downtime, tetap konsisten.
Untuk Community tanpa plugin, kombinasi ideal: pg_dump untuk database + FileSet biasa untuk file statis. Untuk VM, pertimbangkan Enterprise plugin atau backup lewat agent di dalam VM dengan dump.
Pola lengkap untuk server aplikasi kecil:
FileSet {
Name = "Set Aplikasi"
Include {
Options { signature = SHA1 }
File = /opt/myapp
File = /var/backup/pg_dump
}
}Dump berada di /var/backup/pg_dump dan ikut di-backup. Setelah job selesai, cleanup menghapus dump — tapi isi dump sudah aman di volume Bacula.
Tip
Uji restore dump hasil backup: psql -f restore.sql di database kosong. Dump yang tidak pernah diuji sama berbahayanya dengan tidak punya backup — pelajaran yang sama seperti restore drill di episode 8, kini berlaku untuk database.
Inti yang harus dibawa pulang:
ClientRunBeforeJob/ClientRunAfterJob + pg_dump/mysqldump.set -e pada script hook agar kegagalan membatalkan job, bukan menghasilkan backup cacat.Di episode 11 selanjutnya kita akan mengelola tape dan storage — konfigurasi device tape (LTO), autoloader/changer, penandaan slot dan rotation tape, membandingkannya dengan disk storage, serta strategi dedup (plugin Enterprise) versus file-based. Inilah media yang membuat Bacula unggul di lingkungan enterprise jangka panjang.