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
# 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.sql2. Backup Semua Database
# Backup semua database
mariadb-dump --all-databases -u root -p > all_backup.sql3. Backup dengan Kompresi
# 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.gz4. Backup dengan Timestamp
# 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.gz5. Backup Menggunakan mysqldump
# mysqldump juga tersedia untuk kompatibilitas
mysqldump -u root -p database_name > backup.sqlOpsi Backup Lanjutan
1. Backup Konsisten (Tanpa Lock)
# Backup tanpa mengunci tabel — aman untuk database yang sedang dipakai
mariadb-dump --single-transaction --quick --lock-tables=false -u root -p database_name > backup.sqlPenjelasan:
--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
# Backup termasuk trigger, event scheduler, dan stored procedures
mariadb-dump --routines --events --triggers -u root -p database_name > backup_full.sql3. Backup Tabel Tertentu
# Backup hanya tabel tertentu saja
mariadb-dump -u root -p database_name artikel pengguna kategori > partial_backup.sql4. Backup dengan Format Berbeda
# 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" --json5. Backup dengan Exclude Tabel
# Backup semua kecuali tabel tertentu
mariadb-dump --ignore-table=database_name.table1 --ignore-table=database_name.table2 -u root -p database_name > backup.sqlBackup Otomatis dengan Cron
1. Buat Script Backup
nano /usr/local/bin/backup-mysql.shIsi:
#!/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.logJadikan executable:
chmod +x /usr/local/bin/backup-mysql.sh2. Jadwalkan Cron
crontab -eTambahkan:
# 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 full3. Backup via Systemd Timer
# Service
nano /etc/systemd/system/backup-mysql.service[Unit]
Description=MySQL/MariaDB Backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-mysql.sh# Timer
nano /etc/systemd/system/backup-mysql.timer[Unit]
Description=Run MySQL Backup Daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.targetsystemctl enable backup-mysql.timer
systemctl start backup-mysql.timerBackup ke Cloud
1. Upload ke AWS S3
# 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
# 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
# Kirim backup ke server backup
scp /backup/mysql/backup.sql.gz user@backup-server:/backups/mysql/4. Upload via rsync
# Sinkronisasi backup ke server remote
rsync -avz /backup/mysql/ user@backup-server:/backups/mysql/Restore Database MySQL/MariaDB
1. Restore dari File SQL
# 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_name2. Restore Semua Database
# Restore semua database
mariadb -u root -p < all_backup.sql3. 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.sql4. 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.sql5. Restore dengan Perubahan Karakter Set
# 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.sql6. Restore Selectif
# 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+)
# mysqlpump adalah alternatif modern
mysqlpump -u root -p database_name > backup.sql2. Backup dengan mysqlhotcopy (MyISAM)
# Hanya untuk MyISAM tables
mysqlhotcopy database_name /backup/3. Backup dengan XtraBackup (Percona)
# 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
# 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 -202. Hitung Jumlah Data
# Hitung jumlah tabel
zcat backup.sql.gz | grep "CREATE TABLE" | wc -l
# Hitung jumlah baris
zcat backup.sql.gz | grep "INSERT INTO" | wc -l3. Test Restore Berkala
# Script untuk test restore
nano /usr/local/bin/test-restore.sh#!/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.log4. Monitoring Backup
# 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 -5Mengamankan Backup
1. Enkripsi Backup
# 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_name2. Backup Terenkripsi dengan GPG
# 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_name3. Permission Backup
# Batasi akses file backup
chmod 600 /backup/mysql/*.sql.gz
chown root:root /backup/mysql/*.sql.gz4. Backup ke Cloud Aman
# 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:
# 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:
# Cek database ada
mariadb -u root -p -e "SHOW DATABASES;"
# Cek log error
mariadb-dump -u root -p database_name 2>&13. Disk Penuh
Penyebab: File backup terlalu besar. Solusi:
# 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 -h4. Backup Lambat
Penyebab: Database terlalu besar. 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 XtraBackup untuk database besar
xtrabackup --backup --target-dir=/backup/mysql/5. Restore Error — Character Set
Penyebab: Perbedaan charset antara backup dan database. Solusi:
# 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.sql6. Restore Error — Version Mismatch
Penyebab: Backup dari versi MySQL/MariaDB berbeda. Solusi:
# Backup di versi yang sama
# Atau gunakan mysqldump dengan --compatible
mariadb-dump --compatible=mysql40 -u root -p db > backup.sql7. mysqldump Command Not Found
Penyebab: MySQL utilities belum terinstal. Solusi:
# Instal
apt install mariadb-client -y
# Atau untuk MySQL
apt install mysql-client -yKesimpulan
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-transactionuntuk 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.