Backup e Restore utilizando comando mysqldump via programação Java web

Pessoal tenho um banco de dados rodando local e preciso criar uma funcao que faça o backup deste banco e envie para o servidor web,
seria um backup e restore, vefiquei que o mysql possui o comando mysqldump para backup e restore
como no exemplo: http://www.thegeekstuff.com/2008/09/backup-and-restore-mysql-database-using-mysqldump/

No entanto este comando roda via terminal,
quero saber como posso rodar o mesmo comando utilizando o jdbc e código java
pois irei criar um botão no sistema que ao clicar, chama a função de bakup e logo restaura no
servidor que eu passar como parâmetro.

como posso fazer?

Se não me engano este comando nao roda pelo sql entao não seria com JDBC. Este mysqldump é um executavel a parte que vai junto com o pacote mysql. Creio que vc tera que utilizar atraves do

Runtime.getRuntime().exec("caminho do mysqldump e parametros");

Solano, não duplique tópicos.
Excluí o outro tópico que você criou em outro fórum.

Segue um exemplo completo de como fazer.

O restore você faz de forma parecida, bastando adaptar o que fiz.

[]'s

muito obrigado,
vou tentar implementar o restore como um método desta classe,
na dúvida entro em contato.

grato

David
está gerando arquivo sql com 0 kb
não está gravando os dados, gera um arquivo vazio,
adicionei como falado no post mencionado, o caminho bin do mysql
o que pode ser?

Consegui resolver o problema do arquivo vazio,
Uma das possíveis causas é quanto o nome de usúario digitado do
banco de dados e a senha.
Muitas pessoas não utilizam senha no banco de dados local,
neste caso ao tentar executar a classe que o David disponibiliza,
o arquivo gerado será vazio, pois está sendo passado o parâmetro
de senha(-p), mesmo que password, e não possui valor.
Resolvi colocando um if antes do anexo deste parâmetro no comando,
ficando desta maneira

        if(senha != ""){
          // o valor do parâmetro -p não tem espaço!
          sbComando.append( " -p" );
          sbComando.append( senha );
        }

Cuidado!
Em Java para comparar Strings usa-se o método equals, nunca o operador ==. Isso é algo que realmente vc precisa saber.

if ( !senha.equals( "" ) ) { ... }

[]'s

Exatamento muito obrigado.
Estou tentanto fazer o restore porém não está dando certo.
Tentei rodar o código abaixo uma vez daí disse que eu não tinha a base de dados
passada como paramêtro, logo criei no mysql uma base com o nome passado e rodei
novamente e não deu certo. O que pode estar dando de errado?

 /**
     * Restaura os dados de um script sql para base de dados.
     *
     * @param arquivo Caminho do arquivo que será restaurado
     * @param host Servidor onde se encontra a base de dados.
     * @param usuario Usuário usado para conectar na base.
     * @param senha Senha do usuário.
     * @param base Nome da base a ser restaurada.
     * @throws IOException
     */
    public static void restore(
            String arquivo,
            String host,
            String porta,
            String usuario,
            String senha,
            String base) throws IOException {

        // prepara o comando
        StringBuilder sbComando = new StringBuilder( "mysql" );
        
        if(!porta.equals("")){
        sbComando.append( " -P " );
        sbComando.append( porta );
        }
        
        sbComando.append( " -u " );
        sbComando.append( usuario );
        
        /*Se o valor da senha for diferente de vazio, 
        adiciona o parametro de senha, caso contrário não adiciona, 
        pois pode gerar um arquivo vazio
        */
        if(!senha.equals("")){
        // o valor do parâmetro -p não tem espaço!
        sbComando.append( " -p" );
        sbComando.append( senha );
        }
        
        sbComando.append( " -h " );
        sbComando.append( host );
        
        sbComando.append( " " );
        sbComando.append( base );
        
        sbComando.append( " " );
        sbComando.append( arquivo );
            
        		
        // Tempo
        long t1, t2, tempo;
     
        System.out.println("Processo de Restauração Iniciado...");
        System.out.println("Comando: " + sbComando.toString());
        
        // Início
        t1 = System.currentTimeMillis();
        
        // executa o comando
        Process processo = Runtime.getRuntime().exec(sbComando.toString());

        // cria os stream gobblers, um para o stream de entrada e um para o
        StreamGobbler sgError = new StreamGobbler(
                processo.getErrorStream(), "error" );

        // cria uma thread para cada stream gobbler e as inicia
        new Thread( sgError ).start();
        
        // Fim
        t2 = System.currentTimeMillis();
     
        // Tempo total da operação
        tempo = t2 - t1;
        System.out.println("Processo de Restauração Executado em: "+ tempo + "ms");
        System.out.println("Processo de Restauração Finalizado!");
    }


    public static void main( String[] args ) throws Exception {

    	restore("C:\\bakup\\new.sql", "localhost", "", "root", "", "db_restaurar");
    	
    }

