Backup em programa java - resolvido

10 respostas
kaede

Olá amigos do GUJ!
Estou quebrando a cabeça para saber o que estou fazendo de errado,
possuo um programa java e preciso que este execute backup do banco,
mas quando executo a classe está cria o arquivo mas não salva o banco.
Uso o vertrigo só se for isso!!!
Conto com a ajuda dos amigos, envio o codigo que estou usando abaixo.

String s = String.valueOf(jFileChooser1.getSelectedFile().getAbsolutePath());
        
        if(jFileChooser1.CANCEL_OPTION ==0){
            this.dispose();
        }else{
            
            try {
                Runtime.getRuntime().exec("cmd /c mysqldump -u root -p vertrigo -B  pjlocadora  > "+s+"\backup.sql");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            
            this.dispose();
        }
    }                                             
 
    // Variables declaration - do not modify                     
    private javax.swing.JFileChooser jFileChooser1;
    private javax.swing.JInternalFrame jInternalFrame1;
    // End of variables declaration                   
    
        }

10 Respostas

T

Tente com:

Runtime.getRuntime().exec("cmd /c \"mysqldump -u root -p vertrigo -B  pjlocadora  > " + s + "\backup.sql \"");
O

Ou assim.

import java.io.IOException;

public class TesteBackupMysql{

	public static void main(String args[]){
		try {  
		 Runtime.getRuntime().exec("cmd /c mysqldump.exe --host=localhost --user=root --password= --port=3306 -f -c  mysql > C:\backup.sql");  
		} catch (IOException ex) {  
			ex.printStackTrace();  
		}  
	}
	
}
Metaleiro

[color=darkblue] E como seria feito o Restore ?

Pelo que vi seria apenas a mudança do sinal > para <, seria isso realmente ?

desde já agradeço ![/color]

Backup and Restore MySQL Databases

kaede

Amigo Oliveira
Tentei de ambos jeitos e assim mesmo continua criando um arquivo vazio.

1- O banco esta com dados!
2- Não dá erro apena ia vazio!
3- Coloquei usuario e senha certa!
4- Vou tentar sem o vertrigo quem sabe!

se tiver mais alguma ideia poste pra mim…obrigado

B

vertrigo é a tua senha!

D

Já tive este problema, faça um teste, antes de dar o dispose coloque um sleep de alguns segundos.
Provavelmente ele está saindo antes de terminar a execução do processo.
Outro detalhe, não dê espaço depois do -u e -p --> -uusuario -psenha (faça desse modo)

Assim que der tempo posto aqui o modo como faço.

D
/**
	 * Faz um dump em uma tabela de uma base de dados, ou na base inteira.
	 * O arquivo gerado terá o nome da tabela + .sql, caso seja um dump de tabela ou base de dados + ".sql"
	 * caso seja um dump da base inteira. 
	 * @param String usuario do BD
	 * @param String senha do BD
	 * @param String base de dados
	 * @param String diretório onde será gerado o Dump.
	 * @param String nome da tabela a ser efetuado o dump. Vazio ou null caso o dump seja apenas na base de dados. 
	 * @param boolean true se deve constar no dump somente os dados, sem os comandos de criação da tabela. 
	 * @param boolean true se o nome dos campos devem constar no dump.
	 * @param Log
	 * @return boolean true sucesso ou false erro.
	 */
	public boolean execMysqldump(String usuarioBD, String senhaBD, String baseDados, 
										String dirDump, String tabela, boolean somenteDados, boolean nomeCampos, Log log) {
		boolean retorno = false;		

		StringBuffer comandoDump = new StringBuffer();
		comandoDump.append("mysqldump ");
		comandoDump.append("-u");
		comandoDump.append(usuarioBD);
		if (!senhaBD.trim().equalsIgnoreCase("")) {
			comandoDump.append(" -p");
			comandoDump.append(senhaBD);			
		}		
		if (somenteDados) {				
			comandoDump.append(" -t");
		}
		if(nomeCampos){
			comandoDump.append(" -c");
		}
		comandoDump.append(" "+baseDados);
		if (tabela != null || !tabela.trim().equals("")) {			
			comandoDump.append(" "+tabela);			
		} 		
		try {			
			log.logInfo("INICIO EXECUCAO MYSQLDUMP");
						 
			File fDump = null;
			File diretorioDump = new File(dirDump); 
			
			if (tabela != null || !tabela.trim().equals("")) {
				/*Se a tabela foi informada, será gerado um arquivo com o nome da tabela.sql*/
				fDump = new File(dirDump, tabela+".sql");
			}else{
				/*Senão será gerado um arquivo com o nome da base da dados.sql*/
				fDump = new File(dirDump, baseDados+".sql");
			}
			/*Se o diretório informado para salvar os dumps não existir, será criado*/
			if(diretorioDump.exists()){
				
				if (fDump.exists()) {				
//					se arquivo de dump ja existir, remover
					fDump.delete();				
				}
			}else{
				diretorioDump.mkdirs();
			}						
		
			log.logInfo("Gerando: " + fDump.getPath());
			Process p = Runtime.getRuntime().exec(comandoDump.toString());
			
			/* *****************************************************
			 * SOLUÇÃO ABAIXO É DEVIDO A UM BUG DO WINDOWS COM O waitfor()
                        * int erro = tratarGravarBufferDump(p,fDump,log);	
                        * EM LINUX FUNCIONA PERFEITAMENTE COM  p.waitfor();
			 * *****************************************************/		
			//Se erro for diferente de 0, houve algum erro ao executar o dump
			int erro = tratarGravarBufferDump(p,fDump,log);	
			
                      // verificar erro no processo
			if (erro == 0) {
				log.logInfo("SUCESSO EXECUCAO MYSQL DUMP: " + fDump.getPath());
				retorno = true;
			} else {
				log.logSevere("ERRO EXECUCAO MYSQL DUMP RETORNO = " + erro);
				log.logSevere("ARQUIVO "+ fDump.getPath()+ " NÃO GERADO");
			}
		} catch (Exception e) {
			retorno = false;
		}
		return retorno;
	}
