Restaurar backup gerado pelo mysqldump em java[AINDA NÃO RESOLVIDO]

Olá pessoal! Bom… acho que o assunto diz tudo né ?!? HHeuaHeHUAEhu…
Via java consegui realizar o backup, agora com o .sql contendo os ‘creates’ and ‘inserts’ como faço para restaurar? Há muito tempo venho procurando solução para isso mas não encontro. Até ler sql por sql e executar via java eu ja tentei mas pode dá os ‘java heap space’ da vida…

É sério, já procurei exaustivamente uma solução mas nenhumas das encontradas funcionaram.

Vlw pessoal :thumbup: :thumbup:

olá,
o dump do MySQL é de certa forma dependente do mesmo. Devem ser feitos alguns ajustes para transformar em SQL padrão. Isto vc pode ler linha a linha mesmo, pegando somente os creates, inserts e alters, e submetendo via JDBC. :slight_smile:
att.

Boa madrugada Galera !

É somente para fins didáticos ou você pensa em fazer algo pra usar em produção mesmo ?

Minha dúvida é porque tudo vai depender do tamanho do banco que você quer tratar.
Outro problema que vejo em executar comando SQL um a um é sobre problemas que terá que tratar, caso ocorra exceptions no meio do caminho.
E sobre a criação de indices e chaves das tabelas ?

Bom… na minha opinião, se for para utilizar em produção deveria pensar em ferramentas próprias de restore do MySQL.

[]s

Pois é… são sim, podendo haver gigas de dados… o negocio de ler sql por sql foi mais um “chute no balde”, só para mim ficar feliz vendo a coisa funcionar mas sei que assim não pode ficar… dá pau de memoria, pois eu leio o arquivo (que não passa de um arquivo de texto) e vou adicionando o conteudo em um StringBuffer e depois dou um String[] sql = stringBufferComOConteudoDoArquivo.split(";") e entao consigo colocar cada sql em um vetor, em seguido dou um loop e executo todas. O problema é que com arquivos grandes acaba dando pau na hora de preencher o StringBuffer, em certos casos é muita coisa… É como a função “open script” do Query Browser, se você abrir um script grande vai dar pau pois ele faz dessa maneira. Não tem um meio de fazer um dump ao contrário? Aquele negócio de fazer “mysqldump -h host -u root -p 123 -d database > /home” não faz diferença o “>” ou “<” ou sem nada, o dump sempre vai fazer o backup. Eu lembro que quando usava o dump eu fazia isso, mas pelo menos via Runtime no java não funciona. Esse lance dos “<”,">" eu vi num post estadunidense… e confirmei…

HAUEhauEAeUA… pior que é em larga escala de produção…

Bom dia Galera !

Desculpe minha intromissão… mas se você esta falando em Gigas de dados, não seria melhor pensar em uma solução fora de Java ?

Pelo que entendo um processo de restore de um banco de dados não é algo corriqueiro e que será executado por qualquer usuário, na verdade, recuperar um banco não implica simplesmente em recuperar os dados, normalmente existe toda uma configuração que deve ser refeita, ajustada…

Na pós que terminei em uma das matérias o professor pediu um trabalho assim, criar uma aplicação que possibilitasse fazer backup e restore de dados, mas nesse caso o foco em utilização de XML, a aplicação permitia configurar a conexão com um banco qualquer em um arquivo XML e depois mostrava toda a estrutura de tabelas, permitindo que o usuário selecionasse quais queria fazer backup.
Depois era possivél restaurar em um banco vazio…
Mas claro que este não é o seu caso.

Desculpe não poder ajudar.

[]s

Bom… :oops: talvez eu tenha exagerado um pouquinho :lol: :lol: :lol: Vamos falar em no maximo 500 mb. Na verdade é para clientes “desinformatizados” e em situações +/- corriqueiras…

Bom dia Galera !

Porque você não faz um contrato de manutenção e recebe pra fazer esse backup / restore ? Hehehe…

Bom não sei se ajuda, mas achei essa resposta num forum de MySql:

http://forums.mysql.com/read.php?72,232771,233019#msg-233019

Não sei se daria para rodar esse comando através do Runtime do Java… só testando.

[]s

