Backup Database MySQL/MariaDB

Database MySQL/MariaDB menyimpan data paling berharga dari aplikasi web Anda. Backup yang tepat dan terjadwal adalah jaminan bahwa data Anda selalu aman dan bisa dipulihkan kapan saja. Artikel ini membahas cara backup database MySQL/MariaDB secara lengkap dan profesional.

Pengertian Backup Database MySQL/MariaDB

Backup database MySQL/MariaDB adalah proses menyalin seluruh isi database ke file penyimpanan agar dapat dipulihkan jika terjadi kegagalan. File backup berisi semua tabel, data, struktur, trigger, dan stored procedure.

Mengapa Backup MySQL/MariaDB Penting?

  • Kehilangan Data: Hard disk rusak, server crash, atau kesalahan manusia
  • Bug Aplikasi: Query salah yang menghapus atau merusak data
  • Serangan: Hacker atau ransomware yang merusak database
  • Update Gagal: Update yang merusak struktur database
  • Kepatuhan: Beberapa regulasi mewajibkan backup data

Alat yang Dibutuhkan

  • Server Debian 13 dengan MySQL atau MariaDB terinstal
  • Akses root atau user dengan privilege backup
  • Ruang penyimpanan untuk file backup
  • Tidak perlu software tambahan (sudah built-in)

Perintah Backup Dasar

1. Backup Satu Database

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

# Backup tanpa password di prompt (menggunakan config file)
mariadb-dump -u root database_name > backup.sql

2. Backup Semua Database

bash
# Backup semua database
mariadb-dump --all-databases -u root -p > all_backup.sql

3. Backup dengan Kompresi

bash
# Backup dan kompresi gzip
mariadb-dump -u root -p database_name | gzip > backup.sql.gz

# Backup semua database dan kompresi
mariadb-dump --all-databases -u root -p | gzip > all_backup.sql.gz

4. Backup dengan Timestamp

bash
# Otomatis menambahkan tanggal dan waktu ke nama file
DATE=$(date +%Y%m%d_%H%M%S)
mariadb-dump -u root -p database_name | gzip > backup_${DATE}.sql.gz

5. Backup Menggunakan mysqldump

bash
# mysqldump juga tersedia untuk kompatibilitas
mysqldump -u root -p database_name > backup.sql

Opsi Backup Lanjutan

1. Backup Konsisten (Tanpa Lock)

bash
# Backup tanpa mengunci tabel — aman untuk database yang sedang dipakai
mariadb-dump --single-transaction --quick --lock-tables=false -u root -p database_name > backup.sql

Penjelasan:

  • --single-transaction: Mengambil snapshot konsisten tanpa lock
  • --quick: Output baris per baris, hemat memory
  • --lock-tables=false: Jangan kunci tabel
  • Cocok untuk database dengan InnoDB

2. Backup dengan Trigger, Event, dan Routine

bash
# Backup termasuk trigger, event scheduler, dan stored procedures
mariadb-dump --routines --events --triggers -u root -p database_name > backup_full.sql

3. Backup Tabel Tertentu

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

4. Backup dengan Format Berbeda

bash
# Format insert (default)
mariadb-dump -u root -p database_name > backup.sql

# Format XML
mariadb-dump --xml -u root -p database_name > backup.xml

# Format CSV
mariadb-dump --tab=/tmp/backup -u root -p database_name

# Format JSON (MySQL 8.0+)
mysql -u root -p -e "SELECT * FROM database_name.table" --json

5. Backup dengan Exclude Tabel

bash
# Backup semua kecuali tabel tertentu
mariadb-dump --ignore-table=database_name.table1 --ignore-table=database_name.table2 -u root -p database_name > backup.sql

Backup Otomatis dengan Cron

1. Buat Script Backup

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

Isi:

bash
#!/bin/bash

# === Konfigurasi ===
DB_NAME="masyarakat_db"
DB_USER="backup_user"
DB_PASS="SecurePassword123!"
BACKUP_DIR="/backup/mysql"
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/mysql_backup.log

Jadikan executable:

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

2. Jadwalkan Cron

bash
crontab -e

Tambahkan:

bash
# Backup harian jam 2 pagi
0 2 * * * /usr/local/bin/backup-mysql.sh

