Archivo de Etiquetas de 'copias de seguridad'

Copias de seguridad en MySQL con mysqldump.

En los pocos días de vida que tiene este blog es posible que haya mencionado ya que en el proyecto en el que estoy trabajando actualmente estamos utilizando una base de datos MySQL. Sí, lo sé, unas cuantas veces llevo ya… pero es que realmente va muy bien, estamos muy contentos con sus prestaciones hasta la fecha. Se está mostrando rápida y muy fiable… y todo ello con una licencia GPL, no lo olvidemos.

Bueno, el caso es que como es evidente, cuando trabajamos con cualquier sistema tenemos que tener muy bien previsto un método decente de copias de seguridad. En el caso de MySQL tenemos varias alternativas, pero la que a mí más me ha convencido ha sido la herramienta mysqldump. Es realmente sencilla de utilizar y tremendamente funcional. Su funcionamiento exacto con las decenas de opciones que admite se puede encontrar en el propio manual de referencia de MySQL. No requiere instalación alguna, simple y llanamente que dispongamos del archivo mysqldump.exe que conseguiremos sin problemas en la página oficial de MySQL y que si hemos instalado el servidor MySQL probablemente tendremos ya en nuestro equipo.

La herramienta mysqldump nos genera archivos con extensión .sql que incluyen -según hayamos configurado- las instrucciones necesarias para restaurar una base de datos entera -o todas las que tengamos en el servidor MySQL-, desde su creación hasta la adición de los datos pasando por la creación de las tablas. Realmente completito. Para una restauración sólo habría que hacer algo así en una línea de comandos (localhost o servidor según corresponda):

mysql -u root -p -h localhost < C:\archivo_backup.sql

No obstante lo que quiero explicar hoy es cómo he automatizado estas copias de seguridad que hago con mysqldump a través de un archivo batch. Expongo código y después lo comento.

@echo off

set path_mysqldump="C:\Program Files\MySQL\MySQL Server 5.0\bin"
set path_backups="\\99.24.13.29\BBDD\Backups"
set user=root
set password=mi_password
set host=99.24.13.26

if %time:~0,2% GEQ 10 goto :DespuesDeLas10

:AntesDeLas10
%path_mysqldump%\mysqldump --user=%user% --password=%password% 
      -h %host% --databases db_offers --single-transaction 
      > %path_backups%\backup_%date:~6,4%%date:~3,2%%date:~0,2%
        _0%time:~1,1%%time:~3,2%.sql
goto :Salir

:DespuesDeLas10
%path_mysqldump%\mysqldump --user=%user% --password=%password%
      -h %host% --databases db_offers --single-transaction 
      > %path_backups%\backup_%date:~6,4%%date:~3,2%%date:~0,2%
        _%time:~0,2%%time:~3,2%.sql
:Salir

Antes que nada, comentar que las líneas que comienzan por %path… aparecen aquí cortadas por temas de espacio (en píxeles, no en bytes ;-) ) en el blog, pero en realidad deben formar una sola línea que termina con .sql. Debe haber un espacio entre %password% y -h y después otro entre transaction y > %path_, pero en cambio la última linea va sin espacio (%date:~0,2%_0%time va todo seguido, ¿ok?).

Paso a explicarlo. Las primeras cinco líneas después del archiconocido @echo off son asignaciones de valores a las variables que después utilizaremos. Es la parte de configuración del archivo batch.

1) path_mysqldump contiene la ruta del directorio donde se encuentra el archivo mysqldump.exe.

2) path_backups contiene la ruta del directorio donde se almacenará la copia de seguridad, en este ejemplo he puesto una carpeta en un servidor.

3) user es el usuario con el que se ejecutará mysqldump. Parece una perogrullada, pero hay que tener en cuenta que debe disponer de permisos suficientes, aunque no es necesario que sea el usuario root (de hecho mucho mejor si no lo es, ya que así no quedará en un archivo batch visualizable el password del usuario root).

4) password es… sí, eso.

5) host es la máquina donde se encuentra el servidor MySQL que queremos backupear. Si es nuestro propio ordenador escribiremos localhost. A destacar que el servidor MySQL debe estar corriendo en el momento de lanzar el mysqldump.

