Cara menggunakan backup database mysql otomatis

Backup Otomatis Database MySQL atau MariaDB

  • Juni 22, 2016
  • Tutorial
  • Tidak ada Komentar
Cara menggunakan backup database mysql otomatis
MySQL database

Sebagai sistem administrator, kepentingan membackup database aplikasi berbasis web secara otomatis apalagi dengan hosting di server dedicated membuat  saya harus memutar otak. Backup otomatis database MySQL atau MariaDB dengan webmin yang biasanya saya pakai tidak bisa berjalan dengan baik. Akhirnya saya mencari dan ketemu script untuk menjalankan backup secara otomatis tiap jam 1 dini hari. Script backup otomatis database mysql atau mariadb ini membuat folder backup tiap hari dan hanya menyimpan file 14 hari terakhir. bisa diubah sesuai dengan kebutuhan.

Copy script berikut:

#!/bin/bash

# Basic configuration: datestamp e.g. YYYYMMDD

DATE=$(date +"%Y%m%d")

# Location of your backups (create the directory first!)

BACKUP_DIR="/backup/mysql"

# MySQL login details

MYSQL_USER="root"
MYSQL_PASSWORD="YOURSECUREPASSWORD"

# MySQL executable locations (no need to change this)

MYSQL=/usr/bin/mysql
MYSQLDUMP=/usr/bin/mysqldump

# MySQL databases you wish to skip

SKIPDATABASES="Database|information_schema|performance_schema|mysql"

# Number of days to keep the directories (older than X days will be removed)

RETENTION=14

# ---- DO NOT CHANGE BELOW THIS LINE ------------------------------------------
#
# Create a new directory into backup directory location for this date

mkdir -p $BACKUP_DIR/$DATE

# Retrieve a list of all databases

databases=`$MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "($SKIPDATABASES)"`

# Dumb the databases in seperate names and gzip the .sql file

for db in $databases; do
echo $db
$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --skip-lock-tables --events --databases $db | gzip > "$BACKUP_DIR/$DATE/$db.sql.gz"
done

# Remove files older than X days

