mysql-backup/mysqlbackup.sh

142 lines
5.7 KiB
Bash
Raw Permalink Normal View History

2020-02-15 11:27:51 +01:00
#!/bin/bash
## author : Dryusdan
## date : 15/02/2020
## description : A MySQL dumper
2023-01-26 11:58:50 +01:00
## usage : ./mysqlbackup.sh /BASE/BACKUP/FOLDER RETENTION USERNAME PASSWORD HOST HEALTCHECK_UUID
2020-02-15 11:27:51 +01:00
## Bash strict mode ####################################
set -o errexit # abort on nonzero exitstatus
set -o pipefail # don't hide errors within pipes
2020-02-15 11:59:58 +01:00
#set -o nounset # abort on unbound variable
2020-02-15 11:27:51 +01:00
## Logs ################################################
readonly SCRIPTNAME="$(basename "$0")"
2023-01-26 11:58:50 +01:00
info() { echo -e "[INFO] $* " | logger --tag "${SCRIPTNAME}" ; }
warning() { echo -e "[WARNING] $* " | logger --tag "${SCRIPTNAME}" ; }
error() { echo -e "[ERROR] $* " | logger --tag "${SCRIPTNAME}" ; }
fatal() { echo -e "[FATAL] $* " | logger --tag "${SCRIPTNAME}" ; exit 1 ; }
2020-02-15 11:27:51 +01:00
########################################################
## Define variables ###################################
info "Define variables"
2021-05-24 21:14:11 +02:00
DATE=$(date '+%s')
2020-02-15 11:27:51 +01:00
info "Source ${HOME}/.env"
source "${HOME}/.env"
info "Sourced"
function cleanup()
{
sudo /usr/bin/umount ${HOME}/cifs/
}
trap cleanup EXIT
sudo /usr/bin/mount -t cifs -o seal,user="${CIFSUSER}",pass="${CIFSPASSWD}",uid=$(id -u),gid=$(id -g),forceuid,forcegid, //"${CIFSUSER}.your-storagebox.de"/"${CIFSUSER}" ${HOME}/cifs/
2020-02-15 11:41:18 +01:00
if [ $# -eq 0 ]
then
2020-02-15 12:20:28 +01:00
fatal "No arguments supplied. Usage : ./mysqlbackup.sh /BASE/BACKUP/FOLDER RETENTION USERNAME PASSWORD HOST PORT"
2020-02-15 11:41:18 +01:00
fi
2020-02-15 11:59:58 +01:00
if [ -z "${1}" ];
2020-02-15 11:36:53 +01:00
then
2020-02-15 12:20:28 +01:00
fatal "Folder is not defined. Usage : ./mysqlbackup.sh /BASE/BACKUP/FOLDER RETENTION USERNAME PASSWORD HOST PORT"
2020-02-15 11:36:53 +01:00
else
FOLDER="${1}/${DATE}"
FOLDER_WITHOUT_DATE="${1}/"
2020-02-15 11:36:53 +01:00
fi
2020-02-15 11:59:58 +01:00
if [ -z "${2}" ];
2020-02-15 11:36:53 +01:00
then
2020-02-15 12:20:28 +01:00
fatal "Retention is not defined. Usage : ./mysqlbackup.sh /BASE/BACKUP/FOLDER RETENTION USERNAME PASSWORD HOST PORT"
2020-02-15 11:36:53 +01:00
else
2020-02-15 12:20:28 +01:00
RETENTION="${2}"
2020-02-15 11:36:53 +01:00
fi
2020-02-15 11:59:58 +01:00
if [ -z "${3}" ];
2020-02-15 11:36:53 +01:00
then
2020-02-15 12:20:28 +01:00
fatal "Username is not defined. Usage : ./mysqlbackup.sh /BASE/BACKUP/FOLDER RETENTION USERNAME PASSWORD HOST PORT"
2020-02-15 11:36:53 +01:00
else
2020-02-15 12:20:28 +01:00
USERNAME=${3}
2020-02-15 11:36:53 +01:00
fi
2020-02-15 11:59:58 +01:00
if [ -z "${4}" ];
2020-02-15 12:20:28 +01:00
then
fatal "Password is not defined. Usage : ./mysqlbackup.sh /BASE/BACKUP/FOLDER RETENTION USERNAME PASSWORD HOST PORT"
else
PASSWORD=${4}
fi
if [ -z "${5}" ];
2020-02-15 11:36:53 +01:00
then
warning "Host not defined, use 127.0.0.1 by default"
HOST="127.0.0.1"
else
2020-02-15 12:20:28 +01:00
HOST=${5}
2020-02-15 11:36:53 +01:00
fi
2020-02-15 12:20:28 +01:00
if [ -z "${6}" ];
2020-02-15 11:36:53 +01:00
then
warning "Port not defined, use 3306 by default"
PORT="3306"
else
2020-02-15 12:20:28 +01:00
PORT=${6}
2020-02-15 11:36:53 +01:00
fi
2020-02-15 11:27:51 +01:00
2023-01-26 11:58:50 +01:00
if [ -z "${7}" ];
then
HC=false
else
HC=true
HC_UUID="${7}"
fi
2020-02-15 11:27:51 +01:00
## Run dump ######################################
info "Create backup folder"
2020-02-15 14:27:21 +01:00
mkdir -p ${FOLDER}/{databases,schemas,datas,extras}/
2020-02-15 11:27:51 +01:00
info "Dumping databases"
2023-01-26 11:58:50 +01:00
curl --silent --retry 3 "https://cron.dryusdan.net/ping/${HC_UUID}/start" > /dev/null
for dbname in $(/usr/bin/mysql --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} -N -e "show databases" | grep -v "information_schema" | grep -v "mysql" | grep -v "performance_schema")
2020-02-15 11:27:51 +01:00
do
if ! mountpoint -q -- "${FOLDER_WITHOUT_DATE}"; then
curl --silent --retry 3 "https://cron.dryusdan.net/ping/${HC_UUID}/fail" > /dev/null
fatal "Mountpoint not mounted"
fi
2020-02-15 11:27:51 +01:00
info "Dumping ${dbname}"
mkdir -p ${FOLDER}/{schemas,datas}/${dbname}
info "Dumping ${dbname} schema"
2023-01-26 11:58:50 +01:00
/usr/bin/mysqldump --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} --no-data ${dbname} | gzip > ${FOLDER}/databases/${dbname}.sql.gz
2020-02-15 13:01:27 +01:00
info "Dumping events, routines, triggers of ${dbname}"
2023-01-26 11:58:50 +01:00
/usr/bin/mysqldump --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} --no-data --no-create-info --routines --triggers --events ${dbname} | gzip > ${FOLDER}/extras/${dbname}.sql.gz
2020-02-15 11:27:51 +01:00
info "Know engine of database"
## If all tables use InnoDB engine, we use --single-transaction
## Also, if one or more table use MyISAM engine, we need lock all tables
2023-01-26 11:58:50 +01:00
if /usr/bin/mysql --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} -N -e "select engine from information_schema.tables where table_schema = '${dbname}'" | grep "MyISAM" -q;
2020-02-15 11:27:51 +01:00
then
warning "${dbname} have a table who using MyISAM engine."
info "Dumping with lock"
2023-01-26 11:58:50 +01:00
for tablename in $(/usr/bin/mysql --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} -N -e "show tables" ${dbname})
2020-02-15 11:27:51 +01:00
do
2020-02-15 12:14:43 +01:00
info "Dumping ${tablename}'s schema of ${dbname}"
2023-01-26 11:58:50 +01:00
/usr/bin/mysqldump --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} --no-data --add-locks --add-drop-table ${dbname} ${tablename} | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' | gzip > ${FOLDER}/schemas/${dbname}/${tablename}.sql.gz
2020-02-15 12:14:43 +01:00
info "Dumping ${tablename}'s data of ${dbname}"
2023-01-26 11:58:50 +01:00
/usr/bin/mysqldump --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} --no-create-info --add-locks --extended-insert=FALSE ${dbname} ${tablename} | gzip > ${FOLDER}/datas/${dbname}/${tablename}.sql.gz
done
2020-02-15 11:27:51 +01:00
else
info "Dumping with single transaction"
2023-01-26 11:58:50 +01:00
for tablename in $(/usr/bin/mysql --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} -N -e "show tables" ${dbname})
2020-02-15 11:27:51 +01:00
do
info "Dumping ${tablename}'s schema of ${dbname}"
2023-01-26 11:58:50 +01:00
/usr/bin/mysqldump --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} --no-data --skip-lock-tables --add-drop-table ${dbname} ${tablename} | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' | gzip > ${FOLDER}/schemas/${dbname}/${tablename}.sql.gz
info "Dumping ${tablename}'s data of ${dbname}"
2023-01-26 11:58:50 +01:00
/usr/bin/mysqldump --user=${USERNAME} --password=${PASSWORD} --host=${HOST} --port=${PORT} --no-create-info --skip-lock-tables --single-transaction --extended-insert=FALSE ${dbname} ${tablename} | gzip > ${FOLDER}/datas/${dbname}/${tablename}.sql.gz
done
2020-02-15 11:27:51 +01:00
fi
2020-02-15 14:42:32 +01:00
done
2020-02-15 11:27:51 +01:00
info "Backup is done"
2023-01-26 11:58:50 +01:00
curl --silent --retry 3 "https://cron.dryusdan.net/ping/${HC_UUID}/" > /dev/null
2020-02-15 12:20:28 +01:00
info "Removing old backup"
2021-01-15 16:34:52 +01:00
find ${FOLDER_WITHOUT_DATE} -mtime +${RETENTION} -exec rm -rf {} \;
info "Removing done"