15/1/11

Crear copia de Seguridad [BackUp] de MySQL en Java

¿Qué es un backup?

Una copia de seguridad o backup (su nombre en Inglés) en tecnología de la información o informática es una copia de seguridad - o el proceso de copia de seguridad - con el fin de que estas copias adicionales puedan utilizarse para restaurar el original después de una eventual pérdida de datos. [Wikipedia]

El siguiente codigo, BackUpSample.java, realiza una instruccion en mysqldump para crear el backup en memoria, despues este es guardado en un archivo SQL especificando su direccion y extension.

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.FileWriter;
import java.io.PrintWriter;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class BackUpSample {
    private int BUFFER = 10485760;  
    //para guardar en memmoria
    private StringBuffer temp = null;
    //para guardar el archivo SQL
    private FileWriter  fichero = null;
    private PrintWriter pw = null;
    
 public boolean CrearBackup(String host, String port, String user, String password, String db, String file_backup){
    boolean ok=false;
    try{       
        //sentencia para crear el BackUp
         Process run = Runtime.getRuntime().exec(
        "mysqldump --host=" + host + " --port=" + port +
        " --user=" + user + " --password=" + password +
        " --compact --complete-insert --extended-insert --skip-quote-names" +
        " --skip-comments --skip-triggers " + db);
        //se guarda en memoria el backup
        InputStream in = run.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        temp = new StringBuffer();
        int count;
        char[] cbuf = new char[BUFFER];
        while ((count = br.read(cbuf, 0, BUFFER)) != -1)
            temp.append(cbuf, 0, count);
        br.close();
        in.close();        
        /* se crea y escribe el archivo SQL */
        fichero = new FileWriter(file_backup);
        pw = new PrintWriter(fichero);                                                    
        pw.println(temp.toString());  
        ok=true;
   }
    catch (Exception ex){
            ex.printStackTrace();
    } finally {
       try {           
         if (null != fichero)
              fichero.close();
       } catch (Exception e2) {
           e2.printStackTrace();
       }
    }   
    return ok; 
 }  
 
}

Y la forma de utilizarlo:


public class Main {

    public static void main(String[] args) {    
     new BackUpSample().CrearBackup("HOST", "PUERTO", "USUARIO", "PASSWORD", "BASE DE DATOS","DIRECCION DEL ARCHIVO");
    }
    
}

donde:

HOST : localhost
PUERTO: 3306
USUARIO: el usuario de mysql
PASSWORD: el paasword de mysql
BASE DE DATOS: el nombre de la base de datos del cual se quiere realizar el backup
DIRECCION DEL ARCHIVO: la direccion donde se guardara el backup. Ej. "e:/copia de seguridad/backup.sql"

y tenemos:


fin

