Backing Up Subversion Automatically
Subversion is great, but like any data repository, it must be backed up regularly. Many people have tried to implement version control without really understanding how it works, only to later discover that their backup strategy wasn’t working.
The backup script I use is run every night as part of a cron job. Each morning I get an email telling me if everything went ok or not. Here is a list of what I want to happen with each backup:
- Dump all the data out of the repository
- Name the file with a timedate stamp in the filename. Something like YYYYMMDD-HHMM will work.
- gzip the file to save space
- Move a copy of the file to another server using scp
- Pull the zipped file back down from the remote server
- Unzip it.
- Create a new repository
- Load all of my content into the new repository
- Checkout a copy of trunk into a directory
- Cleanup
Dumping Subversion repo /var/svn to my_backup-20050921-0100... Backing up through revision 340... Compressing dump file... Created /home/admin/backups/my_backup-20050921-0100.gz my_backup-20050921-0100.gz transfered to my.server.com --------------------------------------- Testing Backup --------------------------------------- Downloading my_backup-20050921-0100.gz from my.server.com Unzipping my_backup-20050921-0100.gz Creating test repository Loading repository Checking out repository Cleaning up
If you want to use this on Windows, you’ll need to make a few changes. First the way we generate the time and datestamp for the file name will need changed. You’ll probably want to use something other than scp and gzip as well.
Here is the script. I hope some people find it useful.
my $svn_repo = “/var/svn”;
my $bkup_dir = “/home/backup_user/backups”;
my $bkup_file = “my_backup-”;
my $tmp_dir = “/home/backup_user/tmp”;
my $bkup_svr = “my.backup.com”;
my $bkup_svr_login = “backup”;
$bkup_file = $bkup_file . `date +%Y%m%d-%H%M`;
chomp $bkup_file;
my $youngest = `svnlook youngest $svn_repo`;
chomp $youngest;
my $dump_command = “svnadmin -q dump $svn_repo > $bkup_dir/$bkup_file “;
print “\nDumping Subversion repo $svn_repo to $bkup_file…\n”;
print `$dump_command`;
print “Backing up through revision $youngest… \n”;
print “\nCompressing dump file…\n”;
print `gzip -9 $bkup_dir/$bkup_file\n`;
chomp $bkup_file;
my $zipped_file = $bkup_dir . “/” . $bkup_file . “.gz”;
print “\nCreated $zipped_file\n”;
print `scp $zipped_file $bkup_svr_login\@$bkup_svr:/home/backup/`;
print “\n$bkup_file.gz transfered to $bkup_svr\n”;
#Test Backup
print “\n—————————————\n”;
print “Testing Backup”;
print “\n—————————————\n”;
print “Downloading $bkup_file.gz from $bkup_svr\n”;
print `scp $bkup_svr_login\@$bkup_svr:/home/backup/$bkup_file.gz $tmp_dir/`;
print “Unzipping $bkup_file.gz\n”;
print `gunzip $tmp_dir/$bkup_file.gz`;
print “Creating test repository\n”;
print `svnadmin create $tmp_dir/test_repo`;
print “Loading repository\n”;
print `svnadmin -q load $tmp_dir/test_repo < $tmp_dir/$bkup_file`;
print “Checking out repository\n”;
print `svn -q co file://$tmp_dir/test_repo $tmp_dir/test_checkout`;
print “Cleaning up\n”;
print `rm -f $tmp_dir/$bkup_file`;
print `rm -rf $tmp_dir/test_checkout`;
print `rm -rf $tmp_dir/test_repo`;
September 23rd, 2005 at 6:35 am
Backing up Subversion Automatically
Mark W. Shead has an article on Backing Up Subversion Automatically. I’ve been trying to make time to write a script like this, now Mark has provided one. Thanks Mark!
…
October 25th, 2005 at 12:00 pm
A very nice script indeed. I’ve got a enhancement proposal, though: use ISO-Format timestamps. Those are guaranteed to be understood by people and machines alike. date -Is produces such timestamps to second-level precision. They look like this:
2005-10-25T18:56:37+0200
Easily parseable by machines and unsuspecting non-nerdy ;) users. It also includes the timezone, which is nifty if you admin machines across time or even date borders. I’ve taken to only use ISO stamps everywhere since they can be sorted quite easily, too.