MySQL Backup script with encryption
posted in programming by jon on 2007-02-27
I recently rewrote the script that handles our mysql backups, and thought someone else might find it useful. It includes support for optional bzip compression of the dump files, and optional encryption using openssl. It's available for download here or you can see it inline after the jump
#!/bin/bash ################################################################## # sqlbackup.sh: # rolling sqlbackups using mysqldump # # # This script will dump mysql databases to a specified directory # with optional encrytion. # # ################################################################### # program options backup_dir=/backup backup_age=28 use_encryption=0 use_bzip=0 nice_level=19 mysql_user=root mysql_passfile=/etc/keys/.mysqlpass openssl_passfile=/etc/keys/.opensslpass date=`date +%Y%m%d` exten=".sql" logfile=/var/log/mysqlbackup.log mysqldump_options=" --all-databases --single-transaction --quote-names " # program paths mysqldump=/usr/bin/mysqldump openssl=/usr/bin/openssl bzip2=/usr/bin/bzip2 # usage summary function usage { echo " sqlbackup.sh: creates backups of sql databases using the mysqldump command, including optional encryption, bzip2 compression, and variable backup aging Usage: sqlbackup.sh [OPTIONS] Options: -h : display this help -b <dir> : select directory to store backups. This directory will not be created. -e : enable encryption using openssl's des3 encryption. -k <file> : specify file containing password to be used for encryption This defaults to /etc/keys/.opensslpass -u <user> : username to use for connecting to MySQL -p </user></file><file> : specifies a file containing a password to be used for connecting to MySQL -z : enable bzip2 compression of backups -a <days> : backup age in days. Backups older than this will be deleted -n <level> : Specifies a nice level. This level will apply to all operations of the backup. Defaults to 19 (very nice) -l </level></days></file><file> : logfile path. Alternate path to a file for logging. Defaults to '/var/log/mysqlbackup.log' " } # echo a string to screen and log function echo_and_log { logstring="[ `date` ] : $*" echo $logstring echo $logstring >> $logfile } # print error to screen and exit function exit_with_error { echo_and_log "Error: $*" echo_and_log "Exiting with code 1" exit 1 } # funtion to delete old backups function clean_backups { find $backup_dir -type f -mtime +${backup_age} -exec rm -f {} \; [ "$?" == "0" ] || echo_and_log "Error encountered when cleaning old backups from $backup_dir" } # process command line options while getopts ":hb:ek:u:p:za:n:l:" opt do case $opt in b) backup_dir=$OPTARG ;; e) use_encryption=1 ;; k) openssl_passfile=$OPTARG ;; u) mysql_user=$OPTARG ;; p) mysql_passfile=$OPTARG ;; z) use_bzip=1 ;; a) backup_age=$OPTARG ;; n) nice_level=$OPTARG ;; l) logfile=$OPTARG ;; h) usage exit 0 ;; \?) echo "unknown option" usage exit 1 ;; *) usage exit 1 ;; esac done # set umask umask 0077 # start processing echo_and_log "Starting MySQL backup: encryption = $use_encryption, bzip = $use_bzip, backup directory = $backup_dir" # error checking and validation [ -d $backup_dir ] || exit_with_error "Backup directory '$backup_dir' does not exist" [ -n "$logfile" ] || exit_with_error "No log file specified." [ -f $mysql_passfile ] || exit_with_error "MySQL password file '$mysql_passfile' does not exist" [ -x $mysqldump ] || exit_with_error "MySQLDump program at '$mysqldump' does not exist or is not executable" # validate compression options if [ "$use_bzip" == "1" ] then [ -x $bzip2 ] || exit_with_error "Bzip2 program at '$bzip2' does not exist or is not executable" bzip2_command=" | nice -n $nice_level $bzip2 " exten="${exten}.bz2" fi # validate encryption options if [ "$use_encryption" == "1" ] then [ -x $openssl ] || exit_with_error "OpenSSL program at '$openssl' does not exist or is not executable" [ -f $openssl_passfile ] || exit_with_error "OpenSSL password file '$openssl_passfile' does not exist" openssl_command=" | nice -n $nice_level $openssl des3 -salt -pass file:${openssl_passfile} " exten="${exten}.cryp" fi # call funtion to clean backup directory clean_backups # execute dump command command="$mysqldump $mysqldump_options --user=${mysql_user} --password=$(<$mysql_passfile) $bzip2_command $openssl_command > $backup_dir/mysqlbackup_${date}${exten}" eval $command [ "$?" == "0" ] || exit_with_error "MySQLDump command returned non-zero error code. Backup not completed successfully" # finish echo_and_log "Backup complete" exit 0 </file></dir>
Subscribe 