Backup database MySQL sebenarnya cukup mudah. Kita bisa menggunakan perintah mysldump
untuk melakukan backup database MySQL, misalnya:
$ mysqldump -u root -p --all-databases > all_databases.sql
Namun melakukan backup dengan perintah tersebut menimbulkan beberapa masalah, yaitu:
- Bagaimana bila ada database yang tidak ingin kita backup, misalnya default database seperti
information_schema
,mysql
,performance_schema
, atausys
? - Bagaimana bila kita ingin melakukan restore database tertentu saja?
- Bagaimana bila kita ingin melakukan backup rutin setiap hari?
Dalam tulisan ini, saya akan tunjukkan contoh backup script sederhana yang dapat melakukan backup database MySQL secara otomatis sekaligus menyelesaikan permasalahan tersebut.
Backup Script
Simpan script berikut ini di komputer Anda.
#!/bin/bash
# ----------------------------------------------------
# Author: Mahendra Data - mahendra.data@algostudio.net
# License: BSD 3 clause
# ----------------------------------------------------
# ----- CONFIGURATION -----
MYSQL_DEFAULTS_FILE="mysqlbak.cnf"
EXCLUDE_DB=("information_schema" "mysql" "performance_schema" "sys")
BACKUP_DIR="backup"
# ----- BACKUP DATABASES -----
TODAY=$(date +'%Y%m%d')
echo "BACKUP: ${TODAY}"
# Create daily backup directory
BACKUP_DIR="${BACKUP_DIR}/${TODAY}"
rm -rf "${BACKUP_DIR}" # Remove existing backup directory
mkdir -p "${BACKUP_DIR}" # Create new backup directory
# Backup each database separately
for db in $(mysql --defaults-extra-file="${MYSQL_DEFAULTS_FILE}" -Bse 'show databases'); do
# Run the backup procedure if the name of the database is not in EXCLUDE_DB
if [[ ! " ${EXCLUDE_DB[*]} " =~ ${db} ]]; then
echo "Backup database: ${db}"
mysqldump --defaults-extra-file="${MYSQL_DEFAULTS_FILE}" --routines "${db}" > "${BACKUP_DIR}/${db}.sql"
gzip "${BACKUP_DIR}/${db}.sql"
fi
done
Script tersebut akan melakukan backup tiap database dalam database ke dalam file yang berbeda-beda dan dikelompokkan berdasarkan hari pembuatan backup. Ada beberapa variable yang dapat disesuaikan dengan kebutuhan Anda, yaitu:
- Variable EXCLUDE_DB: berisi daftar database yang tidak perlu di backup.
- Variable BACKUP_DIR: berisi lokasi direktori penyimpanan file backup.
- Variable MYSQL_DEFAULTS_FILE: berisi lokasi file konfigurasi MySQL yang anda gunakan.
Script tersebut memerlukan file konfigurasi MySQL. Simpan file mysqlbak.cnf
di bawah ini di directory yang sama dengan script mysqlbak.sh
diatas. Nama script ini harus sesuai dengan isi variable MYSQL_DEFAULTS_FILE di script mysqlbak.sh
.
[client]
host="localhost"
user="backup_user"
password="backup_user123"
Username dan password MySQL tersebut sengaja diletakkan terpisah demi keamanan. Jangan lupa menyesuaikan konten file mysqlbak.cnd
diatas dengan username dan password MySQL yang Anda gunakan.
Untuk menguji apakah script tersebut bisa berjalan dengan baik, jalankan perintah:
$ bash mysqlbak.sh
Hasil file backup akan disimpan di dalam directory yang tertulis dalam variable BACKUP_DIR.
Membuat cron job
Berikutnya kita perlu membuat cron job untuk menjalankan script diatas secara otomatis setiap hari. Langkah pertama, editlah cron job dengan perintah:
$ crontab -e
Lalu tambahkan baris perintah berikut untuk menjalankan script tersebut tiap tengah malam.
0 0 * * * /bin/bash /full/path/to/script/mysqlbak.sh
Pastikan /full/path/to/script/
Anda ganti sesuai dengan lokasi script di komputer Anda.
Bila ingin merubah jam backup, silahkan merujuk ke Crontab.guru untuk mengubah waktu script tersebut dijalankan.
Selesai, script backup MySQL akan berjalan otomatis setiap tengah malam.