Episode ini mengajarkan verifikasi data Bacula: job Verify untuk membandingkan isi client dengan catatan catalog, pemeriksaan volume dan autoprune media basi, pemeliharaan konsistensi catalog dengan prune dan purge yang aman, serta pengamanan catalog dengan backup terjadwal.

Di episode 8 kalian sudah bisa memulihkan data. Tapi ada satu pertanyaan yang lebih dalam: apakah catalog benar-benar jujur? Catalog mencatat file yang dibackup — tetapi jika ada file yang berubah di client setelah backup, atau file dihapus dari client, catalog tidak otomatis tahu. Di episode 9 kita memverifikasi kebenaran itu, menjaga catalog tetap konsisten, dan memastikan catalog sendiri tidak pernah hilang.
Tiga pilar episode ini: Verify job (membandingkan kenyataan dengan catatan), prune/purge (membersihkan yang basi), dan backup catalog (mengamankan jembatan ke semua data).
Job Verify membandingkan dua sumber data. Mode utamanya:
VerifyInit — menghitung checksum semua file di client dan membandingkannya dengan checksum yang tersimpan di catalog.VerifyCatalog — membandingkan daftar file di client dengan daftar di catalog (tanpa membaca isi file).VerifyVolume — membaca ulang volume di storage dan membandingkan dengan catalog.Mode paling berguna untuk audit rutin adalah VerifyCatalog: cepat karena hanya membandingkan nama path dan metadata, dan cukup untuk menemukan perbedaan struktural.
Job {
Name = "Verify Web"
Type = Verify
Level = VerifyCatalog
Client = client-fd
FileSet = "Set Web"
Storage = FileStorage
Pool = FilePool
}Jalankan dari bconsole:
* run job="Verify Web" yes
* list jobs | grep VerifyOutput job Verify melaporkan perbedaan: file di client yang tidak ada di catalog, atau sebaliknya. Jika Termination: Verify OK tanpa peringatan berarti catalog dan kenyataan selaras.
Note
Verify memakan resource client dan storage, jadi jangan jadwalkan bersamaan dengan backup penuh. Pola umum: verify catalog tiap minggu setelah incremental terakhir, dan VerifyInit bulanan untuk integritas checksum penuh.
Kesehatan media bisa dinilai dari daftar volume:
* list volumes
* list volumes pool=FilePoolPerhatikan kolom status: Append (masih bisa diisi), Full (penuh), Recyclable (bisa dipakai ulang), Used (sedang dipakai), dan Purged (record dihapus). Volume Recyclable adalah target recycle berikutnya.
Dengan AutoPrune = yes di pool, Bacula menjalankan prune otomatis saat job dijalankan — record volume yang melewati retention dibersihkan dan volume menjadi Recyclable. Jika kalian melihat volume menumpuk berstatus Full tanpa pernah di-recycle, periksa:
* show pool=FilePoolPastikan AutoPrune = yes, Recycle = yes, dan Volume Retention tidak terlalu panjang untuk ukuran storage kalian.
Prune menghapus record yang sudah melewati retention:
* pruneBacula menawarkan target: prune untuk client tertentu, volume tertentu, atau semua. Ini operasi aman — hanya menyentuh data yang memang sudah kedaluwarsa.
Purge menghapus record tanpa peduli retention — memaksa. Contoh kasus yang sah:
list jobs.* purge jobid=12
* purge volume=FilePool-0003Danger
purge menghapus record dari catalog tetapi tidak otomatis menghapus data fisik di volume. Setelah purge, Bacula menganggap volume bisa dipakai lagi — jika Recycle = yes, data lama akan ditimpa. Sebelum purge, tanyakan: "Apakah saya bisa hidup tanpa bisa restore data ini?" Jika ragu, jangan purge.
Rutinitas audit sederhana:
* list jobs | head -50
* list volumes
* status catalogPerhatikan job berstatus Error yang berulang, volume yang tumbuh tidak wajar, dan job Verify yang melaporkan perbedaan mencurigakan. Ketiganya adalah sinyal awal masalah yang lebih besar.
Tanpa catalog, data di volume tetap ada — tetapi Bacula tidak tahu file apa saja di dalamnya. Restore per-file menjadi mustahil; kalian hanya bisa mengekstrak volume mentah. Karena itu catalog wajib di-backup, biasanya lebih sering dari data biasa (harian).
Paket Bacula menyertakan FileSet khusus untuk catalog:
FileSet {
Name = "Catalog"
Include {
Options { signature = MD5 }
File = /var/lib/postgresql
File = /var/lib/bacula
}
}Job {
Name = "Backup Catalog"
Type = Backup
Level = Full
Client = bacula-fd
FileSet = "Catalog"
Schedule = "DailyAfterBackup"
Storage = FileStorage
Pool = FilePool
}Jadwalkan setelah semua backup data selesai, sehingga catalog mencatat state terbaru. Dengan PostgreSQL, alternatif yang lebih bersih adalah pg_dump sebelum job — kita praktikkan pola pre-hook ini di episode 10.
Tip
Simpan backup catalog di media terpisah dari data (pool lain, storage lain, atau tape). Jika storage utama rusak bersama catalog-nya, backup catalog di media terpisah adalah satu-satunya jalan untuk memulihkan semuanya — episode 16 membahas catalog recovery secara lengkap.
Inti yang harus dibawa pulang:
Verify membandingkan client dengan catalog; VerifyCatalog adalah audit rutin yang murah.list volumes mengungkap status media; AutoPrune = yes menjaga siklus recycle berjalan.prune membersihkan yang basi dengan aman; purge memaksa dan harus dipakai sangat hati-hati.Di episode 10 selanjutnya kita akan membackup database dan aplikasi — pendekatan plugin Enterprise (Vmware, Hyper-V, MSSQL, MySQL/PostgreSQL agents, NDMP) versus pendekatan script-based Community dengan hook pre-backup dan post-cleanup, serta strategi konsistensi memakai snapshot. Di sinilah backup kalian siap melindungi workload yang paling hidup.