Backup Otomatis Database MySQL dengan Script Bash
Backup database adalah komponen penting dalam strategi disaster recovery. Tanpa backup yang terjadwal, kerusakan data akibat kegagalan hardware, human error, atau serangan bisa berakibat fatal. Panduan ini akan memandu Anda membuat script backup otomatis untuk MySQL/MariaDB dengan rotasi harian.
Prasyaratโ
- Server Nusa Cloud VPS dengan OS Ubuntu/Debian
- MySQL atau MariaDB terinstall
- Akses root atau user dengan hak sudo
Langkah 1 โ Buat User Backup Khususโ
Sebaiknya buat user MySQL khusus untuk keperluan backup dengan hak minimal:
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'PASSWORD_BACKUP';
GRANT SELECT, SHOW VIEW, EVENT, TRIGGER, LOCK TABLES ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;
๐ก Note: Gunakan password yang kuat dan simpan di password manager. Jangan gunakan password root MySQL untuk script backup.
Langkah 2 โ Buat Direktori Backupโ
sudo mkdir -p /var/backup/mysql
sudo chmod 750 /var/backup/mysql
Langkah 3 โ Buat File Konfigurasi Credentialโ
Agar password tidak tampil di proses list, gunakan file konfigurasi MySQL:
sudo nano /root/.my.cnf
Isi dengan:
[client]
user=backup
password=PASSWORD_BACKUP
Amankan file tersebut:
sudo chmod 600 /root/.my.cnf
Langkah 4 โ Buat Script Backupโ
Buat file script di /usr/local/bin/backup-mysql.sh:
sudo nano /usr/local/bin/backup-mysql.sh
#!/bin/bash
# MySQL/MariaDB Backup Script
# Backup semua database dengan rotasi 7 hari
set -e
# Konfigurasi
BACKUP_DIR="/var/backup/mysql"
RETENTION_DAYS=7
TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
LOG_FILE="/var/log/mysql-backup.log"
# Fungsi logging
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') โ $1" >> "$LOG_FILE"
}
# Mulai backup
log "Memulai backup database..."
# Buat direktori backup harian
mkdir -p "$BACKUP_DIR/$TIMESTAMP"
# Dapatkan daftar database (kecuali system databases)
DATABASES=$(mysql -e "SHOW DATABASES;" | grep -Ev "^(Database|information_schema|performance_schema|sys)$")
for DB in $DATABASES; do
BACKUP_FILE="$BACKUP_DIR/$TIMESTAMP/${DB}.sql.gz"
log "Backup database: $DB"
mysqldump \
--single-transaction \
--routines \
--triggers \
--events \
--quick \
"$DB" | gzip > "$BACKUP_FILE"
# Verifikasi hasil backup
if [ -f "$BACKUP_FILE" ] && [ -s "$BACKUP_FILE" ]; then
log " โ $DB โ $(du -h "$BACKUP_FILE" | cut -f1)"
else
log " โ $DB โ GAGAL!"
fi
done
# Hapus backup lebih dari RETENTION_DAYS
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \; -print \
| while read DIR; do log "Hapus backup lama: $DIR"; done
log "Backup selesai."
Buat script executable:
sudo chmod +x /usr/local/bin/backup-mysql.sh
Langkah 5 โ Uji Scriptโ
Jalankan script secara manual untuk memastikan tidak ada error:
sudo /usr/local/bin/backup-mysql.sh
Periksa hasil backup:
ls -la /var/backup/mysql/*/
Jika ada error, periksa log:
cat /var/log/mysql-backup.log
Langkah 6 โ Jadwalkan dengan Cronโ
Jadwalkan backup berjalan setiap hari pukul 02:00 WIB:
sudo crontab -e
Tambahkan baris berikut:
0 2 * * * /usr/local/bin/backup-mysql.sh
โ ๏ธ Warning: Pastikan waktu server sudah sesuai dengan zona waktu yang diinginkan. Cek dengan perintah
timedatectlataudate.
Langkah 7 โ Backup ke Penyimpanan Jarak Jauh (Opsional)โ
Untuk keamanan tambahan, salin backup ke penyimpanan jarak jauh menggunakan rsync atau rclone.
Menggunakan rsync ke server lainโ
sudo nano /usr/local/bin/backup-mysql-sync.sh
#!/bin/bash
# Sync backup database ke remote server
REMOTE_USER="root"
REMOTE_HOST="203.0.113.20"
REMOTE_PATH="/backup/mysql/$(hostname)"
rsync -avz --delete /var/backup/mysql/ "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/"
Jadwalkan sync setelah backup selesai dengan cron terpisah:
30 2 * * * /usr/local/bin/backup-mysql-sync.sh
โ ๏ธ Warning: Untuk rsync via SSH, pastikan SSH key-based auth sudah dikonfigurasi antara kedua server.
Verifikasiโ
-
Periksa file hasil backup:
ls -lh /var/backup/mysql/*/ -
Uji restore dari file backup:
gunzip < /var/backup/mysql/TIMESTAMP/nama_database.sql.gz | mysql -u root -p -
Periksa cron job terdaftar:
sudo crontab -l -
Periksa log backup:
tail -20 /var/log/mysql-backup.log
Rollbackโ
Untuk menonaktifkan backup otomatis:
-
Hapus cron job:
sudo crontab -e
# Hapus baris backup -
Hapus script (opsional):
sudo rm /usr/local/bin/backup-mysql.sh
Kesimpulanโ
Dengan script backup otomatis di atas, database MySQL/MariaDB Anda akan tercadangkan setiap hari dengan rotasi 7 hari. Tambahkan sync ke server lain untuk perlindungan data yang lebih baik. Kombinasikan dengan backup file system untuk strategi disaster recovery yang lengkap.
Langkah selanjutnya:
- Integrasikan notifikasi backup via email atau Telegram
- Tambahkan backup ke object storage menggunakan
rclone - Lakukan uji restore secara berkala untuk memastikan integritas backup