private int tratarGravarBufferDump(Process p, File fDump,Log log) {

		  int valorDeSaida = -1;

		  //ler retorno do mysqldump atraves da InputStream
		  BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

		  // abrir output stream para armazenar retorno do mysqldump no arquivo.dump			
		  PrintWriter pw = null;

		  //Verificar se processo terminou,
		  boolean terminou = false; 

		  while(!terminou){
			  try {
				  pw = new PrintWriter(fDump);
			  } catch (FileNotFoundException e) {
				  valorDeSaida = -1;
				  log.logSevere("MysqlUtil tratarGravarBufferDump -> "+e.getMessage());
			  }
			  // fazer leitura da input stream
			  String line = null;			
			  try {
				  while ((line = br.readLine()) != null) {
					  // armazenar na output stream (arquivo)
					  pw.println(line);
					  
				  }
				  Thread.currentThread().sleep(100);
				  valorDeSaida = p.exitValue();
				  terminou = true;
			  } catch (IOException e) {
				  valorDeSaida = -1;
				  log.logSevere("MysqlUtil tratarGravarBufferDump -> "+e.getMessage());
			  } catch (IllegalThreadStateException e) {
				  try {
					  // processo ainda não terminou;
					  // Thread espera
					  Thread.currentThread().sleep(500);
				  } catch (InterruptedException e1) {
					  valorDeSaida = -1;
					  log.logSevere("MysqlUtil tratarGravarBufferDump -> "+e1.getMessage());
				  }
			  } catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
		  }	

		  // fechar input/output stream
		  try {
			  br.close();
		  } catch (IOException e) {
			  valorDeSaida = -1;
			  log.logSevere("MysqlUtil tratarGravarBufferDump -> "+e.getMessage());
		  }
		  pw.close();

		  return valorDeSaida;
	  }
kaede

Resolvido funcionou, ele cria o backup dentro do proj

fiz assim:

String comando="C:/Arquivos de programas/VertrigoServ/Mysql\bin\mysqldump.exe";   
     ProcessBuilder pb=new ProcessBuilder(comando,"--user=root","--password=vertrigo","pjlocadora","--result-file=arquivo.sql");   
     pb.start();

Agradeço a todos pela ajuda.

THIAGOANALISTA

Vc tem o código completo ou com esse postado consegirei fazer o meu backup?

kaede

Sim pode usar este, no meu caso estou usando o vertrigo, a base pjlocadora.

String comando="C:/Arquivos de programas/VertrigoServ/Mysql\bin\mysqldump.exe"; ProcessBuilder pb=new ProcessBuilder(comando,"--user=root","--password=vertrigo","pjlocadora","--result-file=arquivo.sql"); pb.start();

Criado 19 de julho de 2009
Ultima resposta 21 de set. de 2010
Respostas 10
Participantes 7