~/blog/backup-database-mongodb-cron-shell-script
Published on

Otomatisasi Backup Database MongoDB Menggunakan Cron dan Shell Script

book4 minutes read

Bash Shell Script

source

Di tulisan kali ini, saya ingin menulis tentang bagaimana membackup database secara otomatis menggunakan Cron dan Shell Script. Backup database menurut saya sangat penting untuk dilakukan, karena saya sendiri sebagai tukang jaga server pernah kebobolan dan terakhir backup sudah sangat lama dan itupun masih saya lakukan secara manual. Tentu saja kejadian tersebut memacu adrenalin saya haha

Okee... kita sudahi curhatnya... kita bahas dulu apa itu Cron? apa itu Shell Script?

Cron adalah salah satu program bawaan yang ada pada sistem operasi Linux atau Unix, yang berguna untuk menjalankan tugas yang sudah dijadwalkan pada crontab (cron table).

Shell Script yaitu barisan command atau perintah yang nantinya akan dieksekusi oleh shell. Sek sek... terus Shell itu apa? Shell adalah program penghubung antara user dengan sistem operasi agar bisa saling komunikasi. ~~kayaknya sih gitu.~~

Buat Shell Script

Pertama kita buat dulu file shell scriptnya

touch mongodb_backup.sh
nano mongodb_backup.sh

Sebelumnya disini saya pakai script orang lain, dengan saya modifikasi sedikit karena kebutuhan dan kondisi di server saya.

Berikut script dan penjelasannya

#!/bin/bash

######################################################################
##
##   MongoDB Database Backup Script
##   Written By: Rahul Kumar
##   URL: https://tecadmin.net/shell-script-backup-mongodb-database/
##   Update on: June 20, 2020
##
######################################################################

set -e
export PATH=/bin:/usr/bin:/usr/local/bin

TODAY=`date +"%d%b%Y"` # ambil tanggal hari ini
LAST_DAY=`date -d "-$(date +%d) days +1 month" +%d%b%Y` # ambil tanggal terakhir pada bulan ini

DB_BACKUP_PATH='/home/user/backups/daily' # path direktori backup harian
DB_BACKUP_PATH_MONTHLY='/home/user/backups/monthly' # path direktori backup bulanan, kosongkan value jika tidak perlu backup bulanan

MONGO_HOST='localhost'
MONGO_PORT='27017'

# If mongodb is protected with username password.
# Set AUTH_ENABLED to 1
# and add MONGO_USER and MONGO_PASSWD values correctly

AUTH_ENABLED=0 # ubah jadi 1 jika menggunakan autentikasi
MONGO_USER=''
MONGO_PASSWD=''

# Set DATABASE_NAMES to "ALL" to backup all databases.
# or specify databases names seprated with space to backup
# specific databases only.

DATABASE_NAMES='db_name' # value nama database yang dibackup

## Number of days to keep local backup copy
BACKUP_RETAIN_DAYS=7 # jumlah hari untuk membiarkan berapa lama backup database disimpan lokal

######################################################################
######################################################################

mkdir -p ${DB_BACKUP_PATH}/${TODAY} # buat direktori untuk backup hari ini

AUTH_PARAM=""
# jika mongodb perlu melakukan autentikasi user
if [ ${AUTH_ENABLED} -eq 1 ]; then
  # tambahkan param username dan password
  AUTH_PARAM=" --username ${MONGO_USER} --password ${MONGO_PASSWD} "
fi

# jika value DATABASE_NAMES sama dengan ALL
if [ ${DATABASE_NAMES} = "ALL" ]; then
  # backup semua database
  echo "You have choose to backup all databases"
  mongodump --host ${MONGO_HOST} --port ${MONGO_PORT} ${AUTH_PARAM} --out ${DB_BACKUP_PATH}/${TODAY}/
else
  # jika tidak, backup sesuai list
  echo "Running backup for selected databases"
  for DB_NAME in ${DATABASE_NAMES}
  do
  mongodump --host ${MONGO_HOST} --port ${MONGO_PORT} --db ${DB_NAME} ${AUTH_PARAM} --out ${DB_BACKUP_PATH}/${TODAY}/
  done
fi

# Jika tanggal hari ini sama dengan tanggal hari terakhir bulan ini
# dan value DB_BACKUP_PATH_MONTHLY tidak null
if [ "$TODAY" == "$LAST_DAY" ] && [ ! -z ${DB_BACKUP_PATH_MONTHLY} ]; then
  # buat direktori bulanan
  mkdir -p ${DB_BACKUP_PATH_MONTHLY}
  # salin backup hari ini ke direktori bulanan
  cp -ar ${DB_BACKUP_PATH}/${TODAY} ${DB_BACKUP_PATH_MONTHLY}/${LAST_DAY}
fi

######## Remove backups older than {BACKUP_RETAIN_DAYS} days  ########

# ambil tanggal hari ini dikurangi value variabel BACKUP_RETAIN_DAYS
DBDELDATE=`date +"%d%b%Y" --date="${BACKUP_RETAIN_DAYS} days ago"`
# jika value DB_BACKUP_PATH tidak null
if [ ! -z ${DB_BACKUP_PATH} ]; then
  cd ${DB_BACKUP_PATH}
  # jika value DBDELDATE tidak null
  # dan value DBDELDATE adalah sebuah direktori
  if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
    # hapus direktori backup
    rm -rf ${DBDELDATE}
  fi
fi

######################### End of script ##############################

Dari script diatas kita membuat shell script yang bisa dieksekusi setiap hari untuk melakukan backup database harian dan bulanan dengan membuat direktori sesuai tanggal script saat dieksekusi dan menghapus otomatis direktori yang lama sesuai batas hari penyimpanan backup yang sudah kita set pada script tersebut.

Kemudian kita perlu set permission filenya, agar bisa dieksuksi

chmod +x mongodb_backup.sh

Buat Crontab

Setelah itu kita buat crontab untuk mengeksekusi script tersebut dengan menjalankan perintah

crontab -e

Kemudian tambahkan script berikut

0 2 * * * /home/user/backups/mongodb_backup.sh >> /home/user/backups/mongodb_backup.log 2>&1

Script diatas berarti kita menambahkan tugas untuk cron agar menjalankan script mongodb_backup.sh setiap hari pada jam 2 pagi.

Tambahan

Jika saat mengeksekusi script diatas muncul ... mongodump error Unrecognized field 'snapshot'. tambahkan opsi --forceTableScan di perintah mongodump pada script diatas.

mongodump --forceTableScan --host ${MONGO_HOST} --port ${MONGO_PORT} ${AUTH_PARAM} --out ${DB_BACKUP_PATH}/${TODAY}/

Biasanya hal ini terjadi ketika tool mongodump beda versi dengan database tujuan.

Woiyaa untuk melakukan restore database, kalian bisa menggunakan perintah berikut

mongorestore -d db_name db_name_directory

Untuk script aslinya bisa kalian unduh di github.

dahh gitu aja, see yaa~