Database adalah aset paling berharga dari setiap website. Kehilangan data database bisa berarti kehilangan semua konten, pengguna, dan transaksi. Backup berkala adalah jaminan bahwa data Anda selalu bisa dipulihkan. Artikel ini membahas strategi backup dan restore database secara lengkap.
Pengertian Backup Database
Backup database adalah proses menyalin seluruh data database ke lokasi penyimpanan lain agar dapat dipulihkan jika terjadi kegagalan. Backup adalah asuransi digital yang melindungi Anda dari kehilangan data.
Mengapa Backup Berkala?
- Kehilangan Data: Hard disk rusak, server crash, atau kesalahan manusia
- Kesalahan Aplikasi: Bug yang merusak data, query salah yang menghapus data
- Serangan: Ransomware atau hacker yang merusak database
- Update Gagal: Update yang merusak struktur database
- Bencana: Server physically rusak atau bencana alam
Jenis Backup
- Full Backup: Salin seluruh database
- Incremental Backup: Salin hanya data yang berubah sejak backup terakhir
- Differential Backup: Salin data yang berubah sejak full backup terakhir
- Snapshot: Point-in-time copy (untuk VPS/cloud)
Strategi Backup
Aturan 3-2-1
Strategi backup yang terpercaya:
- 3 salinan data (original + 2 backup)
- 2 media berbeda (disk + cloud)
- 1 salinan di lokasi berbeda (offsite)
Jadwal Backup yang Direkomendasikan
| Jenis Database | Frekuensi | Retensi |
|---|---|---|
| Database Produksi | Harian | 30 hari |
| Database Staging | Mingguan | 4 minggu |
| Database Development | Setelah perubahan besar | 1 bulan |
Jenis Database dan Backup
MariaDB/MySQL
# Backup tunggal
mariadb-dump -u root -p database_name > backup.sql
# Backup semua database
mariadb-dump --all-databases > all_backup.sqlPostgreSQL
# Backup tunggal
pg_dump -U username database_name > backup.sql
# Backup semua database
pg_dumpall > all_backup.sqlInstalasi dan Konfigurasi Backup Otomatis
1. Buat Script Backup
nano /usr/local/bin/backup-db.shIsi:
#!/bin/bash
# === Konfigurasi ===
DB_NAME="masyarakat_db"
DB_USER="backup_user"
DB_PASS="SecurePassword123!"
BACKUP_DIR="/backup/mariadb"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)
# === Buat Direktori Backup ===
mkdir -p $BACKUP_DIR
# === Backup Database ===
mariadb-dump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
# === Backup Semua Database ===
mariadb-dump -u $DB_USER -p$DB_PASS --all-databases | gzip > $BACKUP_DIR/all_databases_${DATE}.sql.gz
# === Hapus Backup Lama ===
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
# === Log ===
echo "$(date): Backup $DB_NAME selesai" >> /var/log/backup.log
# === Upload ke Cloud (Opsional) ===
# curl -T $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz https://storage.example.com/backup/Buat executable:
chmod +x /usr/local/bin/backup-db.sh2. Jadwalkan dengan Cron
crontab -eTambahkan:
# Backup database setiap hari jam 2 pagi
0 2 * * * /usr/local/bin/backup-db.sh
# Backup tambahan jam 2 siang (untuk high-traffic)
0 14 * * * /usr/local/bin/backup-db.sh3. Backup via Systemd Timer (Alternatif Cron)
Buat service:
nano /etc/systemd/system/backup-db.service[Unit]
Description=Database Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-db.shBuat timer:
nano /etc/systemd/system/backup-db.timer[Unit]
Description=Run Database Backup Daily
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.targetAktifkan:
systemctl enable backup-db.timer
systemctl start backup-db.timerBackup ke Cloud
1. Upload ke AWS S3
Instal AWS CLI:
apt install awscli -y
aws configureTambahkan ke script backup:
aws s3 cp $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz s3://my-backup-bucket/mariadb/2. Upload ke Google Cloud Storage
Instal gsutil:
apt install google-cloud-storage -y
gsutil cp $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz gs://my-backup-bucket/3. Upload via rsync ke Server Lain
rsync -avz $BACKUP_DIR/*.sql.gz user@backup-server:/backups/Backup dengan mysqldump Options Lanjutan
1. Backup Konsisten (Tanpa Lock)
mariadb-dump --single-transaction --quick --lock-tables=false -u root -p database_name > backup.sqlPenjelasan:
--single-transaction: Backup tanpa mengunci tabel--quick: Output baris per baris (hemat memory)--lock-tables=false: Jangan kunci tabel
2. Backup dengan Trigger dan Event
mariadb-dump --routines --events --triggers -u root -p database_name > backup_full.sql3. Backup Partial (Tabel Tertentu)
# Backup tabel tertentu saja
mariadb-dump -u root -p database_name artikel pengguna > partial_backup.sqlRestore Database
1. Restore dari File SQL
# Restore database
mariadb -u root -p database_name < backup.sql
# Restore dari file terkompresi
gunzip < backup.sql.gz | mariadb -u root -p database_name2. Restore ke Database Baru
# Buat database baru
mariadb -u root -p -e "CREATE DATABASE database_baru CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# Restore ke database baru
mariadb -u root -p database_baru < backup.sql3. Restore Tabel Tertentu
# Ekstrak tabel dari backup
grep -A 1000 "CREATE TABLE \`artikel\`" backup.sql > artikel_table.sql
mariadb -u root -p database_name < artikel_table.sql4. Restore dengan MariaDB
Jika backup menggunakan mariadb-dump:
mariadb -u root -p database_name < backup.sqlJika backup menggunakan mysqldump:
mysql -u root -p database_name < backup.sql5. Restore PostgreSQL
# Restore dari pg_dump
psql -U username -d database_name < backup.sql
# Restore dari pg_dumpall
psql -U username -d postgres < all_backup.sqlVerifikasi Backup
1. Cek Integritas Backup
# Cek apakah file backup valid
gzip -t backup.sql.gz
# Cek isi backup (tanpa restore)
zcat backup.sql.gz | head -20
# Hitung jumlah tabel
zcat backup.sql.gz | grep "CREATE TABLE" | wc -l2. Test Restore Berkala
Jadwalkan test restore secara berkala:
# Buat script test restore
nano /usr/local/bin/test-restore.sh#!/bin/bash
# Test restore di database terpisah
mariadb -u root -p test_restore_db < /backup/mariadb/latest_backup.sql
# Cek apakah data valid
mariadb -u root -p -e "SELECT COUNT(*) FROM test_restore_db.artikel;"
# Hapus database test
mariadb -u root -p -e "DROP DATABASE test_restore_db;"
echo "Test restore selesai: $(date)"3. Monitoring Backup
# Cek ukuran backup terbaru
ls -lh /backup/mariadb/ | tail -5
# Cek log backup
cat /var/log/backup.log | tail -20
# Cek backup terakhir
ls -lt /backup/mariadb/*.sql.gz | head -1Troubleshooting
1. Backup Gagal — Disk Penuh
Penyebab: File backup terlalu besar. Solusi:
# Cek disk
df -h
# Kompresi lebih agresif
mariadb-dump -u root -p db | gzip -9 > backup.sql.gz
# Hapus backup lama
find /backup -name "*.sql.gz" -mtime +7 -delete2. Backup Lambat
Penyebab: Database terlalu besar atau server lambat. Solusi:
# Gunakan --single-transaction
mariadb-dump --single-transaction --quick -u root -p db > backup.sql
# Backup tabel per tabel
mariadb-dump -u root -p db --tables artikel pengguna > partial.sql
# Gunakan mariadb-dumpslow untuk optimasi3. Restore Error — Character Set
Penyebab: Perbedaan character set antara backup dan database baru. Solusi:
# Buat database dengan character set yang benar
mariadb -u root -p -e "CREATE DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# Restore
mariadb -u root -p db < backup.sql4. Permission Denied
Penyebab: User database tidak punya privilege yang cukup. Solusi:
# Berikan privilege backup
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES ON db.* TO 'backup_user'@'localhost';5. Backup File Rusak
Penyebab: Proses backup terganggu. Solusi:
# Cek integritas
gzip -t backup.sql.gz
# Generate ulang jika rusak
mariadb-dump -u root -p database_name > backup.sql
gzip backup.sqlKesimpulan
Backup dan restore database adalah keterampilan paling penting bagi administrator server. Dengan strategi backup yang tepat, otomatisasi cron job, dan test restore berkala, data Anda akan selalu aman dan dapat dipulihkan kapan saja.
Kunci utama:
- Terapkan aturan 3-2-1 untuk backup yang reliable
- Jangan hanya membuat backup — uji restore secara rutin
- Backup ke cloud untuk perlindungan offsite
- Monitor log backup untuk mendeteksi masalah lebih awal
- Backup database besar dengan opsi
--single-transaction - Simpan backup di lokasi yang aman dan terenkripsi
Catatan penting: Jangan pernah menyimpan backup database di server yang sama dengan database asli tanpa redundansi tambahan. Jika server rusak, backup juga ikut hilang. Selalu test restore backup secara berkala — backup yang tidak pernah diuji bukanlah backup yang reliable. Gunakan enkripsi untuk backup yang berisi data sensitif, dan simpan kunci enkripsi secara terpisah dari backup.
Ingat: Backup adalah jaminan terakhir Anda terhadap kehilangan data. Satu kali kehilangan data bisa menghancurkan bisnis Anda. Jangan menunda backup — buat jadwal backup dan patuhi secara konsisten. Database yang dicadangkan dengan baik adalah aset paling berharga yang dimiliki website Anda.
Dipublikasikan untuk membantu para administrator server menjaga keamanan data database secara sistematis.