MySql es una base tan poderosa como sencilla. La funcionalidad de backup mas simple es usando mysqldump . Veamos algo de Codigo.

ACTUALIZADO! Gracias a Mario Gonzalez que ha planteado algunas dudas estamos actualizando este articulo

Este codigo sencillamente va a hacer un dump de la base de datos entera a un file (back.sql). Seria bueno despues de esto utilizar las clases Zip de Java para comprimir el contenido, dado que este file puede ser enorme.

Primero vamos a escribir un metodo bien util para transferir desde un input a un output stream.

public void transfer(InputStream input, OutputStream output) throws Exception {
  byte[] buf = new byte[1024];
  int len;
  while ((len = input.read(buf)) > 0) {
    output.write(buf, 0, len);
  }
  input.close();
  output.close();
}

Ahora el backup.

String command = "mysqldump -hlocalhost  -umyuser -pmypass  -rc:\\back.sql mydb";

java.lang.Process child = Runtime.getRuntime().exec(command);
InputStream input = child.getInputStream();

FileOutputStream output = new FileOutputStream("c:/back.sql");
transfer(input, output);

Ahora vamos a hacer el restore de la informacion que obtuvimos tambien mediante Java.

String command = "mysql mydb --user=myuser --password=mypass < \"c:\\back.sql\"";
Process child = Runtime.getRuntime().exec(command);
InputStream input = child.getInputStream();
transfer(input, System.out); // escribimos el resultado en el System.out
Categories: java

Rodrigo Asensio

Apasionado por la tecnología

9 Comments

Jose Carlos · August 7, 2011 at 11:01 am

Buenas tardes!

Acabo de descubrir tu web y he de decirte que me parece estupenda, por lo que quiero felicitarte.

En segundo lugar, quisiera plantear una duda. Supongamos que mi aplicación se conecta a un servidor remoto en el que está la base de datos.

¿Hay forma de hacer un backup de la base de datos sin tener acceso al servidor?

De antemano, gracias.

Rodrigo Asensio · August 7, 2011 at 12:33 pm

Deberias poder ejecutar un comando shell en el servidor remoto, y el comando seria exactamente el mismo que tenes en este post para poder hacer el backup de mysql.

El código que esta aca no utiliza jdbc para hacer el backup de mysql. Es simplemente una ejecución de linea de comando en java.

Guillermo González Márquez · August 10, 2011 at 1:24 pm

Hola, buenos dias.

Me parece un sitio excelente y este inconveniente con los Backups Automáticos en un aplicativo Java se me ha hecho complicado porque no me ha funcionado. Probaré este código.

Tengo una duda: Usas un Objeto llamado child, pero no veo de cual clase es instanciado. Agradezco nos comuniques esta parte.

Muchas gracias por compartir tus conocimientos.

Rodrigo Asensio · August 10, 2011 at 1:43 pm

Guillermo, esta descripto en la linea 02 de la tercera seccion de codigo, es un Process (java.lang.Process)

Saludos.

Andrea Gomez · December 13, 2011 at 11:45 pm

Oyee de casualidad podrias mostrar todo el codigo completo?.

Rodrigo Asensio · December 13, 2011 at 11:48 pm

En realidad no hay mucho mas que mostrar que hacer correr este codigo desde un main como..


public class Backup {

public static void main(String[] args) {
String command = "mysqldump -hlocalhost -umyuser -pmypass -rc:\\back.sql mydb";

java.lang.Process p = Runtime.getRuntime().exec(command);
InputStream input = child.getInputStream();

FileOutputStream output = new FileOutputStream("c:/back.sql");
transfer(input, output);
}

String command = "mysqldump -hlocalhost -umyuser -pmypass -rc:\\back.sql mydb";

java.lang.Process p = Runtime.getRuntime().exec(command);
InputStream input = child.getInputStream();

FileOutputStream output = new FileOutputStream("c:/back.sql");
transfer(input, output);
}

Andrea Gomez · December 14, 2011 at 12:48 am

me funciono correctamente.
Muy buena pagina y gracias por compartir lo que sabes.

Hola gracias · February 3, 2012 at 8:09 am

El segundo bloque está mal.

Declaras un proceso “p” y luego utilizas “child”, que no está declarado. Deberían de ser la misma. Así:

java.lang.Process p = Runtime.getRuntime().exec(command);
InputStream input = p.getInputStream();

Gracias por compartir una información tan valiosa, aunque la explicación bajo mi punto de vista es bastante mejorable.

Un saludo!

Rodrigo Asensio · February 3, 2012 at 10:52 am

Corregido lo del child vs p. Contame como mejorarias la explicacion. Sugerencias son simepre bienvenidas. Gracias

Leave a Reply

Your email address will not be published. Required fields are marked *