Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

MySQL backup

by penguinfuz (Pilgrim)
on May 24, 2002 at 23:25 UTC ( #169226=sourcecode: print w/ replies, xml ) Need Help??

Category: Utility Scripts
Author/Contact Info penguinfuz at wonderwaylabs dot com
Description: This script backs up each MySQL database into individual gzip'd files; Useful in shared environments where many users have their own MySQL databases and wish to have daily backups of their own data.

UPDATE: 17/07/2003
  • Now using bzip2 for better compression
  • Removed connect() subroutine
TODO
  • Read db owners from a config file and automatically deliver backups to the appropriate ~user dir.
#! /usr/bin/perl -w

# db-backup.pl
# Dump and gzip each MySQL database.

use strict;
use DBI;

my $dbhost  = "localhost";
my $dbuser  = "root";
my $dbpass  = "easyONE";
my $date    = "`date +%Y-%m-%d`";
my $path    = "/your/archive/db";
my $ext     = "bz2";

flush_old($path,$ext);
my($dbh,$sth,$query);

my $dsn = "DBI:mysql:host=$dbhost";
$dbh    = DBI->connect($dsn,$dbuser,$dbpass,{PrintError => 0, RaiseErr
+or => 1});
$query  = qq^SHOW DATABASES^;
$sth    = $dbh->prepare($query);
$sth->execute();

while(my $ref = $sth->fetchrow_array()) {
    my @bp = `mysqldump --user=$dbuser --password=$dbpass --add-drop-t
+able $ref | bzip2 -1 > $path/$ref.$date.$ext`;
}

$sth->finish();
$dbh->disconnect();

# - - - - - - - - - - - - - - - - -
sub flush_old {
   my ($path,$ext) = @_;
   opendir BP_DIR,"$path" or die "Cannot open $path: $!\n";
        my @old_backups = grep { /\.$ext$/ } readdir BP_DIR;
   closedir BP_DIR;

   for (@old_backups) {
        my @args = ("rm","-f","$path/$_");
        system(@args);
   }
}

Comment on MySQL backup
Download Code
Re: MySQL backup
by gav^ (Curate) on May 25, 2002 at 01:55 UTC
    Some points you may want to consider:
    • removing the redundant ( and ) in $query = (qq^SHOW DATABASES^)
    • using bound variables with bind_col and bind_columns
    • replacing grep { $_ =~ ".gz" } with  grep { /\.gz$/ } or being lazing and using <*.gz>
    • using File::Path to remove directories in a portable way
    Hope this helps...

    gav^

      Thanks for the input gav^

      ...removing the redundant ( and ) in $query = (qq^SHOW DATABASES^)
      Done, duhr! ;)

      ...replacing grep { $_ =~ ".gz" } with grep { /\.gz$/ } or being lazing and using <*.gz>
      Done. Since I am already defining the ".gz" extension in a variable, I can just pass that information to the "clean_up()" routine, cool.

      ...using bound variables with bind_col and bind_columns
      ...using File::Path to remove directories in a portable way
      ++ for giving me something new to learn about, cheers!

Back to Code Catacombs

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://169226]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (9)
As of 2014-09-23 10:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (218 votes), past polls