Skip to main content
๐Ÿš€ nusa.id cloud server linux indonesialihat paket

Backup Otomatis Database MySQL dengan Script Bash

ยท 4 min read
Aidil Putra
Maintainer

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 timedatectl atau date.

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โ€‹

  1. Periksa file hasil backup:

    ls -lh /var/backup/mysql/*/
  2. Uji restore dari file backup:

    gunzip < /var/backup/mysql/TIMESTAMP/nama_database.sql.gz | mysql -u root -p
  3. Periksa cron job terdaftar:

    sudo crontab -l
  4. Periksa log backup:

    tail -20 /var/log/mysql-backup.log

Rollbackโ€‹

Untuk menonaktifkan backup otomatis:

  1. Hapus cron job:

    sudo crontab -e
    # Hapus baris backup
  2. 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

Referensiโ€‹