This is the script I use to SSH remotely dump Subversion repositories on various servers for which I am responsible.
Before you can use this script, you need to set up SSH so your local cron can access the remote servers without a password.
One thing to note about this script is that it automatically rotates the archived dump files; keeping a fie for the 1st of the week on a month, 1st of the month and 1st of the year.
see: Using Public/Private Key Pairs with SSH
Then, just modify the script for your database/servers (the block @ about line 22).
This will create a series of files over time with daily/weekly/monthly Subversion dump backup tar files. The point is not so much to have every state of every repository, but to grab the daily changes without clobbering the last know good one. More is better, no?
#!/usr/bin/perl -w
#
# rtar_svn.pl
#
# by Andrew Ault www.andrewault.net
#
# No arguments. The program is to be modified to include each Subversion repository to be archived.
#
# Saves a tar of a remote Subversion dump in a rotating file.
#
# Of course you have to have SSH authentication already set up.
#
# This get cron'd daily on my local workstation.
#
use strict;
use warnings;
use DateTime;
my $fileError;
my $jobError = 0;
my $jobErrors = "";
my $result;
# Specify a data block for each remote repository to be archived.
my %dumpJobs = (
'servername-repositoryname' => {
'remoteServer' => 'servername',
'repository' => 'repositoryname',
'dumpFilename' => 'servername-repositoryname.dump.svn',
'svnDumpCmd' => '/usr/bin/svnadmin dump', # find svnadmin on your server
'tarCmd' => '/bin/tar', # find tar on your server
},
'servername-repositoryname2' => {
'remoteServer' => 'servername',
'repository' => 'repositoryname2',
'dumpFilename' => 'servername-repositoryname2.dump.svn',
'svnDumpCmd' => '/usr/bin/svnadmin dump',
'tarCmd' => '/bin/tar',
},
);
# Process each specified repository dump/archive job.
for my $dumpJob ( sort keys %dumpJobs ) {
$fileError = 0;
my $tarballFilename = "$dumpJobs{$dumpJob}{'dumpFilename'}-" . tarDateSegment() . ".tgz";
my $svnDumpCmd = $dumpJobs{$dumpJob}{'svnDumpCmd'};
my $tarCmd = $dumpJobs{$dumpJob}{'tarCmd'};
print "$dumpJob\n";
my $dumpCommand = "ssh $dumpJobs{$dumpJob}{'remoteServer'} '$svnDumpCmd ";
$dumpCommand .= "/var/lib/svn/$dumpJobs{$dumpJob}{'repository'} > $dumpJobs{$dumpJob}{'dumpFilename'}'";
print $dumpCommand . "\n";
$result = system($dumpCommand );
if ($result) { $fileError = 1; }
if ( !$fileError ) {
my $remoteMakeTarball = "ssh $dumpJobs{$dumpJob}{'remoteServer'} '$tarCmd ";
$remoteMakeTarball .= "cvfz $tarballFilename $dumpJobs{$dumpJob}{'dumpFilename'}'";
print $remoteMakeTarball . "\n";
$result = system($remoteMakeTarball );
if ($result) { $fileError = 1; }
}
if ( !$fileError ) {
my $downloadCommand = "scp $dumpJobs{$dumpJob}{'remoteServer'}:$tarballFilename .";
print $downloadCommand . "\n";
$result = system($downloadCommand );
if ($result) { $fileError = 1; }
}
if ($fileError) {
$jobError = 1;
$jobErrors .= "$dumpJob ";
}
}
if ($jobError) {
warn "Errors were encountered: $jobErrors\n";
exit(1);
}
sub tarDateSegment {
my $dt = DateTime->now();
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
$year += 1900;
my $dateTime = sprintf "%4d-%02d-%02d %02d:%02d:%02d", $year, $mon + 1, $mday, $hour, $min, $sec;
my $date = sprintf "%4d-%02d-%02d", $year, $mon + 1, $mday;
my @weekdays = qw( sun mon tue wed thu fri sat );
my $weekday = $weekdays[$wday];
my @months = qw( jan feb mar apr may jun jul aug sep oct nov dec );
my $month = $months[$mon];
my $weekOfMonth = $dt->week_of_month;
my $dateTar = "";
# if the first day of the year, set $dateTar like: 2009-1st
if ( $yday == 1 ) {
$dateTar = "$year-1st";
}
# if the first day of the month, set $dateTar like: feb-1st
elsif ( $mday == 1 ) {
$dateTar = "$month-1st";
}
# if the first day of the week, set $dateTar like: mon-1
# where the number is the week of the month number
elsif ( $wday == 1 ) {
$dateTar = "$weekday-$weekOfMonth";
}
# otherwise, set the $dateTar like: mon
else {
$dateTar = "$weekday";
}
# $sec seconds 54
# $min monutes 37
# $hour hour 11
# $mon month 4
# $year year 2009
# $wday weekday 3
# $yday day of the year 146
# $isdst is DST 1
# $weekday day of the week wed
# $month month may
# $dateTime date and time 2009-05-27 11:37:54
# $date date 2009-05-27
return $dateTar;
}
=head1 NAME
rtar_svn.pl - Andrew's remote Subversion repository archive program.
=head1 SYNOPSIS
use: rtar_svn.pl
=head1 DESCRIPTION
This is a program I wrote to SSH/dump/tar/download/rotate archives of Subversion repositories.
=over
=back
=head1 LICENSE
Use this as you will.
=head1 AUTHOR
Andrew Ault <http://www.andrewault.net/>
=cut

