As things do, times change, needs change, scripting knowledge changes. About 9 years ago I worked out a quick script to automate the backup and email of MySQL databases. It ran flawlessly for all these years, every night. With a recent hosting provider change, it was time to revisit the script and my needs.
I don’t really need the script to email me the backups every night. I have a server at home that can use RSYNC to get a copy of the whole hosting directory every night. I really just need to get a mysqldump and .gzip it to a directory.
The script now date-stamps the output file, and cleans up old backups after a specified number of days. The user-editable variables are now all at the top instead of using more hard-coded values.
Below is the new single bash script. For your use, replace everything at the top in double angle brackets (ie. <<server>>).
It’s likely this script will stay in place, untouched for another 5-7 years. Set it and forget it. Automation is awesome!
#!/bin/bash
#database_backup.sh
#
# Backup specified database to a date-stamped, gzipped file.
# Delete files older than x days.
#
# User Variables:
SERVER=<<server>>
DATABASE=<<database name>>
USERNAME=<<username>>
PASSWORD='<<password>>'      # Put in single quotes
TARGET_DIR=<<directory>>      # Include '/' at the end
DAYS_TO_RETAIN=7
# Script Variable:
NOW=$(date +%y%m%d)
# Create a pipe named 'pipe'
mkfifo pipe
# Set the input/output
gzip -9 < pipe > ${TARGET_DIR}${NOW}_${DATABASE}.sql.gz &
mysqldump \
    --host=$SERVER --user=$USERNAME --password=${PASSWORD} --databases $DATABASE \
    --add-drop-table --extended-insert --quick > pipe
# Get the return code of mysqldump
result=$?
# Wait until the gzip completes
wait
# Now it is safe to remove the pipe
rm pipe
# Remove files older than 7 days
find $TARGET_DIR -type f -mtime +${DAYS_TO_RETAIN} -name '*.gz' -delete
		
	