Desta forma eu tentei rodar em casa mas o mysql so retorna o help dele, aqui no serviço (Windows) o runtime deu erro pois acusa nao ter encontrado o aplicativo “mysql” mesmo informando o endereco completo do aplicativo. Já no prompt funcionou mas tive que informar o endereco completo do mysql (C:\Arquivos de programas\MySQL\MySQL Server 5.0\bin>mysql -uroot -hlocalhost teste < C:\oi.sql)

Boa tarde galera !

Se no prompt do windows funciona, você não tenta executar no Runtime do java um bat que vai executar esse comando ?

[]s

:hunf: Bom… acho que pode ser, mas vou ter que ter um bat e um sh alem de ter que obter (de alguma maneira) o endereco do mysql. Acho que no windows se eu colocar nas variaveis de ambiente o endereco do mysql, vai de boa. Vou testar melhor em linux assim que chegar em casa mas também vou ter que descobrir o endereco do mysql, no linux acho que é mais faci, pois no windows o cara pode instalar em qualquer diretorio. Tô saindo agora…

Boa noite Galera !

Mas mesmo que fosse no Runtime, você não teria que ter o caminho do MySql ?
Ou então ter o MySql na variavel de ambiente de Path…

Eu acho… ou não, rs.

[]s

Boa noite pessoal!

No Runtime eu passo por exemplo: “mysqldump -h host -u user -p password myBd > /home/gustavo”, mysqldump é um aplicativo, ou posso passar dessa forma ou colocar o caminho inteiro do mysqldump. O comando mysql também é um aplicativo, eu o chamo e passo parametros, quando testei la no trabalho tive que colocar o caminho completo do mysql (C:\Arquivos de programas\MySQL\MySQL Server 5.0\bin\mysql.exe no caso do Windows).
Aqui em casa (Linux) o mysqldump e reconhecido, aparentemente o mysql também mas não faz nao funciona, tentei essas instruçoes: http://dev.mysql.com/doc/refman/5.1/en/batch-mode.html
Aqui em casa nao consigo setar um arquivo .sql para o mysql nem pelo console (shel, prompt, etc)

Brother se ainda for de seu interesse, eu consegui fazer os comando de backup e restore via DOS com o mysql dum e joguei tudo em um arquivo.bat, mas eu aimnda não consegui executar este tipo de arquivo pelo java, caso interesse, poste aqui qe eu respondo.

Gente, estou com o mesmo problema e gostaria que vocês analizassem até onde eu cheguei e vejam se vcs tem algum palpite.
Tenho o código:

private void retornoCopiaSeguranca(String path) {
        try {
            String comando = "cmd.exe /c \"C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\mysql.exe\" -hlocalhost --user=root --password=password < "+path;
            System.out.println(comando);
            Runtime.getRuntime().exec(comando);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "Retorno não realizado:\n\n" + ex, "Backup" ,JOptionPane.ERROR_MESSAGE);
        }
    }

Onde a String path eu passo o local do arquivo. Até aí sem problemas.

O curioso:

Se a String path for um local que não contenha espaços, mostro: C:\BACKUP.SQL o backup é restaurado que é uma beleza!
Entretanto, se o path for um local: “C:\Local do Arquivo\BACKUP.SQL” o backup simplesmente NÃO é restaurado! Mesmo que eu verifique e inclua “”(aspas) no começo e no final da String path.
E o mais doido ainda é que se você executar pelo cmd, o desgraçado executa tudo lindo! Por exemplo pegando a String toda fica:

cmd.exe /c "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql.exe" --user=root --password=password < "C:\Local do Arquivo\backup.sql" //Pelo CMD ele executa, chamando o cmd pelo java Não.

O problema todo se dá quando eu coloco aspas no local do arquivo(pelo java, pelo CMD vai legal)

Alguém aí agora se habilita?? rsrs

Tente utilize um array de opções e valores, conforme o link abaixo.

http://www.velocityreviews.com/forums/t680643-runtime-getruntime-exec-append-the-parameters.html

Cara, já tentei algumas opçoes, mas nada!
Posso estar fazendo errado… Mas não sei onde to errando, já tentei váárias maneiras…

Nenhum expert aí em ProcessBuilder e/ou Runtime? rsrs…

Hey Guys!!

Consegui resolver meu problema. (Na gambiarra é verdade, mas no meu caso não houve problemas)

O que eu fiz foi pegar o local do arquivo e copiá-lo para um diretório direto na raiz de alguma unidade e depois realizar o backup.
Como no meu caso, era o usuário que informava o local do arquivo, agora ele é copiado direto pro C da máquina e depois eu importo pelo sistema.

