diff --git a/bash/backup-mysql.sh b/bash/backup-mysql.sh index 4af05e0..53f9f6c 100644 --- a/bash/backup-mysql.sh +++ b/bash/backup-mysql.sh @@ -1,6 +1,6 @@ #!/bin/bash ## - # Backup all mySQL databases + # Backup mySQL databases in separate sql dumps # # @copyright 2013 Steffen Vogel # @license http://www.gnu.org/licenses/gpl.txt GNU Public License @@ -22,18 +22,91 @@ # along with this script. If not, see . ## -TIMESTAMP=$(date +"%Y-%m-%dT%H:%M:%S") -BACKUP_DIR="/backup/mysql/$TIMESTAMP" -MYSQL_USER="backup" -MYSQL=/usr/bin/mysql -MYSQL_PASSWORD="password" -MYSQLDUMP=/usr/bin/mysqldump +set -e -DATABASES=`$MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"` +function usage { + cat <<-EOF + Usage: $(basename $0) [-u USER] [-p PASSWORD] DIR -mkdir -p $BACKUP_DIR -for db in $DATABASES; do - $MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --events --databases $db | gzip > "$BACKUP_DIR/$db.gz" + DIR is the directory for the backups (defaults to cwd) + + Options: + -u mysql username + -p mysql password + -h show this help + -d enable verbose output + + written by Steffen Vogel + EOF +} + +function deps() { + FAILED=0 + for DEP in $*; do + if ! which ${DEP} &>/dev/null; then + echo -e "This script requires ${DEP} to run but it is not installed." + ((FAILED++)) + fi + done + return ${FAILED} +} + +if ! deps mysql mysqldump; then + echo -e "mysql tools missing!" + echo + usage + exit 1 +fi + +# parse arguments +while getopts "u:p:hd" OPT; do + case ${OPT} in + p) MYSQL_PASS=${OPTARG} ;; + u) MYSQL_USER=${OPTARG} ;; + d) V=1 ;; + h) + usage + exit 0 ;; + *) + usage + exit 1 + esac done +# clear all options and reset the command line +shift $((OPTIND-1)) + +# parsing backup directory +if [ -n "$1" ]; then + DIR=$(readlink -f $1) +else + DIR=$(pwd) +fi + +# mySQL options +OPTS="" +if [ -n "$MYSQL_USER" ]; then + OPTS+=" -u$MYSQL_USER" +fi + +if [ -n "$MYSQL_PASS" ]; then + OPTS+=" -p$MYSQL_PASS" +fi + +# get all databases +DATABASES=`mysql $OPTS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"` +DATE=$(date +%F_%H-%M-%S) + +mkdir -p $DIR/$DATE +ln -rsfT $DIR/$DATE/ $DIR/latest + +[ -z "$V" ] || echo "Starting mySQL backup: $(date)" +[ -z "$V" ] || echo "$(echo '$DATABASES' | wc -l) databases" +[ -z "$V" ] || echo "Backup directory: $DIR/$DATE" +for db in $DATABASES; do + [ -z "$V" ] || echo -n "Dumping $db ..." + mysqldump $OPTS --force --opt --events --databases $db | gzip > "$DIR/$DATE/$db.sql.gz" + [ -z "$V" ] || echo -e "\b\b\binto $DIR/$DATE/$db.sql.gz ($(du -h $DIR/$DATE/$db.sql.gz | cut -f1))" +done +[ -z "$V" ] || echo "Finished mySQL backup: $(date) ($(du -hs $DIR/$DATE/ | cut -f1))"