Well, we had some issues with XenServer and its Metadata Backup in the past, thus I decided to write my own crontab-able script, which is installed/running on each XenServer.

 1#!/bin/bash
 2# Crontab entry for each server:
 3# 02 5 * * * root /usr/local/sbin/xen-pool-backup.sh
 4
 5# Get the pool name
 6POOL_NAME="$( xe pool-list | grep name-label | awk '{ print $4 }' )"
 7HOST_UUID="$( xe host-list hostname=`hostname` | grep "uuid ( RO)" | awk '{ print $5 }' )"
 8
 9DAILY_GENERATIONS=7
10WEEKLY_GENERATIONS=4
11NFS_MOUNT="10.76.5.10:/srv/backup"
12NFS_LOCAL="/tmp/backup-mount/$POOL_NAME"
13
14# Figure out if we're the pool master
15POOL_MASTER="$( xe pool-list | grep master | awk '{ print $4 }' )"
16
17if [ "$POOL_MASTER" == "$HOST_UUID" ] ; then
18  # Only the pool master should backup the pool database, as this is the only
19  # one who has a authoritive pool database
20  
21  # Create the necessary directory and mount the NFS volume
22  mkdir -p ${NFS_LOCAL%/*}
23  mount -t nfs $NFS_MOUNT ${NFS_LOCAL%/*}
24  mkdir -p $NFS_LOCAL
25  
26  if [ -f $NFS_LOCAL/daily.$DAILY_GENERATIONS.gz ]; then
27    rm -f $NFS_LOCAL/daily.$DAILY_GENERATIONS.gz
28  fi
29  
30  OLD_DAILY="$( echo "scale=0; $DAILY_GENERATIONS - 1" | bc )"
31  
32  for OLD in $( seq $OLD_DAILY -1 1 ); do
33    if [ -f $NFS_LOCAL/daily.$OLD.gz ] ; then
34      NEW="$( echo "scale=0; $OLD+1" | bc )"
35      # Save the time stamp somewhere
36      touch $NFS_LOCAL/.timestamp -r $NFS_LOCAL/daily.$OLD.gz
37      mv $NFS_LOCAL/daily.$OLD.gz $NFS_LOCAL/daily.$NEW.gz
38      # Restore the date
39      touch $NFS_LOCAL/daily.$NEW.gz -r $NFS_LOCAL/.timestamp
40    fi
41  done
42  
43  [ -f $NFS_LOCAL/daily.0.gz ] && mv $NFS_LOCAL/daily.0.gz $NFS_LOCAL/daily.1.gz
44  
45  xe pool-dump-database file-name=$NFS_LOCAL/daily.0
46  gzip -9 $NFS_LOCAL/daily.0
47  
48  [ -f $NFS_LOCAL/.timestamp ] && rm $NFS_LOCAL/.timestamp
49  
50  umount ${NFS_LOCAL%/*}
51  rm -rf ${NFS_LOCAL%/*}
52fi