#!/bin/bash # this script will backup all mysql databases from the server to a ftp # server # mysql server informations MYSQL_SERVER="localhost" MYSQL_USER="backup" MYSQL_PASSWORD="password" # databases to exclude, seperated by space # TODO #MYSQL_EXCLUDE_DB="" # ftp server data FTP_SERVER="backup" FTP_USER="ftp" FTP_PASSWORD="password" # target directory on the ftp (if no / at the beginning, relativ to # the first directory after login) FTP_TARGET="mysql" # temporary directory TMP_DIRECTORY="/tmp" # backup name BACKUP_PREFIX="$(hostname -f)_${MYSQL_SERVER}_$(date +%F)" # logging (0 = enabled, all other = disabled) LOGGING="0" ## end of configuration # only output something if logging is enabled log() { if [ $LOGGING -eq 0 ]; then if [ -n "$1" ]; then echo "$@" else cat fi fi } # selfupdate magic _self_update() { pushd $(dirname $0) &>/dev/null git fetch origin 2>/dev/null if [[ -n "$(git whatchanged HEAD..origin/master)" ]]; then echo "Selfupdating backupscript..." | log git merge origin/master | log echo "Selfupdating done." | log echo | log popd &>/dev/null exec $0 fi popd &>/dev/null } # check for tools for prog in git mysqlshow mysqldump ncftpput do if ! hash $prog 2>/dev/null ; then echo "Error: This script needs: $prog. Exiting..." >&2 exit 1 fi done _self_update echo "Started backup of mysql databases ($(date +%c)):" | log echo | log # create temporary dir mkdir -p ${TMP_DIRECTORY} TMP_DIR=$(mktemp -d --tmpdir=${TMP_DIRECTORY}) pushd ${TMP_DIR} >/dev/null 2>&1 # enumerate all mysql databases MYSQL_DATABASES=$(mysqlshow -h${MYSQL_SERVER} -u${MYSQL_USER} \ -p${MYSQL_PASSWORD} | awk '{ print $2 }' | grep -v "^$" | sed \ '1d') # backup all databases to file for db in ${MYSQL_DATABASES} do mysqldump -h${MYSQL_SERVER} -u${MYSQL_USER} -p${MYSQL_PASSWORD} \ ${db} | bzip2 -zc > "${BACKUP_PREFIX}_${db}.sql.bz2" done # echo created log du -sch * | log echo | log # move backups to ftp server for file in * do ncftpput -u${FTP_USER} -p${FTP_PASSWORD} -V -DD ${FTP_SERVER} \ ${FTP_TARGET} ${file} >/dev/null done echo "Finished backup of mysql databases ($(date +%c))" | log # restore old cwd popd >/dev/null 2>&1 rmdir ${TMP_DIR}