Respaldar y Restaurar bases de datos MySQL desde Java
Esta es una forma sencilla de respaldar bases de datos MySQL desde Java generado los llamados dumpfiles o archivos de volcado de extensión .sql.
Para ello no tenemos soluciones puras en Java, pero podemos realizar esta operación por medio de herramientas que el mismo MySQL Server nos brinda que se llama mysqldump.
Ubicar las herramientas necesarias
Si tienes MySQL Server instalado, puedes buscar en el siguiente directorio
C:Program FilesMySQLMySQL Server 8.0bin
el ejecutable mysqldump.exe, mysql.exe y sus .dll, copia ambos archivos así como todas las .dll y crear una carpeta /bin/ en tu proyecto, en donde copiaras todos esos archivos.
Ya que tengas las herramientas copiadas en la carpeta de tu proyecto vamos a realizar la codificación.
Respaldar la base de datos
De acuerdo a la documentación de mysqldump debemos realizar las operaciones por comandos que ahí mismo especifica, utilizando ese documento como referencia a continuación te dejo la linea que nos permitirá realizar un volcado de nuestra base de datos:
mysqldump --host [su_host] -u [su_usuario] -p[su_contraseña] [nombre_base_datos] -r [ruta]
en donde:
- [su_host]: Representa el host donde esta alojada tu base de datos, si tienes el servidor corriendo en tu propia PC puedes utilizar localhost como tal o de lo contrario la dirección o IP de tu host remoto, para ello utilizamos la opción –host.
- [su_usuario]: Es el nombre del usuario de tu base de datos, por ejemplo muchos tenemos root para todo, en caso de que tengas otro aqui puedes ponderlo enseguida de la opcion -u.
- [su_contraseña]: Utilizando la opción -p, definimos la contraseña del usuario de nuestra base de datos, esta opcion se utiliza sin dejar espacios entre -p y su contraseña, por ejemplo, -p1234.
- [nombre_base_datos]: Si solo va a realizar el respaldo de una sola base de datos simplemente coloque el nombre la base de datos sin nada más, si va respaldar más de una debe utilizar la opción –databases.
- [ruta]: -r es la opción result file (archivo resultante), aqui espeficamos el nombre que tendrá el archivo de salida, podemos ponerle un nombre como tal (
dumpfile.sql ) o con el directorio completo donde queremos que se almacene (
C:dumpfile.sql ).
En mi caso tengo una base de datos llamada pruebas, y es la que pienso respaldar entonces mi comando queda de la siguiente manera:
mysqldump --host localhost -u root -p1234 pruebas -r backup.sql
Para ejecutar este comando desde código en Java vamos un método llamado respaldo() y su contenido va a ser el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | void respaldar() { try { /* - Datos de acceso a nuestra base de datos */ /* Usa localhost si el servidor corre en la misma maquina, de lo contrario utiliza la IP o dirección del sevidor*/ String dbServer = "localhost"; /* El usuario de tu base de datos*/ String dbName = "pruebas"; /* El usuario de tu base de datos*/ String dbUser = "root"; /* La contraseña de la base de datos (dejarla en texto plano puede ser un problema)*/ String dbPass = "2362"; /*El nombre o ruta a donde se guardara el archivo de volcado .sql*/ String sqlFile = "backups\respaldo.sql"; /* La linea de comando completa que ejecutara el programa*/ String command = "bin/mysqldump --host " + dbServer + " -u " + dbUser + " -p" + dbPass + " " + dbName + " -r " + sqlFile; /*Se crea un proceso que ejecuta el comando dado*/ Process bck = Runtime.getRuntime().exec(command); /* Obtiene el flujo de datos del proceso, esto se hace para obtener el texto del proceso*/ InputStream stdout = bck.getErrorStream(); /* Se obtiene el resultado de finalizacion del proceso*/ int resultado = bck.waitFor(); String line; /* Se crea un buffer de lectura con el flujo de datos outstd y ese mismo sera leido e impreso, esto mostrara el texto que muestre el programa mysqldump, de esta forma sabra cual es el error en su comando*/ BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stdout)); while ((line = brCleanUp.readLine()) != null) { System.out.println(line); } brCleanUp.close(); if (resultado == 0) { System.out.println("Respaldo exitoso"); } else { System.out.println("Error al respaldar"); } } catch (IOException | InterruptedException ex) { System.out.println("Exception: " + ex.getMessage()); } } |
Este método nos crea un volcado completo de nuestra base de datos en el directorio
backups
y nos va a imprimir un mensaje en consola con los eventos del programa, esto para verificar si hay errores.
Si abrimos el archivo generado veremos que se incluye toda la estructura de nuestra base de datos incluyendo tablas y los registros.
Restauración de la base de datos
Ahora para restaurar partiendo del archivo de volcado vamos a utilizar el ejecutable mysql.exe en lugar del dumpmysql.exe y de igual forma mediante un comando vamos a restaurar toda nuestra base de datos.
Para ello creamos un método llamado restaurar() con el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | void restaurar() { try { /* - Datos de acceso a nuestra base de datos */ /* Usa localhost si el servidor corre en la misma maquina, de lo contrario utiliza la IP o dirección del sevidor*/ String dbServer = "localhost"; /* El nombre de tu base de datos*/ String dbName = "pruebas"; /* El usuario de tu base de datos*/ String dbUser = "root"; /* La contraseña de la base de datos (dejarla en texto plano puede ser un problema)*/ String dbPass = "2362"; /*Nombre o ruta del archivo de volcado del cual se va a restaurar*/ String sqlFile = "backups\respaldo.sql"; /* Comando a ejecutar, note que se utiliza un array, ya que una sola linea causaria un bloqueo de búfer*/ String command[] = new String[]{"bin/mysql", dbName, "-u" + dbUser, "-p" + dbPass, "-e", " source " + sqlFile}; /*Se crea un proceso que ejecuta el comando dado*/ Process bck = Runtime.getRuntime().exec(command); /* Obtiene el flujo de datos del proceso, esto se hace para obtener el texto del proceso*/ InputStream stdout = bck.getErrorStream(); /* Se obtiene el resultado de finalizacion del proceso*/ int resultado = bck.waitFor(); String line; /* Se crea un buffer de lectura con el flujo de datos outstd y ese mismo sera leido e impreso, esto mostrara el texto que muestre el programa mysqldump, de esta forma sabra cual es el error en su comando*/ BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stdout)); while ((line = brCleanUp.readLine()) != null) { System.out.println(line); } brCleanUp.close(); if (resultado == 0) { System.out.println("Restauración exitosa"); } else { System.out.println("Error al restaurar"); } } catch (IOException | InterruptedException ex) { System.out.println("Exception: " + ex.getMessage()); } } |
Nuevamente este método imprimirá una salida con los eventos del comando.
Esta es una forma sencilla de respaldar bases de datos MySQL desde Java y también de restaurarlas, esto utilizando herramientas que el propio MySQL Server ya tiene integradas.
Descargas
Puedes bajarte el ejemplo completo hecho en NetBeans para que puedas estudiarte su funcionamiento e implementarlo en tus proyectos.
Descarga el código fuente del proyecto
Referencias, toda la documentación involucrada la puedes encontrar en las siguientes ligas:
- mysqldump — A Database Backup Program
- mysql — The MySQL Command-Line Client
- Tutoriales Java en scrapywar.com
¿Tienes problemas? Usa los comentarios o como todo buen programador puedes ir a Stack Overflow, publicar tu problema y esperar a recibir respuestas (casi siempre hay solución).