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 @ line 22).
This will create a series of files over time with daily/weekly/monthly MySQL dump backups.
#!/usr/bin/perl -w
# rtar_mysql.pl
#
# No arguments. The program is to be modified to include each database to be archived.
#
# Saves a tar of a remote mysql dump in a rotating file.
#
# This is used on Andrew's workstation to automatically grab a sql dump tar of each database daily.
#
use strict;
use warnings;
use DateTime;
my $fileError;
my $jobError = 0;
my $jobErrors = "";
my $result;
# Specify a data block for each remote database to be archived.
my %dumpJobs = (
'db1' => {
'remoteServer' => 'server_1',
'database' => 'database_name_1',
'dbUser' => 'database_username_1',
'dbPassword' => 'database_password_1',
'dumpFilename' => 'server_1-database_name_1.dump.sql',
'mysqlDumpCmd' => '/usr/bin/mysqldump',
'tarCmd' => '/bin/tar',
},
'db2' => {
'remoteServer' => 'server_2',
'database' => 'database_name_2',
'dbUser' => 'database_username_1',
'dbPassword' => 'database_password_2',
'dumpFilename' => 'server_2-database_name_2.dump.sql',
'mysqlDumpCmd' => '/usr/bin/mysqldump',
'tarCmd' => '/bin/tar',
},
);
# Process each specified database dump/archive job.
for my $dumpJob ( sort keys %dumpJobs ) {
$fileError = 0;
my $tarballFilename = "$dumpJobs{$dumpJob}{'dumpFilename'}-" . tarDateSegment() . ".tgz";
my $mysqlDumpCmd = $dumpJobs{$dumpJob}{'mysqlDumpCmd'};
my $tarCmd = $dumpJobs{$dumpJob}{'tarCmd'};
print "$dumpJob\n";
my $dumpCommand = "ssh $dumpJobs{$dumpJob}{'remoteServer'} '$mysqlDumpCmd ";
$dumpCommand .= "--user=$dumpJobs{$dumpJob}{'dbUser'} --password=$dumpJobs{$dumpJob}{'dbPassword'} ";
$dumpCommand .= "$dumpJobs{$dumpJob}{'database'} > $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 ) {
# using a more flexible naming scheme now
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_mysql.pl - Andrew's remote MySQL archive program.
=head1 SYNOPSIS
use: rtar_mysql.pl
=head1 DESCRIPTION
This is a program I wrote to SSH/dump/tar/download/rotate archives of MySQL databases.
=over
=back
=head1 LICENSE
None.
=head1 AUTHOR
Andrew Ault <http://www.andrewault.net/>
=cut


Can I use the “swiss army chainsaw” image on my own website?
Hi Curtis,
Sure!
-Andrew