summaryrefslogblamecommitdiffstats
path: root/mysql/mysql_backup.sh
blob: c8d5a1833c7674a5d88f524dc427d1057ae62119 (plain) (tree)

























                                                                      
                                                          
 
                                             



                       
                                             

                               


                            
               
          


       

















                                                              
                 
                                            






                                                              
            
 



                                                             
                         
















                                                                     
          



                            
                                                                   


                                        

                                                             


                    
#!/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}