From 6d309751f4ddb32a0b404f3736dc8b8b055dfcab Mon Sep 17 00:00:00 2001 From: Naum Soloveychik Date: Fri, 10 Jan 2020 21:34:23 +0300 Subject: [PATCH] first commit --- README.md | 15 +++++ mysql_backup.sh | 172 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 mysql_backup.sh diff --git a/README.md b/README.md index fefbaa6..e8c56d8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,17 @@ # mysql_backup + +MySQL backup shell script Feature rich MySQL / MariaDB backup script. + +# Setup password + +Set mysql `user` and `password` to user that execute script using `.my.cnf` in user homedir. + +# .my.cnf example + +``` + [client] + user = mysqldump + password = secret_passwd_here_HMnab4sBMmMwtDgvF=qZuuU#gsED9u6J + host = localhost +``` \ No newline at end of file diff --git a/mysql_backup.sh b/mysql_backup.sh new file mode 100644 index 0000000..787f631 --- /dev/null +++ b/mysql_backup.sh @@ -0,0 +1,172 @@ +#!/bin/sh +# set mysql user and password to user who dump mysql by .my.cnf in user homedir +# +# nano /home/mysqldump/.my.cnf +# [client] +# user = mysqldump +# password = secret_passwd_here_HMnab4sBMmMwtDgvF=qZuuU#gsED9u6J +# host = localhost +# + +export PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" ; + +script="$(basename "$(test -L "${0}" && readlink "${0}" || echo "${0}")")" ; +mypidfile="/var/run/`basename ${0}`.pid" ; + +usage() +{ + echo "Usage: mysql_backup.sh -d /var/backup -n daily [-c 10 -s -a -e test@domain.org]" + echo + echo "-d | --dir :: backup directory" + echo "-n | --name :: backup name" + echo "-c | --copies :: number of copies to store (default 10)" + echo "-e | --email :: notification email" + echo "-l | --lock-all-tables" + echo "-s | --single-transaction" + echo "-a | --archive :: gzip dump" + echo "-q | --quiet" + echo "-h help" +} + +error() +{ + + echo -e "\033[0;31m${1}\e[00m" ; + if ! [ "${email}" = "" ] ; then + echo "ERROR: `hostname`, ${script}: ${1}" | mail -s "'ERROR: `hostname`, ${script}: ${1}'" ${email} ; + fi +} + +while [ "$1" != "" ]; do + case $1 in + -d | --dir ) shift + dir=$1 + ;; + -n | --name ) shift + name=$1 + ;; + -c | --copies ) shift + copies=$1 + ;; + -e | --email ) shift + email=$1 + ;; + -l | --lock-all-tables ) lock=1 + ;; + -s | --single-transaction ) singletrans=1 + ;; + -a | --archive ) archive=1 + ;; + -q | --quiet ) quiet=1 + ;; + -h | --help ) usage + exit + ;; + * ) usage + exit 1 + esac + shift +done + +if [ "${dir}" = "" ] ; +then + usage ; + error "Backup dir is not set!" + exit 1 ; +fi + +if [ "${name}" = "" ] ; +then + usage ; + error "Name of backup is not set!" + exit 1 ; +fi + +if [ "${copies}" = "" ] || [ ! -n "${copies}" ] || [ "${copies}" -le "0" ] ; +then + copies=10 +fi + + +if ! [ -d ${dir} ] ; then + + error "Directory '${dir}' does not exists!" ; + exit 1 ; +fi + +if [ -s ${mypidfile} ] ; then + error "ERROR: `hostname` script ${script} already running!" ; + exit 1 ; +fi + +trap "rm -f ${mypidfile} ;" EXIT INT KILL TERM SIGKILL SIGTERM; + +echo $$ > ${mypidfile} ; + +mysqlparams=" --all-databases \ + --add-drop-database \ + --add-drop-table \ + --add-drop-trigger \ + --add-locks \ + --compact \ + --disable-keys \ + --apply-slave-statements \ + --allow-keywords \ + --complete-insert \ + --create-options \ + --default-character-set=UTF8 \ + --dump-date \ + --events \ + --extended-insert \ + --flush-privileges \ + --master-data \ + --include-master-host-port \ + --order-by-primary \ + --quick \ + --quote-names \ + --routines \ + --triggers \ + --force \ + --max-allowed-packet=512M + --log-error=/var/log/mysqldump.log" ; + +if [ "${singletrans}" ] ; then + mysqlparams="${mysqlparams} --single-transaction" ; +fi + +if [ "${lock}" ] ; then + mysqlparams="${mysqlparams} --lock-all-tables" ; +fi + +if [ `ls ${dir} | grep mysqldump.daily | wc -l` -ge "${copies}" ] ; then + i=1; + for filename in `ls ${dir} | grep mysqldump.daily. | sort -r` ; do + if [ "${i}" -ge "${copies}" ] ; then + rm "${dir}/${filename}" ; + fi + i=$(expr $i + 1) + done +fi + +if [ ! "${quiet}" ] ; then + echo "Starting database dump (`date +\"%Y-%m-%d %H:%M:%S\"`)" ; +fi + +date=`date +"%y%m%d.%H%M%S"` ; + +dump_file_name="${dir}/mysqldump.${name}.${date}.sql" ; + +mysqldump ${mysqlparams} > ${dump_file_name} ; + +if [ "${archive}" ] ; then + + if [ ! "${quiet}" ] ; then + echo "Archiving dump (`date +\"%Y-%m-%d %H:%M:%S\"`)..." ; + fi + + gzip ${dump_file_name} ; +fi + +rm -f ${mypidfile} ; + +exit 0 ; \ No newline at end of file