-
-
Save makeittotop/267cc00e80bc1528dbe02347d3b736df to your computer and use it in GitHub Desktop.
Script to create full/incremental backups with innobackupex script.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
TMPFILE="/tmp/innobackupex-runner.$$.tmp" | |
USEROPTIONS="--user=XXX --password=XXX" | |
FILTERTABLES="--include=.*[.].*" | |
BACKDIR=/var/mysql-bak | |
BASEBACKDIR=$BACKDIR/base | |
INCRBACKDIR=$BACKDIR/incr | |
FULLBACKUPLIFE=3600 #604800 # How long to keep incrementing a backup for, minimum 60 | |
KEEP=1 # Keep this number of backups, appart form the one currently being incremented | |
START=`date +%s` | |
echo "----------------------------" | |
echo | |
echo "innobackupex-runner.sh: MySQL backup script" | |
echo "started: `date`" | |
echo | |
# Check base dir exists and is writable | |
if test ! -d $BASEBACKDIR -o ! -w $BASEBACKDIR | |
then | |
error | |
echo $BASEBACKDIR 'does not exist or is not writable'; echo | |
exit 1 | |
fi | |
# check incr dir exists and is writable | |
if test ! -d $INCRBACKDIR -o ! -w $INCRBACKDIR | |
then | |
error | |
echo $INCRBACKDIR 'does not exist or is not writable'; echo | |
exit 1 | |
fi | |
if [ -z "`mysqladmin $USEROPTIONS status | grep 'Uptime'`" ] | |
then | |
echo "HALTED: MySQL does not appear to be running."; echo | |
exit 1 | |
fi | |
if ! `echo 'exit' | /usr/bin/mysql -s $USEROPTIONS` | |
then | |
echo "HALTED: Supplied mysql username or password appears to be incorrect (not copied here for security, see script)"; echo | |
exit 1 | |
fi | |
echo "Check completed OK" | |
# Find latest backup directory | |
LATEST=`find $BASEBACKDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1` | |
AGE=`stat -c %Y $BASEBACKDIR/$LATEST` | |
if [ "$LATEST" -a `expr $AGE + $FULLBACKUPLIFE + 5` -ge $START ] | |
then | |
echo 'New incremental backup' | |
# Create an incremental backup | |
# Check incr sub dir exists | |
# try to create if not | |
if test ! -d $INCRBACKDIR/$LATEST | |
then | |
mkdir $INCRBACKDIR/$LATEST | |
fi | |
# Check incr sub dir exists and is writable | |
if test ! -d $INCRBACKDIR/$LATEST -o ! -w $INCRBACKDIR/$LATEST | |
then | |
echo $INCRBASEDIR 'does not exist or is not writable' | |
exit 1 | |
fi | |
LATESTINCR=`find $INCRBACKDIR/$LATEST -mindepth 1 -maxdepth 1 -type d | sort -nr | head -1` | |
if [ ! $LATESTINCR ] | |
then | |
# This is the first incremental backup | |
INCRBASEDIR=$BASEBACKDIR/$LATEST | |
else | |
# This is a 2+ incremental backup | |
INCRBASEDIR=$LATESTINCR | |
fi | |
# Create incremental Backup | |
innobackupex $USEROPTIONS $FILTERTABLES --incremental $INCRBACKDIR/$LATEST --incremental-basedir=$INCRBASEDIR > $TMPFILE 2>&1 | |
else | |
echo 'New full backup' | |
# Create a new full backup | |
innobackupex $USEROPTIONS $FILTERTABLES $BASEBACKDIR > $TMPFILE 2>&1 | |
fi | |
if [ -z "`tail -1 $TMPFILE | grep 'completed OK!'`" ] | |
then | |
echo "$INNOBACKUPEX failed:"; echo | |
echo "---------- ERROR OUTPUT from $INNOBACKUPEX ----------" | |
cat $TMPFILE | |
rm -f $TMPFILE | |
exit 1 | |
fi | |
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPFILE` | |
echo "Databases backed up successfully to: $THISBACKUP" | |
echo | |
MINS=$(($FULLBACKUPLIFE * ($KEEP + 1 ) / 60)) | |
echo "Cleaning up old backups (older than $MINS minutes) and temporary files" | |
# Delete tmp file | |
rm -f $TMPFILE | |
# Delete old bakcups | |
for DEL in `find $BASEBACKDIR -mindepth 1 -maxdepth 1 -type d -mmin +$MINS -printf "%P\n"` | |
do | |
echo "deleting $DEL" | |
rm -rf $BASEBACKDIR/$DEL | |
rm -rf $INCRBACKDIR/$DEL | |
done | |
SPENT=$(((`date +%s` - $START) / 60)) | |
echo | |
echo "took $SPENT minutes" | |
echo "completed: `date`" | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment