Humanética

http://weblogs.javahispano.org/ricardo/date/20050113 Thursday January 13, 2005

Backup de MySQL con Ant

Con este post quiero contribuir con algo de mi experiencia a los ejemplos sobre Ant que aparecen en el weblog El Camino del Chela de Keko. Al igual que muchos, con el tiempo me he ido acostumbrando cada vez más a Ant como herramienta de trabajo.

Hace poco necesitaba que al empaquetar la aplicación que estaba desarrollando se incluyera una copia de la base de datos MySQL en forma de scripts. Esto normalmente se realizaría desde la línea de comandos con una instrucción como la siguiente:

mysqldump -u elUsuario -plaContraseña laBaseDatos > archivoSalida.sql

creandose un archivo con el nombre archivoSalida.sql en el mismo directorio donde se ejecuta la instrucción (se asume que el utilitario mysqldump esta en el path). Este archivo contiene los scripts necesarios para reconstruir la base de datos laBaseDatos. Los argumentos que estamos pasando son -u (usuario) y -p (contraseña) que no son necesarios en todos los casos.

La pregunta "de ley" es si esta labor repetitiva la puede realizar un script de Ant. De modo que luego de investigar un poco incluí las siguientes líneas en mi archivo build.xlm:

Creamos la propiedad backup con la ruta completa al directorio de backup para no tener que escribirla directamente

<property name="backup" value="el/directorio/de/backup" />

Este es el target que realiza la tarea de crear un backup de MySQL equivalente a la instrucción de línea de comandos mostrada más arriba. En caso de no tener el utilitario mysqldump en el path se puede agregar el parámetro dir con la ruta completa al directorio donde se encuentra el mismo

<target name="copiabd" depends="limpiar">
	   <!-- creamos una copia de la base de datos -->
	   <exec executable="mysqldump"
			      output="${backup}/archivoSalida.sql">
		   <arg line="-u elUsuario -plaContraseña laBaseDatos"/>
	   </exec>
</target>

He utilizado la tarea exec con la cual se puede ejecutar cualquier instrucción al igual que lo haríamos desde la línea de comandos. En el parámetro executable recibe el comando a ejecutar sin los argumentos. El parámetro output recibe el archivo de salida, es decir en que archivo quiero que coloque los scripts para reconstruir la base de datos (se puede incluir la ruta completa si quiero que lo coloque en otra ubicación que el directorio actual). Finalmente los argumentos son pasados como elementos y gracias a la etiqueta arg.

Con esto queda solucionado el problema y a partir de ahora cada vez que quiero crear un paquete distribuible de la nueva versión me basta con seleccionar el archivo build.xlm desde Eclipse (sí, uso Eclipse) y en pocos segundos tengo todo listo (base de datos incluida).

Observar esta posibilidad me llevó a preguntarme si es que sería posible colocar unos scripts de Ant para que realicen tareas de backup en un servidor. Por ejemplo se me ocurre que tenga una secuencia aproximadamente así:

  1. Genere el backup.
  2. Haga una compresión del mismo; dependiendo el día de la semana (Lunes, Martes, Miércoles, etc.) le coloque el nombre. Es decir, existirían 7 copias de respaldo de la base de datos uno por cada día de la semana.
  3. Copie el archivo comprimido en dos ubicaciones diferentes de la red a donde el servidor tenga permisos de acceso. Sobreescribiría los archivos con el mismo nombre.
  4. Si algo sale mal en cualquier parte del proceso que envié un correo electrónico a las personas responsables de velar por el buen funcionamiento del sistema.

Una tarea que se dispare automaticamente en el servidor cada cierto tiempo (por ejemplo todos los días a las 11 de la noche) ejecutaría el script de Ant.

Es cierto que el Manual dice que Ant a sido creado sobre todo para ayudar a las labores de desarrollo, especialmente para quienes utilizan Java, y su utilidad en este aspecto esta fuera de discusiones. Pero ¿no podría extenderse un poco más ahorrando de esta forma mucho trabajo?.

Alguno me dirá porque no escribir mejor un archivo .sh o .bat ya sea para *nix o Windows. Puede que tengan razón, sobre todo en *nix donde me parece que la tarea sería relativamente trivial. Donde no lo veo claro es en Windows, donde no tengo la menor idea de como haría ciertas cosas (y si se puede disponer de los utilitarios necesarios sin complicarse la vida). En todo caso pensaba que con Ant se podría tener la misma ventaja de usar Java, lo escribes una vez y te sirve para ejecutarlo en cualquier parte (bueno, tampoco tampoco, pero al menos).

Investigaré un poco el tema. Pero si algún visitante me puede dar algunos tips que me ahorren tiempo se lo voy a agradecer bastante.