Jun
18
2011

Automatizar las copias de seguridad de mysql con php

Aunque primero pense en realizar el script con Bash, el hecho de tener que andar utilizando siempre ficheros intermedios pues bash no es capaz de almacenar vectores me ha hecho decantarme en este caso por php para ejecutar los backups, asi pues usaremos php5-cli (command line ) para la creacion del script aunque en su mayor parte seran llamadas al systema como puede ser a mysql, mysqldump o incluso a tar para comprimir el fichero final con todas las bases de datos.

En el script se ha hecho incapie en dividir cada base de datos en un unico fichero .sql con el fin de una mejor organización de la información de cara a posibles averias, en las cuales quizas nos interesa recuperar antes una base de datos que otra.

A la hora de comprimir he realizado una comparativa entre los distimpos compresores, tamaños y tiempos de ejecucion y finalmente me he decantado por tar.gz por ser el más rapido y tener un ratio de compresion aceptable.

El tiempo final de ejecucion del script completo en una base de datos de tamaño 34 mbs es de 1,78 segundos lo cual hace que este muy contento con la rapidez de la copia de seguridad

Un error que os saldra a la hora de ejecutar el script es :

mysqldump: Got error: 1044: Access denied for user ‘root’@'localhost’ to database ‘information_schema’ when using LOCK TABLES

Esto se debe a la proteccion del sistema a esa base de datos propia, no nos importa simplemente no hara copia de esa base de datos y listo.

 

Este es el contenido del Script

<!--? php
$BackUpDir="/home/jonatan/BackUp/Mysql/";
$Password="password";
$Host="localhost";
$User="root";
$Compresor="tar zcvf ";
 
//Eliminamos por si hay ficheros ya de otras ejecuciones erroneas
exec("rm $BackUpDir*.sql");
 
//El uso de tail -n +2 es para quitar la primera linea de la salida de mysql ya que sera el encabezado, Database.
exec(" echo 'show databases; ' | mysql -u$User -h $Host -p$Password | tail -n +2",$BasesDeDatos);
 
foreach ($BasesDeDatos as $db)
exec("mysqldump -u$User -h $Host -p$Password $db  -->&gt; $BackUpDir$db.sql");
 
//Y ahora empaquetamos todo, usaremos tar.bz2 por ser el que mas rate de compresion ha generado en las pruebas
exec("$Compresor $BackUpDir$(date +%d-%m-%Y__%H:%M).tar.gz $BackUpDir*.sql");
//EliminamosS
exec("rm $BackUpDir*.sql");
 
?&gt;

Aqui teneis una copia para descargar aqui

Sobre el autor: Jonatan Menendez

Linuxero blablabla

2 Comments + Add Comment

  • ¿Por qué no usar el archivo .my.cnf y así no tenemos que pasar en el comando el nombre de usuario y contraseña de mysql?

  • Por que mejor no utilizar una herramienta?
    En mi caso yo utilizo MySQLBackupFTP (http://mysqlbackupftp.com). Tiene una version gratuita que te permite programar backups para dos bases de datos. La ventaja es que comprime los backups y los puede enviar a un servidor FTP remoto, ademas que envia notificaciones por email una vez que los backups se han efectuado.

Deja un comentario