find $BACKUP_DIR/* -mtime +$RETENTION -delete

simpan dengan nama histla_mysqlbackup.sh pada folder /usr/local/sbin/.

Cek juga bahwa folder /backup/mysql sudah ada, atau jika ingin menyimpan di folder lain bisa diubah.

Kemudian ubah permissionnya menjadi 755

chmod 755 histla_mysqlbackup.sh

Buat sebuah cron job setiap jam 1 dini hari menjalankan backup

nano /etc/crontab

0 1 * * * root /usr/local/sbin/histla_mysqlbackup.sh

Selanjutnya tinggal restart service cron jobnya

service cron restart

Demikian cara backup otomatis database mysql atau mariadb dengan mudah dan cepat.

Sumber

debian,Linux,sysadmin

Pendahuluan

MySQL atau pun MariaDB adalah salah satu database yang paling banyak digunakan. Apalagi jika menggunakan jasa shared hosting di Indonesia, kebanyakan pasti menggunakan MySQL mau pun MariaDB secara default.

Ketika situs/maupun aplikasi web kita telah tumbuh semakin besar, data yang tersimpan dalam database menjadi suatu asset yang sangat berharga. Wajib kita lakukan backup secara berkala agar jika terjadi sesuatu, kita tidak menyesal di kemudian hari. Betapa banyak orang yang kebingungan karena database-nya korup, tidak sengaja terhapus, atau di-hack orang dan mereka tidak memiliki backup-nya?

Pada artikel ini, kami akan mendemonstrasikan cara membuat backup database MySQL mau pun MariaDB secara berkala menggunakan cron job. Untuk pengguna CPanel, kalian tetap bisa mengikuti arikel ini karena di CPanel pun terdapat menu pengaturan cron job.

Baca juga: MySQL vs MariaDB. Mana yang harus dipilih?

Sekilas Tentang Cron Job

Cron Job adalah aplikasi atau layanan yang memungkinkan kita untuk melakukan suatu tugas tertentu secara terjadwal tanpa harus melakukannya secara manual. Misal: saya ingin melakukan duplikat data dari situs A ke situs B setiap jam 1 malam. Maka saya bisa menggunakan cron job.

Cron job bisa diinstruksikan untuk mengerjakan satu tugas tertentu satu kali saja di waktu yang ditentukan, atau ia juga bisa dikonfigurasikan untuk melakukan pekerjaan yang sifatnya repetitif atau berulang.

# ┌───────────── menit (0 - 59)
# │ ┌───────────── jam (0 - 23)
# │ │ ┌───────────── tanggal (1 - 31)
# │ │ │ ┌───────────── bulan (1 - 12)
# │ │ │ │ ┌───────────── hari (0 - 6) 
# │ │ │ │ │              (Dari Minggu ke Sabtu; Angka 7 juga
# │ │ │ │ │               dianggap hari Minggu di beberapa sistem)
# │ │ │ │ │
# * * * * * [perintah yang akan dieksekusi]

Ilustrasi 1: pengaturan dan konfigurasi cron job dengan aplikasi crontab

Misalkan saya ingin mengeksekusi perintah ping google.com setiap 5 menit, saya akan menambahkan kode berikut di baris paling bawah konfigurasi cron job:

5 * * * * ping google.com

Konfigurasi Cron Job dengan crontab

Untuk mengkonfigurasi Cron Job di linux, kita perlu menggunakan aplikasi bernama crontab. Jika anda belum menginstall cron atau pun crontab, anda bisa menginstallnya terlebih dahulu.

Ubuntu

Untuk pengguna ubuntu, kita bisa langsung install cron melalui apt.

sudo apt update
sudo apt install cron

Arch Linux

Di arch linux, terdapat beberapa aplikasi yang mengimplementasikan fungsi cron, di antaranya adalah: cronie dan fcron. Anda cukup memasang salah satunya saja.

Atur hasil backup dengan format tanggal dan jam yang jelas

Kita akan menambahkan postfix tanggal dan waktu pada setiap file .sql dari hasil backup yang kita lakukan. Kita bisa mendapatkan informasi tanggal dan jam pada linux dengan mengeksekusi perintah date. Akan tetapi untuk mengambil format jam dan waktu yang kita inginkan, kita bisa menambahkan parameter setelahnya.

Berikut ini adalah perintah untuk mendapatkan tanggal dan jam pada linux dengan format tanggal-bulan-hari@jam:menit.

Perintah di atas (ketika saya eksekusi) menghasilkan output berikut:

Output tersebut sesuai dengan waktu ketika perintah date dieksekusi. Well, karakter : tidaklah dilarang di Linux. Itu artinya kita bisa menggunakan karakter tersebut baik untuk nama file mau pun untuk nama direktori di linux.

Untuk perintah lengkap mem-backup mysql adalah sebagai berikut:

mysqldump -u [username] -p[password] [nama-db] > [output-db]

Katakanlah saya mempunyai variabel:

  • username: root
  • password: 12345
  • nama db: kampus_db
  • nama output file: kampus_db_`date '+%Y-%m-%d@%H:%M'`.sql

Maka perintah akhir yang saya eksekusi adalah:

mysqldump -u root -p12345 kampus_db > kampus_db_`date '+%Y-%m-%d@%H:%M'`.sql

Untuk info lebih lengkap tentang ekspor data mysql: silahkan baca cara import dan eksport data dari mysql via terminal.

Backup Perjam

Di atas kita telah membuat perintah untuk membackup mysql dengan output nama file yang berisi tanggal dan waktu backup. Sekarang kita akan mengkonfigurasi cronjob untuk mengeksekusi perintah di atas setiap 1 jam sekali.

Edit crontab dengan melakukan perintah:

Lalu pada baris paling bawah, tambahkan perintah berikut:

0 * * * * mysqldump -u root -p12345 kampus_db > kampus_db_`date '+%Y-%m-%d@%H:%M'`.sql

Statement di atas akan menginstruksi cron untuk membackup database kampus_db setiap menit ke-0 untuk setiap jam, untuk setiap hari. Alias ia akan mengeksekusi perintah tersebut setiap 1 jam sekali.

Backup Sekali Sehari

Untuk membackup sekali sehari pada pukul tertentu, kita hanya perlu mengisi bagian menit dan bagian jam. Sisanya kita isi dengan *.

Misalkan setiap jam 00:00

Untuk setiap jam 00:00, saya atur menit dan jam-nya menjadi angka 0:

0 0 * * * mysqldump -u root -p12345 kampus_db > kampus_db_`date '+%Y-%m-%d@%H:%M'`.sql

Misalkan setiap jam 2 pagi

Untuk setiap jam 02:00 pagi, saya atur menit-nya dengan angka 0, dan jam-nya menjadi angka 2:

0 2 * * * mysqldump -u root -p12345 kampus_db > kampus_db_`date '+%Y-%m-%d@%H:%M'`.sql

Untuk memudahkan konfigurasi waktu, anda bisa mengunjungi crontab.guru. Di sana anda bisa mensimulasikan konfigurasi waktu crontab langsung via web.

Kompres Hasil Backup dengan Gzip

File hasil backup mysql ukurannya bergantung pada ukuran data kita dalam database. Semakin banyak baris data di dalam database kita, maka hasil backup-nya pun juga akan semakin besar. Untuk mensiasati hal tersebut, kita bisa mengkompresnya menggunakan software Gzip.

Anda bisa mengganti perintah backup mysql yang sudah kita lakukan di atas menjadi seperti ini:

mysqldump -u root -p12345 kampus_db | gzip > kampus_db_`date '+%Y-%m-%d@%H:%M'`.sql.gz

Baca juga: Cara Kompres dan Ekstrak File .gz Di Linux

Hapus file Backup yang lebih dari 10 hari

Bayangkan jika hasil file backup kita lebih dari 100MB perhari. Maka jika berlalu 10 hari, file tersebut akan membengkak lebih dari 1GB. Jika sebulan, bisa lebih dari 3GB. Lumayan bukan? Bisa menghabiskan storage kita untuk hal yang tidak terlalu dibutuhkan.

Untuk menghindari hal tersebut, kita bisa melakukan proses penghapusan data backup yang lebih dari 10 hari terakhir. Karena toh kita kemungkinan besar hanya membutuhkan data yang paling baru, data yang sudah lama sekali hanya akan memenuhi kapasistas storage jika terus kita simpan.

Berikut adalah langkah-langkah menghapus file backup yang sudah lebih dari 10 hari.

1. List file backup terlebih dahulu

Contoh output milik saya. Terdapat 15 file dari tanggal 1 Januari 2020 sampai tanggal 15 Januari 2020. Nantinya kita hanya akan mengambil yang lebih dari 10 file terakhir.

kampus_db_2020-01-01@09:14.sql  kampus_db_2020-01-09@09:06.sql
kampus_db_2020-01-02@09:14.sql  kampus_db_2020-01-10@09:06.sql
kampus_db_2020-01-03@09:14.sql  kampus_db_2020-01-11@08:54.sql
kampus_db_2020-01-04@09:14.sql  kampus_db_2020-01-12@08:54.sql
kampus_db_2020-01-05@09:06.sql  kampus_db_2020-01-13@08:54.sql
kampus_db_2020-01-06@09:06.sql  kampus_db_2020-01-14@08:54.sql
kampus_db_2020-01-07@09:14.sql  kampus_db_2020-01-15@08:54.sql
kampus_db_2020-01-08@01:06.sql

2. Urutkan file secara descending berdasarkan nama

Urutkan file di atas dengan perintah sort. Flag -d menginstruksi agar pengurutan dilakukan berdasarkan dictionary order. Sedangkan flag r digunakan untuk membalik hasil urutan, alias mengurutkannya dari yang paling belakang atau descending.

Output:

kampus_db_2020-01-15@08:54.sql
kampus_db_2020-01-14@08:54.sql
kampus_db_2020-01-13@08:54.sql
kampus_db_2020-01-12@08:54.sql
kampus_db_2020-01-11@08:54.sql
kampus_db_2020-01-10@09:06.sql
kampus_db_2020-01-09@09:06.sql
kampus_db_2020-01-08@01:06.sql
kampus_db_2020-01-07@09:14.sql
kampus_db_2020-01-06@09:06.sql
kampus_db_2020-01-05@09:06.sql
kampus_db_2020-01-04@09:14.sql
kampus_db_2020-01-03@09:14.sql
kampus_db_2020-01-02@09:14.sql
kampus_db_2020-01-01@09:14.sql

3. Skip file 10 file yang pertama

Kita akan menampilkan file yang lebih dari 10 hari dengan menskip 10 baris pertama dari hasil output perintah sebelumnya. Kita tambahkan perintah tail -n +11.

ls | sort -dr | tail -n +11

Output:

kampus_db_2020-01-05@09:06.sql
kampus_db_2020-01-04@09:14.sql
kampus_db_2020-01-03@09:14.sql
kampus_db_2020-01-02@09:14.sql
kampus_db_2020-01-01@09:14.sql

Sekarang kita hanya memiliki 5 file saja dari tanggal 5 Januari 2020 sampai tanggal 1 Januari 2020.

4. Hapus file yang lebih dari 10 hari

Untuk menghapus file yang lebih dari 10 hari. Kita tambahkan xargs rm pada perintah sebelumnya setelah menambahkan tanda | pipe.

ls | sort -dr | tail -n +11 | xargs rm

5. Hapus file secara rutin

Untuk menghapus file secara rutin, tambahkan perintah di atas di dalam crontab.

0 0 * * * ls | sort -dr | tail -n +11 | xargs rm

Kesimpulan

Database adalah salah satu aset paling mahal untuk suatu perusahaan. Maka dari itu wajib untuk di-backup secara berkala. Dengan memanfaatkan cronjob, kita bisa memerintahkan sistem untuk membackup database MySQL sesuai kebutuhan kita: bisa sehari sekali, atau setiap jam sekali, atau setiap hari senin, atau setiap tanggal 1 dan tanggal 10 tiap bulannya, dan sebagainya.

Ditambah lagi dengan beberapa tips bash shell, kita bisa menghapus file backup yang sudah lebih dari sekian hari sesuai dengan kebutuhan kita, agar storage server kita tidak membengkak hanya gara-gara file backup yang terlalu banyak.