Database adalah data yang paling berbahaya untuk dibackup secara langsung: file-nya berubah saat backup berjalan. Episode ini mengajarkan pola yang benar — membuat dump konsisten dengan pg_dump/mysqldump lewat hooks before/after backup, dukungan database native borgmatic, konsep WAL, dan kasus service file.

Di episode 9 kita mengotomasi backup dengan borgmatic. Sekarang tantangan paling licin: database. Menyalin file data database mentah seperti memotret buku yang sedang dibuka — tulisannya setengah pindah, konsistensinya rusak. Backup database harus dibuat melalui mekanisme yang menjamin konsistensi: dump atau snapshot yang memperhitungkan WAL. Episode ini mengajarkan pola yang benar untuk PostgreSQL, MySQL/MariaDB, dan service file.
Database menulis halaman halaman data ke disk secara terus-menerus. Jika backup menyalin file database saat transaksi berlangsung, hasilnya bisa berupa campuran versi halaman yang saling menolak — restore menghasilkan database korup.
pg_dump/mysqldump): membaca database melalui API database dengan transaksi baca — menghasilkan file teks/SQL yang konsisten pada satu titik waktu. Ini cara paling sederhana dan paling umum.Rekomendasi praktis untuk mayoritas workload: dump dulu, lalu backup file dump-nya. Borg tidak perlu tahu bahwa itu database — ia cukup menyimpan file dump yang konsisten.
Langkah 1 — pastikan direktori dump ikut di source_directories:
source_directories:
- /home
- /etc
- /var/backups/dbLangkah 2 — definisikan hook:
hooks:
before_backup:
- pg_dump -U backup_user appdb | gzip > /var/backups/db/appdb.sql.gz
- mysqldump --all-databases --single-transaction | gzip > /var/backups/db/mysql.sql.gz
after_backup:
- rm -f /var/backups/db/appdb.sql.gz /var/backups/db/mysql.sql.gz
on_error:
- echo "Backup database GAGAL" >&2Alurnya: dump dibuat → borgmatic membackup direktori /var/backups/db → hook after_backup membersihkan dump agar tidak menggunung.
pg_dump -U backup_user appdb — konsisten per-database. Untuk seluruh cluster, pg_dumpall. Pastikan user backup_user punya hak baca (SELECT).mysqldump --all-databases --single-transaction — --single-transaction memberi snapshot konsisten untuk InnoDB tanpa mengunci seluruh tabel.pg_dump/mysqldump ada di PATH user yang menjalankan borgmatic (root biasanya aman).Tanpa borgmatic, pola yang sama dicapai dengan shell script + cron:
#!/usr/bin/env bash
set -euo pipefail
pg_dump -U backup_user appdb | gzip > /var/backups/db/appdb.sql.gz
mysqldump --all-databases --single-transaction | gzip > /var/backups/db/mysql.sql.gz
export BORG_REPO=/backup/borg
export BORG_PASSCOMMAND='cat /root/.borg-passphrase'
borg create --stats /backup/borg::"{hostname}-{now}" /home /etc /var/backups/db
borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly 6
borg compact
rm -f /var/backups/db/appdb.sql.gz /var/backups/db/mysql.sql.gzBorgmatic juga memiliki dukungan bawaan untuk database — ia mengelola dump dan restore sendiri tanpa perlu hook manual:
postgresql_databases:
- name: appdb
hostname: localhost
username: backup_user
mysql_databases:
- name: allDengan konfigurasi ini, borgmatic membuat dump database ke lokasi sementara, membackupnya, lalu membersihkannya — plus kemampuan borgmatic restore --database untuk restore terarah. Untuk mulai, pola hook manual lebih eksplisit; native dukungan lebih ringkas dan terdokumentasi.
Important
Perintah backup database harus dijalankan sebagai user dengan hak baca database yang cukup, dan sebaiknya bukan superuser. Buat user khusus backup_user dengan privilege minimal — salah satu contoh prinsip least privilege yang berlaku juga untuk Borg.
Untuk service yang datanya berupa file (Nextcloud, GitLab, aplikasi PHP) ada nuansa yang berbeda:
occ maintenance:mode --on saat backup.source_directories — percuma.after_backup.before_backup membuat dump, after_backup membersihkan.pg_dump untuk PostgreSQL; mysqldump --single-transaction untuk MySQL/MariaDB.postgresql_databases dan mysql_databases.Di episode 11 kita membawa backup keluar dari server: Borg di Remote Server (SSH) — repository di host lain lewat borg serve, setup SSH key dengan restricted command, dan praktik keamanan seperti dedicated user tanpa password dan seccomp bawaan Borg.