sábado, 24 de enero de 2009

Script para hacer backup's de bases de datos MySQL

En estos días me vi ante la necesidad de mejorar los backups de mis servidores {es:MySQL}, por lo que me puse a jugar con {es:Perl} para llevar a cabo el trabajo.

En la primer parte del mismo podrán ver que tuve que definir la ruta hacia los archivos ejecutables que utilizo para llevar a cabo la tarea, esto es porque este script lo utilizo en un servidor con {es:Solaris_(sistema_operativo)|Solaris} y debo utilizar algunas herramientas de GNU tal como el GNU tar.

Al momento de usarse, deben configurar las variables que contienen el hostname del servidor de bases de datos, el usuario y el password. Además deben completar el directorio en donde se deben almacenar los archivos.

Además Perl debe contar con los módulos DBI y DBD::mysql. En caso de que uses {es:Debian_GNU/Linux|GNU/Linux Debian} o alguno de sus derivados debes tener instalados los siguientes paquetes de APT:

  • libdbi-perl

  • libdbd-mysql-perl


Inicio del script:


#!/usr/bin/perl

# Script que realiza el backup de las bases de datos de MySQL
# Hecho por Ariel S. Weher

use strict;
use warnings;
use DBI;

# Defino los parametros de la base de datos a la que me voy a conectar
my $host = 'mysqlserver';
my $usuario = 'mysqlbackupuser';
my $password = 'My5QL53cr37p455w0rd';
my $dirdestino = '/nfs-mounts/zfs1/backup_servers/mysql-1/';

# Cuantos archivos de backup voy a mantener?
my $numbackup = 14;

# Path de los programas a usar
my $mysqlprogram = '/usr/bin/mysql';
my $dumpprogram = '/usr/bin/mysqldump';
my $tarprogram = '/opt/csw/bin/gtar';
my $rmprogram = '/usr/bin/rm';
my $lsprogram = '/usr/bin/ls';
my $dateprogram = '/usr/bin/date';
my $mkdirprogram = '/usr/bin/mkdir';
my $headprogram = '/usr/bin/head';
my $wcprogram = '/usr/bin/wc';
my $catprogram = '/usr/bin/cat';

# Defino el programa que voy a usar para obtener la copia de la base de datos y sus parametros de funcionamiento
my $parametros = "-h$host -u$usuario -p$password --flush-logs --opt";

# Obtengo todas las bases del server

my @bases = ();
my @lineas = `$mysqlprogram -h $host -u$usuario -p$password -e "show databases" --batch`;

my $n = 0;
foreach (@lineas){
$n++;
chomp;
push(@bases, $_) unless $n eq 1;
}

# Obtengo la fecha en este formato: 20070606-120645
my $fechahora = `$dateprogram +%Y%m%d-%H%m%S`;
chomp $fechahora;

# Directorios
my $existeeldir = 0;
my $directorio = $dirdestino.$fechahora.'.borrame/';

# Extraigo las bases...
foreach my $base (@bases){
print "Haciendo Backup de la Base: $base ($fechahora)...\n";

# Creo el directorio si es que no existe...
if (!$existeeldir){
my $tmpcmd = `$mkdirprogram $directorio`;
$existeeldir = 1;
}
my $tmparchivo = $directorio.$base.'.sql';
my $tmpcmd = `$dumpprogram $parametros $base > $tmparchivo`;
$fechahora = `/bin/date +%Y%m%d-%H%m%S`;
chomp $fechahora;
}

# Comprimo el archivo usando bzip2
print "Comprimiendo el directorio temporal ($directorio)\n";

$fechahora = `$dateprogram +%Y%m%d-%H%m%S`;
chomp $fechahora;

# Voy a ver cuantos archivos hay en el directorio...
my $cantarchivos = `$lsprogram -t -r -1 | $wcprogram -l $dirdestino`;
chomp $cantarchivos;

if ($cantarchivos gt $numbackup){
# Obtengo el archivo mas viejo del directorio
my $archivomasviejo = `$lsprogram -t -r -1 $dirdestino | $headprogram -1`;
chomp $archivomasviejo;
my $jobh = `$rmprogram -rf $archivomasviejo`;
}

my $archivodestino = $dirdestino."bases.$fechahora.tar.bz2";
chomp $archivodestino;

my $tmpcmd = `$tarprogram cvfj $archivodestino $directorio`;
print "\nCreado el archivo $archivodestino\n";
print "Limpiando los directorios temporales...\n";
$tmpcmd = `$rmprogram -rf $directorio` if ($directorio =~ /.*borrame.*/);
print"Que tenga un buen dia...\n";

exit 0;

2 comentarios:

zero dijo...

Hola, alguna vez realizaste script para hacer migración de equipos, switch o router cisco, desde alguna consola tipo putty?

Saludos!

Ariel Weher dijo...

¿Que tipo de migración?. Pregunto porque con el putty podes copiar y pegar...

Si me aclaras un poco esto podemos armarlo.

Saludos

Publicar un comentario