Lo que sigue es ya la ejecución. En mi caso las copias de seguridad las quiero en formato backup_YYYYMMDD_HHMM con la fecha y la hora de esta manera, ya que así una simple ordenación alfabética de los archivos lleva a cabo también una ordenación por fechas. Para lograr eso hay que jugar con los date:~6,4 y similares y además hay que programar dos ramas en función de que sean antes o después de las 10 de la mañana, ya que hasta entonces necesito concatenar un 0 y un time:~1,1 para la hora con dos dígitos y a partir de las 10 me vale con time:~0,2. Podemos prescindir de hacer estas dos alternativas si vamos a lanzar siempre el batch a la misma hora y será más tardía que esas 10am de la madrugada. En cualquier caso para discernir entre si seguir un camino u otro utilizamos el…

if %time:~0,2% GEQ 10 goto :DespuesDeLas10

…donde GEQ equivale a lo que en lenguaje de programación normal y corriente diríamos >=.

Por último comentar que con esto obtenemos un archivo .bat que podemos ejecutar manualmente o programar para que se ejecute periódicamente a nuestro antojo. Por ejemplo con una simple tarea programada de Windows si no nos queremos complicar demasiado la vida.

Copias de seguridad con ROBOCOPY.

Imagino que a todos los que nos dedicamos a esto nos ocurre que constantemente estamos creando nuevos archivos, nuevas versiones del mismo código, nuevos ficheros que sustituyen al anterior… y vamos haciendo copias de seguridad aquí y allá. Al menos a mí me pasa. Y me pasa también que termino teniendo versiones distintas de una misma cosa en el ordenador portátil y en el de sobremesa, en el pendrive, en el disco duro externo, en el servidor de la empresa… ¡no fuera caso que se perdiera el trabajo!

Pues hace unos días me pregunté si no habría alguna manera fácil y rápida de mantener todo eso un poco más sincronizado. Y sí, claro, la hay. De buenas a primeras seguro que hay un montón de aplicaciones en Softonic que nos permiten hacer copias de seguridad incrementales de manera superprofesional. Pero yo buscaba algo más simple, algo más rápido. Y encontré Robocopy.

Robocopy es una herramienta para copiado de archivos y directorios que nos viene incorporada con Windows Vista (¡algo bueno tenía que tener Vista!). Hace cosas parecidas a las que se podrían hacer con Xcopy, pero si en una linea de comando escribimos:

xcopy /?

El propio sistema nos informa que Xcopy es obsoleto y que utilicemos Robocopy en su lugar. Probemos ahora a escribir:

robocopy /?

Recibimos una explicación de todos los posibles argumentos que podemos utilizar con Robocopy, algo que con alguna información extra añadida también podemos encontrar en la Wikipedia. Sin embargo para un uso simple, rápido y funcional de Robocopy nos basta con crear un archivo .bat tal que así:

@echo off
robocopy C:\Proyectos \\99.34.63.19\AM_Proyectos /E /B
robocopy C:\VBnet \\99.34.63.19\AM_VBnet /E /B
robocopy C:\2006 F:\2006 /E /B
robocopy C:\2007 F:\2007 /E /B
robocopy C:\2008 F:\2008 /E /B

Después basta con ejecutar el .bat y directamente se nos crea una copia incremental de los cinco directorios de la unidad C que hemos especificado en las cinco rutas destino que hemos indicado. Así, los dos primeros se copiarán en sus respectivas carpetas en el servidor, mientras que los otros tres irán a parar a mi pendrive USB. Los parámetros /E y /B nos permiten precisamente hacer eso.

Insisto en que es una copia incremental. Esto significa que la primera vez que se ejecuta se demora unos minutos en función de la cantidad de información a respaldar, pero las siguientes sólo copiará los ficheros modificados, con lo que en principio es bastante rápido. No borra de destino los elementos que ya no forman parte de los directorios de origen, pero es algo que también se puede configurar con el parámetro /PURGE si se desea.

Nota.

Aunque Robocopy viene con Windows Vista, se puede también añadir a sistemas Windows anteriores mediante las Windows Server 2003 Resource Kit Tools que funcionan como su propio nombre indica para Windows Server 2003 y también para Windows XP.




Creative Commons License
El blog de Albert Mata by Albert Mata is licensed under a Creative Commons Reconocimiento-Compartir bajo la misma licencia 2.5 España License.