consegui resolver alterando o incio da string de comando,
pesquisando em outros tópicos aqui no forum, ficando desta maneira

 StringBuilder sbComando = new StringBuilder( "cmd /c mysql" );

obrigado David

David segue a classe completa de como ficou com backup e restore sendo executado logo em sequência
realizei um teste enviando os dados para um servidor de banco de dados online e funcionou 100%

Espero que possa ajudar mais pessoas

package applicationHelper;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * Classe com métodos para executar o dump do MySQL.
 * O "bin" do MySQL deve estar no PATH do SO.
 *
 * @author David Buzatto
 * Adaptado por Virgilio Solano
 */
public class MySQLDump {

    /**
     * Exporta para um arquivo os dados de uma base de dados específica.
     *
     * @param arquivo Caminho do arquivo que deve ser gerado com a
     * saída da exportação.
     * @param usuario Usuário usado para conectar na base.
     * @param senha Senha do usuário.
     * @param base Nome da base a ser exportada.
     * @param tabelas Tabelas da base especifica a serem exportadas. Caso não
     * seja expecificada nenhuma, todas as tabelas serão exportadas.
     * @throws IOException
     */
    public static void dump(
            String arquivo,
            String usuario,
            String senha,
            String base,
            String... tabelas ) throws IOException {

        // prepara o comando
        StringBuilder sbComando = new StringBuilder( "mysqldump" );

        sbComando.append( " -u " );
        sbComando.append( usuario );
        
        /*Se o valor da senha for diferente de vazio, 
        adiciona o parametro de senha, caso contrário não adiciona, 
        pois pode gerar um arquivo vazio
        */
        if(senha != ""){
        // o valor do parâmetro -p não tem espaço!
        sbComando.append( " -p" );
        sbComando.append( senha );
        }

        sbComando.append( " " );
        sbComando.append( base );

        for ( String tabela : tabelas ) {
            sbComando.append( " " );
            sbComando.append( tabela );
        }
        
        // Tempo
        long t1, t2, tempo;
     
        System.out.println("Processo de Backup Iniciado...");
        
        // tempo inicio
        t1 = System.currentTimeMillis();
        
        // executa o comando
        Process processo = Runtime.getRuntime().exec(sbComando.toString());

        // cria os stream gobblers, um para o stream de entrada e um para o
        // stream de erro. os gobblers vão consumir os streams do processo
        StreamGobbler sgInput = new StreamGobbler(
                processo.getInputStream(), "input", new File( arquivo ) );
        StreamGobbler sgError = new StreamGobbler(
                processo.getErrorStream(), "error" );

        // cria uma thread para cada stream gobbler e as inicia
        new Thread( sgInput ).start();
        new Thread( sgError ).start();
        
        // tempo fim
        t2 = System.currentTimeMillis();
     
        // Tempo total da operação
        tempo = t2 - t1;
        System.out.println("Processo de Backup Executado em: "+ tempo + "ms");
        System.out.println("Processo de Backup Finalizado!");
    }

    /**
     * Exporta para um arquivo os dados de todas as bases de dados.
     *
     * @param arquivo Caminho do arquivo que deve ser gerado com a
     * saída da exportação.
     * @param usuario Usuário usado para conectar na base.
     * @param senha Senha do usuário.
     * @throws IOException
     */
    public static void dumpAll(
            String arquivo,
            String usuario,
            String senha ) throws IOException {

        dump( arquivo, usuario, senha, "--all-databases" );

    }
    
