#!/usr/bin/env bash # by: anryko # date: 2017.03.12 # description: Script to backup mysql databases on Debian based OS set -e set -o pipefail umask 0077 trap cleanup ERR INT TERM EXIT # global variables SCRIPT_NAME=mysql_backup BACKUP_DATE=$(date +%F-%H-%M-%S) BACKUP_DIR=/backup/tmp BACKUP_SUBDIR=mysql_$BACKUP_DATE BACKUP_STORE_DIR=/backup/mysql/$BACKUP_DATE MYSQL_USER=$(grep -m1 ^user /etc/mysql/debian.cnf | awk '{print $NF}') MYSQL_PASS=$(grep -m1 ^pass /etc/mysql/debian.cnf | awk '{print $NF}') MYSQL_AUTH="--user=$MYSQL_USER --password=$MYSQL_PASS" MYSQL_DBS=$(/usr/bin/mysql $MYSQL_AUTH -e 'show databases;' | egrep -v "Database|---|information_schema|performance_schema" | fmt -999) # helper functions log() { logger -i -t "$SCRIPT_NAME" -p "user.info" "$*" echo "$*" } cleanup() { log "cleanup started" cd $BACKUP_DIR rm -fr $BACKUP_SUBDIR log "cleanup finished" } mysql_backup() { # call with string of mysql db names to backup separated by ' ' [[ ! -d $BACKUP_DIR/$BACKUP_SUBDIR ]] && mkdir -p $BACKUP_DIR/$BACKUP_SUBDIR mysql_db=$1 while shift; do backup_file_path=$BACKUP_DIR/$BACKUP_SUBDIR/$mysql_db_${mysql_db}_$BACKUP_DATE.gz log "starting backup of $mysql_db database to $backup_file_path" /usr/bin/mysqldump $MYSQL_AUTH $mysql_db | gzip -9 > $backup_file_path log "finished backup of $mysql_db database to $backup_file_path" mysql_db=$1 done [[ ! -d $BACKUP_STORE_DIR ]] && mkdir -p $BACKUP_STORE_DIR log "moving backups to $BACKUP_STORE_DIR" mv $BACKUP_DIR/$BACKUP_SUBDIR/* $BACKUP_STORE_DIR/ } # main log "starting mysql backup" mysql_backup $MYSQL_DBS log "mysql backup finished"