# Backup mingguan (full) hari Minggu jam 3 pagi
0 3 * * 0 /usr/local/bin/backup-mysql.sh full

3. Backup via Systemd Timer

bash
# Service
nano /etc/systemd/system/backup-mysql.service
ini
[Unit]
Description=MySQL/MariaDB Backup

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-mysql.sh
bash
# Timer
nano /etc/systemd/system/backup-mysql.timer
ini
[Unit]
Description=Run MySQL Backup Daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
bash
systemctl enable backup-mysql.timer
systemctl start backup-mysql.timer

Backup ke Cloud

1. Upload ke AWS S3

bash
# Instal AWS CLI
apt install awscli -y
aws configure

# Upload backup ke S3
aws s3 cp /backup/mysql/backup.sql.gz s3://my-backup-bucket/mysql/

2. Upload ke Google Cloud Storage

bash
# Instal gsutil
apt install google-cloud-cli -y

# Upload
gsutil cp /backup/mysql/backup.sql.gz gs://my-backup-bucket/mysql/

3. Upload via SCP ke Server Lain

bash
# Kirim backup ke server backup
scp /backup/mysql/backup.sql.gz user@backup-server:/backups/mysql/

4. Upload via rsync

bash
# Sinkronisasi backup ke server remote
rsync -avz /backup/mysql/ user@backup-server:/backups/mysql/

Restore Database MySQL/MariaDB

1. Restore dari File SQL

bash
# Restore ke database yang sudah ada
mariadb -u root -p database_name < backup.sql

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

2. Restore Semua Database

bash
# Restore semua database
mariadb -u root -p < all_backup.sql

3. 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

4. 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

5. Restore dengan Perubahan Karakter Set

bash
# Buat database dengan character set yang benar
mariadb -u root -p -e "CREATE DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mariadb -u root -p db < backup.sql

6. Restore Selectif

bash
# Coba restore di database terpisah untuk verifikasi
mariadb -u root -p -e "CREATE DATABASE test_restore;"
mariadb -u root -p test_restore < backup.sql
# Cek data
mariadb -u root -p -e "SELECT COUNT(*) FROM test_restore.artikel;"
# Hapus database test
mariadb -u root -p -e "DROP DATABASE test_restore;"

Backup dengan Perintah MySQL (Bukan mariadb-dump)

1. Backup dengan mysqlpump (MySQL 8.0+)

bash
# mysqlpump adalah alternatif modern
mysqlpump -u root -p database_name > backup.sql

2. Backup dengan mysqlhotcopy (MyISAM)

bash
# Hanya untuk MyISAM tables
mysqlhotcopy database_name /backup/

3. Backup dengan XtraBackup (Percona)

bash
# Untuk database besar, XtraBackup lebih cepat
apt install percona-xtrabackup-80 -y

# Full backup
xtrabackup --backup --target-dir=/backup/mysql/

# Prepare backup
xtrabackup --prepare --target-dir=/backup/mysql/

# Restore
xtrabackup --copy-back --target-dir=/backup/mysql/

Verifikasi Backup

1. Cek Integritas File

bash
# Cek apakah backup tidak kosong
ls -lh backup.sql
ls -lh backup.sql.gz

# Cek validitas gzip
gzip -t backup.sql.gz

# Lihat isi backup (tanpa restore)
zcat backup.sql.gz | head -20

2. Hitung Jumlah Data

bash
# Hitung jumlah tabel
zcat backup.sql.gz | grep "CREATE TABLE" | wc -l

# Hitung jumlah baris
zcat backup.sql.gz | grep "INSERT INTO" | wc -l

3. Test Restore Berkala

bash
# Script untuk test restore
nano /usr/local/bin/test-restore.sh
bash
#!/bin/bash
# Test restore di database terpisah
mariadb -u root -p -e "CREATE DATABASE IF NOT EXISTS test_restore;"
mariadb -u root -p test_restore < /backup/mysql/latest_backup.sql
mariadb -u root -p -e "SELECT COUNT(*) FROM test_restore.artikel;"
mariadb -u root -p -e "DROP DATABASE test_restore;"
echo "Test restore selesai: $(date)" >> /var/log/restore_test.log

4. Monitoring Backup