27 comentarios:

  1. Saludos... y muy buen aporte, cuando ejecute el codigo del backup, me salia:
    java.IOException: cannot run program "mysqldump": CreateProcess error=2, el sistema no puede hallar el archivo especificado...

    lo probe en S.O. vista 64bits y en S.O. XP 32bits, no se a q se debe este problema, y como podria solucionarlo...
    Gracias de antemano...

    ResponderEliminar
  2. ¿creaste la base de datos? :)

    si es asi, entonces cheka la configuracion de mysqldump, por que no lo encuentra, prueba por linea de comandos si mysqldump esta bien configurado

    ResponderEliminar
  3. pues si cree la base de datos, todo practicamente... pero me sale ese error... habia probado anteriormente un backup en unos de mis programas, y siempre me salio ese mensajito, quizas sea por la ubicacion del mysqldump???, entonces tendria q especificarlo???, y como haria eso???, bueno muchas gracias

    ResponderEliminar
  4. Hola MikeNF yo tambien nmire este codigo y me salia el mismo error suyo pero no hay de que preocuparse solo cambie un poco el codigo de mysql dump por la ruta de donde esta por ejemplo yo uso wamp server y el mysqldump esta en
    C:\wamp\mysql\bin\mysqldump.exe....
    asi el codigo le funciona si no usa wamp ps con el buscador de su pc busque ese archivo mysqldump.exe y copie la ruta y la reemplaza en el codigo asi:

    yo lo hago con la ruta que tengo ud con la ruta que tenga...


    Process run = Runtime.getRuntime().exec(
    "C:\\wamp\\mysql\\bin\\mysqldump --host=" + host + " --port=" + port +
    " --user=" + user + " --password=" + password +
    " --compact --complete-insert --extended-insert --skip-quote-names" +
    " --skip-comments --skip-triggers " + db);


    listo espero le sirva nos vemos recuerde que si es \ tiene que ponerlo \\ o le sale error...

    ResponderEliminar
  5. hola, y si kisiera utilizar este codigo para crear un respaldo pero de mis documentos k es lo k tendria que modificar??? o solo funiciona para crear respaldos de mysql??

    ResponderEliminar
  6. gracias por la ayuda pero tengo una duda como restaurar la base de datos a partir del backup.sql en netbeans seria de gran ayuda

    ResponderEliminar
  7. El cod anda bárbaro.. pero a la hora de restaurar la base de datos estoy teniendo problemas, uso lo sig:
    Process run =Runtime.getRuntime().exec(
    "C:\\...bla bla bla...\\mysql.exe --password=" " --user="root" db < archivo.sql);

    si lo hago con el administrador de mysql en localhost, anda bien.. pero desde el sistema hecho con java, no me deja.

    Alguna recomendación??
    gracias!

    ResponderEliminar
  8. wow si muchas gracias por el codigo, pero igual que el comentario anterior, no puedo restaurar la base de datos, ni con una instruccion sql enviada desde java.... AYUDA POR FAVOR!! es para un proyecto y lo necesito....

    ResponderEliminar
  9. al restaurar el problema es que no se puede encontrar la ruta de mysql, si colocas la ruta absoluta no hay ningun problema

    ResponderEliminar
  10. YO QUISIERA SABER SI ALGUIEN TIENE N CODIGO PARECIDO PERO PARA ORACLE

    ResponderEliminar
  11. jc mouse lml

    funciona yeah!!

    T_______T *

    ResponderEliminar
  12. Y si solo quiero sacar el backup de algunas tablas y procedimientos espceificos?.

    ResponderEliminar
  13. Buenas Tardes Mouse... te felicito por tus aportes que nos ayudan bastante... quisiera saber si podrías poner un tutotial como este pero ahora para restaurar una base de datos. Gracias de antemano.

    ResponderEliminar
  14. Mi nombre es eduardo
    , estoy aciendo el crear backup pero me dice este error
    java.io.FileNotFoundException: C:\Users\ejnsilva\Documents (Acceso denegado)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.(FileOutputStream.java:194)
    at java.io.FileOutputStream.(FileOutputStream.java:84)
    at java.io.FileWriter.(FileWriter.java:46)
    at Formularios.BackUpSample.CrearBackup(BackUpSample.java:42)
    at Formularios.Main.main(Main.java:21)
    no lo entiendo

    ResponderEliminar
  15. excelente me funciono muy bien...gracias

    ResponderEliminar
  16. Muy bueno.... fue ctrl+c y ctrl+v y listo! jaja gracias por el aporte...

    ResponderEliminar
  17. Buenas, me gustaria saber como realizar un backup cuando el servidor MySQL esta ubicado en otra direccion?
    Tengo 2 PCs un cliente y un server, como puedo hacer entonces??

    ResponderEliminar
  18. necesito ayuda para poder restaurar la base de datos

    ResponderEliminar
  19. hola...ahora podrias ayudarnos a ejecutar ese backup que se hizo desde java...porfis

    ResponderEliminar
  20. HOLA .MUY INTERESANTE,,,PERO SABES TRATE DE MODIFICARLO Y APLICARLO PARA SQL Server ,PERO NADA......PODRIAS AYUDARME

    ResponderEliminar
  21. Gracias, me ha servido.

    ResponderEliminar
  22. Mouse muchas gracias por el aporte me ayudo bastante lo hice en una maquina de 32 bit y funciono muy bien al migrarla a una de 64 bits me dio problemas pero con la aclaracion de Kid_Goth ya lo resolvi mil gracias a los dos

    ResponderEliminar
  23. Hola hermano gracias por el aporte, mira estoy tratando de hacer un backup con la ayuda de tu codigo en una aplicacion hecha en java y netbeans con linux ubuntu y bd en phpmyadmin, pero no he podido crear el backup todavia, si pudieras ayudarme te lo agradeceria.

    ResponderEliminar
  24. se olvido comentar que el backup lo quiero generar desde un boton !

    ResponderEliminar
  25. Buenas amigo .. me podría decir si tiene algunos ejemplos iguales pero con. Base de datos firebird ..

    ResponderEliminar
  26. Como seria un backup en java con un form, y solo con un click generar el backup de mi base de datos SQLserver... please

    ResponderEliminar