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
}
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)
[code]
/**
* 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;
}
[/code]
[code] 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;
}[/code]