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