Artículos en "Linux"
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

Jun
17
2011

Axel, un wget con hilos

Si no habéis entendido el titulo del post ni os molesteis en seguir leyendo, a quienes lo hayan entendido y conozcan wget sabran que es el programa de descarga de archivos por defecto de todas las distribuciones linux, todos hemos descargado algun fichero en un terminal gracias a wget.  Permite descargar paginas completas, conexiones ftp, conexiones en directorios protegidos y un largo etcera de opciones, pero no destaca por su velocidad a la hora de descargar ficheros y esto es debido a que hace un solo hilo de petición del fichero.

Para cubrir esta laguna esta axel y no le pidais mas porque no tiene mucho mas , su principal ventaja es el poder crear más de una conexión simultanea descargando y eso hace que la velocidad de descarga del archivo mejore y mucho en multiples ocasiones. Donde mas utilizo axel es en la universidad donde me imagino que tendran balanceadores de carga para que nadie monopolize la conexión, con wget no descargo a mas de 500-600 kb/s  con axel y 100 conexiones multiples llego siempre a los 8-9 mb/s , es una gran mejora para un programa que como wget apenas consume recursos del ordenador.

Lo podreis encontrar en los repositorios de vuestra distro favorita. A la hora de usarlo solo una recomendación, usar el modo alternativo -a , para el indicador de progesión ya que sino os imprimira una linea más en la terminal cada segundo, llegando a ocupar toda la terminal en unos segundos, una buena idea que yo tengo hecha es crear un script en /usr/local/bin/Descargar que automaticamente descargue con axel con un numero predeterminado de hilos (en mi caso 50) y ya ponga el modo alternativo, el contenido del fichero sera unicamente

axel -n 50 -a $1 $2 $3

Siendo $1, $2 … los argumentos de ejecucion del script, con ello simplemente ejecutareis que quereis descargar y automaticamente lo descargareis.

 

Un ejemplo para comprobar la velocidad es

Descargar http://156.35.171.80:8080/project.iso