Panduan Backup dan Restore Database Secara Berkala

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 DatabaseFrekuensiRetensi
Database ProduksiHarian30 hari
Database StagingMingguan4 minggu
Database DevelopmentSetelah perubahan besar1 bulan

Jenis Database dan Backup

MariaDB/MySQL

bash
# Backup tunggal
mariadb-dump -u root -p database_name > backup.sql

# Backup semua database
mariadb-dump --all-databases > all_backup.sql

PostgreSQL

bash
# Backup tunggal
pg_dump -U username database_name > backup.sql

# Backup semua database
pg_dumpall > all_backup.sql

Instalasi dan Konfigurasi Backup Otomatis

1. Buat Script Backup

bash
nano /usr/local/bin/backup-db.sh

Isi:

bash
#!/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:

bash
chmod +x /usr/local/bin/backup-db.sh

2. Jadwalkan dengan Cron

bash
crontab -e

Tambahkan:

bash
# 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.sh

3. Backup via Systemd Timer (Alternatif Cron)

Buat service:

bash
nano /etc/systemd/system/backup-db.service
ini
[Unit]
Description=Database Backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-db.sh

Buat timer:

bash
nano /etc/systemd/system/backup-db.timer
ini
[Unit]
Description=Run Database Backup Daily

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

Aktifkan:

bash
systemctl enable backup-db.timer
systemctl start backup-db.timer

Backup ke Cloud

1. Upload ke AWS S3

Instal AWS CLI:

bash
apt install awscli -y
aws configure

Tambahkan ke script backup:

bash
aws s3 cp $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz s3://my-backup-bucket/mariadb/

2. Upload ke Google Cloud Storage

Instal gsutil:

bash
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

bash
rsync -avz $BACKUP_DIR/*.sql.gz user@backup-server:/backups/

Backup dengan mysqldump Options Lanjutan

1. Backup Konsisten (Tanpa Lock)

bash
mariadb-dump --single-transaction --quick --lock-tables=false -u root -p database_name > backup.sql

Penjelasan:

  • --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

bash
mariadb-dump --routines --events --triggers -u root -p database_name > backup_full.sql

3. Backup Partial (Tabel Tertentu)

bash
# Backup tabel tertentu saja
mariadb-dump -u root -p database_name artikel pengguna > partial_backup.sql

Restore Database

1. Restore dari File SQL

bash
# Restore database
mariadb -u root -p database_name < backup.sql

# Restore dari file terkompresi
gunzip < backup.sql.gz | mariadb -u root -p database_name

2. Restore ke Database Baru

bash
# 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.sql

3. Restore Tabel Tertentu

bash
# Ekstrak tabel dari backup
grep -A 1000 "CREATE TABLE \`artikel\`" backup.sql > artikel_table.sql
mariadb -u root -p database_name < artikel_table.sql

4. Restore dengan MariaDB

Jika backup menggunakan mariadb-dump:

bash
mariadb -u root -p database_name < backup.sql

Jika backup menggunakan mysqldump:

bash
mysql -u root -p database_name < backup.sql

5. Restore PostgreSQL

bash
# Restore dari pg_dump
psql -U username -d database_name < backup.sql

# Restore dari pg_dumpall
psql -U username -d postgres < all_backup.sql

Verifikasi Backup

1. Cek Integritas Backup

bash
# 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 -l

2. Test Restore Berkala

Jadwalkan test restore secara berkala:

bash
# Buat script test restore
nano /usr/local/bin/test-restore.sh
bash
#!/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

bash
# 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 -1

Troubleshooting

1. Backup Gagal — Disk Penuh

Penyebab: File backup terlalu besar. Solusi:

bash
# 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 -delete

2. Backup Lambat

Penyebab: Database terlalu besar atau server lambat. Solusi:

bash
# 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 optimasi

3. Restore Error — Character Set

Penyebab: Perbedaan character set antara backup dan database baru. Solusi:

bash
# 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.sql

4. Permission Denied

Penyebab: User database tidak punya privilege yang cukup. Solusi:

bash
# 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:

bash
# Cek integritas
gzip -t backup.sql.gz

# Generate ulang jika rusak
mariadb-dump -u root -p database_name > backup.sql
gzip backup.sql

Kesimpulan

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.

Artikel Terkait