Vejam o código:

/* Aqui eu crio um diretório para onde eu vou mandar o arquivo de backup, verifico antes se ele já existe*/
File dir = new File("C:/Backup");
        if(!dir.isDirectory()){
            if (dir.mkdir()) {
                System.out.println("Diretorio criado com sucesso!");
            } else {
                System.out.println("Erro ao criar diretorio!");
            }
        }else{
            System.out.println("Diretório já criado anteriormente!");
        }

        try{
            /* Aqui eu instancio dois objetos, um do tipo FileInputStream(que recebe o local do arquivo de origem) e um do tipo FileOutpuStream(que irá apontar pro local de destino*/
            FileInputStream origem = new FileInputStream("Local do arquivo");
            FileOutputStream destino = new FileOutputStream("C:\\Backup\\arquivoDeDestino.SQL");
            FileChannel fileOrigem; //Aqui eu não sei exatamente o que o objeto do tipo FileChannel faz, mas ao que parece ele pega o conteudo do arquivo para jogar no diretório de destino.(EU ACHO, não lembro onde achei esse exemplo)
            FileChannel fileDestino;//O mesmo de cima só que pro arquivo de destino.

            fileOrigem = origem.getChannel();
            fileDestino = destino.getChannel();
            //Faz a copia em si. Não sei o porque dos parametros abaixo.
            fileOrigem.transferTo(0, fileOrigem.size(), fileDestino);

            fileOrigem.close();//Já falei que não sei ao certo, po! rsrsrs
            fileDestino.close();

            System.out.println("Arquivo copiado com sucesso!");
        }catch(FileNotFoundException ex){
            ex.printStackTrace();
        }catch(IOException ex){
            ex.printStackTrace();
        }

Bom, tá aí gente, espero que sirva pra vocês, em java da-se um jeito pra tudo! (mesmo que na gambi) rsrskkk

Abraços!!

Não se é exatamente isso que vc quer, mas esse codigo que eu fiz, faz bakup em mysql, mas tem que colocar o executavel mysqldump detro da pasta que vc vai criar com o nome C:\Backup_Residencia, e só seus backup estará realizado com sucesso, não conseguir restaurar, se vc consiguir post no forum.
package Banco_Dados;

import java.io.File;
import java.io.IOException;
import javax.swing.JOptionPane;

public class Backup {

File diretorio = new File("C:/Backup_Residencia");

public void make_backup(){
    
int numerodobackup = 0;    
File bck = new File("C:/Backup_Residencia/backup0.sql");
// os zeros é para diferenciar um backup do outro   
           
        // Cria diretório   
        if(!diretorio.isDirectory()) {   
           new File("C:/Backup_Residencia").mkdir();
        } else {   
           
        }   
           
        // Cria Arquivo de Backup   
          try {   
            if(!bck.isFile()) {   
                Runtime.getRuntime().exec("cmd /c c:/Backup_Residencia/mysqldump -u root -proot  Residencia > C:/Backup_Residencia/backup0.sql");
                JOptionPane.showMessageDialog(null, "Backup realizado com sucesso!");
            } else {   
               
                while(bck.isFile()) {   
                    numerodobackup++;   
                    bck = new File("C:/Backup_Residencia/backup0"+numerodobackup+".sql");
                }   

                Runtime.getRuntime().exec("cmd /c c:/Backup_Residencia/mysqldump -u root -proot Residencia >"+bck);
                JOptionPane.showMessageDialog(null, "Backup realizado com sucesso!");
            }   
            } catch (IOException ex) {   
            ex.printStackTrace();   
            }   

}

gqferreira,
Estou fazendo um software para um escritório de advocacia e uso o metodo abaixo para recuperar os backups (sendo que o software cria arquivos com nome "backup_2010-09-29.sql" na pasta "c:\backup").

public static void restaurar_backup(String pasta) {
        SimpleDateFormat out = new SimpleDateFormat(&quot;yyyy-MM-dd&quot;);
        Calendar cal = Calendar.getInstance();
        String data = out.format(cal.getTime());
        File file = new File(pasta + &quot;\\backup_&quot; + data + &quot;.sql&quot;);
        try {
            Runtime.getRuntime().exec(&quot;cmd /c mysql --host=localhost --user=usuario --password=senha --database=basededados &lt; &quot; + file);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, &quot;Erro ao restaurar backup.\nMotivo: &quot; + ex);
        }
    }