Tuesday, January 4, 2011

ZRM for MySQL and NFS locking

I ran into this issue a couple of years ago when we decided to implement a VTL solution for our backups.  We use ZRM for MySQL for our database backups, and it has been extremely dependable.  We were initially backing up to local storage on the backup server, but then moved our target over to a Data Domain DDR530 data restorer.  We accessed the DDR530 via NFS and took the necessary precautions regarding file locking only to still have problems backing up to the DDR530.  After a bit of digging and a minor patch to the ZRM code to disable flocks, backups worked perfectly but purges remained a problem.  All of this was due to forces at work under the hood of the DDR530 which threw a wrench in attempting to thwart locking.

Unable to get the supplied purge script from ZRM to play well with the DDR530, I set out to create a suitable stand-in.  It's nothing fancy, but if for some reason you cannot get the supplied purge process to work, feel free to give this a spin.  It will get the job done without a lot of fuss.

#!/bin/bash

##################################################
# purge-zrm-backups
#
# purges backups without file locking
#
##################################################

BACKUPDIR="/path/to/backups"
PURGELOG="/var/log/mysql-zrm/purgelog"
CURDATE=`date +%s`
TIMESTAMP="date -Iseconds"

echo "$($TIMESTAMP) -- Starting purge session" >> $PURGELOG

for buset in $BACKUPDIR/*
do
   for budate in $buset/*
   do
      KEEP=`grep retention-policy $budate/index | awk -F= '{print$2}'`
      WEEKS=${KEEP:0:1}
      TICKS=$((WEEKS * 7 * 86400))
      CUTOFF=$((CURDATE - TICKS))
      TSTAMP=`grep backup-date-epoch $budate/index | awk -F= '{print$2}'`

      if [ "$TSTAMP" -lt "$CUTOFF" ]; then
         echo "$($TIMESTAMP) -- | Purging $budate" >> $PURGELOG
         rm -rf $budate 2>&1 &
      fi
   done
done

echo "$($TIMESTAMP) -- Finished purge session" >> $PURGELOG

exit 0

Testing.... 1, 2, 3...

Well, if you stumbled in here, thanks for dropping by.  I've been working with Linux and Unix since 1995 and have picked up a few interesting things along the way (as well as found lots of things not to do).  For the past few years I've been working a lot on cross platform integration between Linux and Windows systems so don't think I've fallen and bumped my head if you see a stray post about the evil empire in here.

Hopefully I can share some pointers that will save you some time.  Feel free to comment on anything you see here as there's always room for improvement.