    /**
     * Restaura os dados de um script sql para base de dados.
     *
     * @param arquivo Caminho do arquivo que será restaurado
     * @param host Servidor onde se encontra a base de dados.
     * @param porta Porta utilizada para conectar com o host.
     * @param usuario Usuário usado para conectar na base.
     * @param senha Senha do usuário.
     * @param base Nome da base a ser restaurada.
     * @throws IOException
     */
    public static void restore(
            String arquivo,
            String host,
            String porta,
            String usuario,
            String senha,
            String base) throws IOException {

        // prepara o comando
        StringBuilder sbComando = new StringBuilder( "cmd /c mysql" );
        
        sbComando.append( " -h" );
        sbComando.append( host );
        
        if(!porta.equals("")){
        sbComando.append( " -P " );
        sbComando.append( porta );
        }
        
        sbComando.append( " -u" );
        sbComando.append( usuario );
        
        /*Se o valor da senha for diferente de vazio, 
        adiciona o parametro de senha, caso contrário não adiciona, 
        pois pode gerar um arquivo vazio
        */
        if(!senha.equals("")){
        // o valor do parâmetro -p não tem espaço!
        sbComando.append( " -p" );
        sbComando.append( senha );
        }
        
        sbComando.append( " " );
        sbComando.append( base );
        
        sbComando.append( " < " );
        sbComando.append( arquivo );
                		
        // Tempo
        long t1, t2, tempo;
     
        System.out.println("Processo de Restauração Iniciado...");
        //imprime o comando
        //System.out.println("Comando: " + sbComando.toString());
        
        //tempo inicio
        t1 = System.currentTimeMillis();
        
        // executa o comando
        Process processo = Runtime.getRuntime().exec(sbComando.toString());

        // cria os stream gobblers, um para o stream de entrada e um para o
        StreamGobbler sgError = new StreamGobbler(
                processo.getErrorStream(), "error" );

        // cria uma thread para cada stream gobbler e as inicia
        new Thread( sgError ).start();
        
        // tempo fim
        t2 = System.currentTimeMillis();
     
        // Tempo total da operação
        tempo = t2 - t1;
        System.out.println("Processo de Restauração Executado em: "+ tempo + "ms");
        System.out.println("Processo de Restauração Finalizado!");
    }
    
    public static void main( String[] args ) throws Exception {

        // exporta as tabelas "tabelaX" e "tabelaY" da base "minha_base" para o
        // arquivo "C:/tabelaXeYMinhaBase.sql"
        //dump( "C:/tabelaXeYMinhaBase.sql", "root", "root", "minha_base", "tabelaX", "tabelaY" );

        // exporta a base "minha_base" para o arquivo "C:/minhaBase.sql"
        dump("C:/bakup/teste.sql", "root", "", "db_teste");

    	restore("C:/bakup/teste.sql", "localhost", "3306", "root", "", "db_restore");
    	
        // exporta todas as bases de dados para o arquivo "C:/todasAsBases.sql"
        //dumpAll( "C:/todasAsBases.sql", "root", "root" );

    }

}

/**
 * Thread para consumir os streams de processos.
 * Baseada na implementação apresentada em:
 * http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
 *
 * @author David Buzatto
 */
class StreamGobbler implements Runnable {

    private InputStream is;
    private String type;
    private FileWriter fw;

    public StreamGobbler( InputStream is, String type ) {
        this.is = is;
        this.type = type;
    }

    public StreamGobbler( InputStream is, String type, File file )
            throws IOException {
        this.is = is;
        this.type = type;
        this.fw = new FileWriter( file );
    }

    @Override
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader( is );
            BufferedReader br = new BufferedReader( isr );
            String line = null;
            while ( ( line = br.readLine() ) != null ) {
                if ( fw != null ) {
                    fw.write( line + "\n" );
                } else {
                    System.out.println( type + ">" + line );
                }
            }
            if ( fw != null ) {
                fw.close();
            }
            
        } catch ( IOException ioe ) {
            ioe.printStackTrace();
        }
    }

}

Oi Solano, legal sua iniciativa.

Sugiro que você consuma também o input stream do processo para garantir que não haja nenhum problema na execução.
Caso você não consuma os streams inteiramente o processo pode “congelar”.
Leia o artigo de onde tirei o StreamGobbler para entender os motivos.

[]'s

Backup e Restauração de banco de dados MySQL via SSH: http://naninho.blog.br/web/mysql/backup-restauracao-banco-de-dados-mysql-ssh.html

Quando executo o codigo, aparece o seguinte erro: o sistema nao pode oncontrar o arquivo localizado!

Aguma dica?