bash
# Cek backup terakhir
ls -lt /backup/mysql/*.sql.gz | head -5

# Cek log backup
cat /var/log/mysql_backup.log | tail -20

# Cek backup terakhir sukses
grep "selesai" /var/log/mysql_backup.log | tail -5

Mengamankan Backup

1. Enkripsi Backup

bash
# Enkripsi dengan OpenSSL
mariadb-dump -u root -p database_name | gzip | openssl enc -aes-256-cbc -salt > backup.sql.gz.enc

# Dekripsi
openssl enc -d -aes-256-cbc -in backup.sql.gz.enc | gunzip | mariadb -u root -p database_name

2. Backup Terenkripsi dengan GPG

bash
# Enkripsi
mariadb-dump -u root -p database_name | gzip | gpg --symmetric --cipher-algo AES256 > backup.sql.gz.gpg

# Dekripsi
gpg --decrypt backup.sql.gz.gpg | gunzip | mariadb -u root -p database_name

3. Permission Backup

bash
# Batasi akses file backup
chmod 600 /backup/mysql/*.sql.gz
chown root:root /backup/mysql/*.sql.gz

4. Backup ke Cloud Aman

bash
# Gunakan HTTPS/TLS
aws s3 cp backup.sql.gz s3://my-bucket/ --sse AES256

# Gunakan encryption
gsutil cp -o "GSUtil:encryption_key=YOUR_KEY" backup.sql.gz gs://my-bucket/

Troubleshooting

1. Access Denied

Penyebab: User tidak punya privilege yang cukup. Solusi:

bash
# Berikan privilege
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES ON database_name.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;

2. Backup File Kosong

Penyebab: Database tidak ada atau password salah. Solusi:

bash
# Cek database ada
mariadb -u root -p -e "SHOW DATABASES;"
# Cek log error
mariadb-dump -u root -p database_name 2>&1

3. Disk Penuh

Penyebab: File backup terlalu besar. Solusi:

bash
# Kompresi agresif
mariadb-dump -u root -p db | gzip -9 > backup.sql.gz

# Hapus backup lama
find /backup -name "*.sql.gz" -mtime +7 -delete

# Cek disk
df -h

4. Backup Lambat

Penyebab: Database terlalu besar. 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 XtraBackup untuk database besar
xtrabackup --backup --target-dir=/backup/mysql/

5. Restore Error — Character Set

Penyebab: Perbedaan charset antara backup dan database. Solusi:

bash
# Buat database dengan charset yang benar
mariadb -u root -p -e "CREATE DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mariadb -u root -p db < backup.sql

6. Restore Error — Version Mismatch

Penyebab: Backup dari versi MySQL/MariaDB berbeda. Solusi:

bash
# Backup di versi yang sama
# Atau gunakan mysqldump dengan --compatible
mariadb-dump --compatible=mysql40 -u root -p db > backup.sql

7. mysqldump Command Not Found

Penyebab: MySQL utilities belum terinstal. Solusi:

bash
# Instal
apt install mariadb-client -y
# Atau untuk MySQL
apt install mysql-client -y

Kesimpulan

Backup database MySQL/MariaDB adalah keterampilan paling penting bagi administrator server. Dengan strategi backup yang tepat, otomatisasi cron job, kompresi, dan test restore berkala, data Anda akan selalu aman dan bisa dipulihkan kapan saja.

Kunci utama:

  • Gunakan --single-transaction untuk backup tanpa lock
  • Selalu kompresi backup dengan gzip untuk menghemat ruang
  • Backup ke cloud untuk perlindungan offsite (3-2-1 rule)
  • Jangan hanya membuat backup — uji restore secara rutin
  • Enkripsi backup yang berisi data sensitif
  • Monitor log backup untuk mendeteksi masalah lebih awal
  • Backup otomatis dengan cron atau systemd timer
  • Gunakan user backup dengan privilege minimal yang diperlukan
Catatan penting: Jangan pernah menyimpan backup database di server yang sama 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. Jangan menyimpan password database di script backup dalam bentuk plain text — gunakan file .my.cnf dengan permission 600 atau variabel environment yang aman.
Ingat: Backup database adalah jaminan terakhir 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 MySQL/MariaDB secara sistematis.

Artikel Terkait