Problemas com backup no Postgres, acredito que meu codigo java esteja errado!

4 respostas
E

Boa noite pessoal, ou bom dia já não é?!?!

Seguinte pessoal, sei que tem muitos tópicos deste assunto no forum e já varri praticamente todos e não encontro solução. Me problema é o seguinte: estou desenvolvendo uma tela de bakup, utilizei vários codigos que aqui mesmo encontrei, porém não consegui nada.

a seguir o primeiro teste que fiz, esse comando ocorre o erro apenas no momento e em que "starta" o processo para executar o comando do backup.

a mensagem de erro dele segue logo abaixo do mesmo:
public boolean Backup(BackupDTO backupDTO){
                private ProcessBuilder pb; 
                private Process p; 
		try{
			Conexao.ConectDB();
			p=null;
			pb=null;
	        pb = new ProcessBuilder("C:\\Program Files\\PostgreSQL\\8.3\\bin\\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f \""+backupDTO.getNome()+".backup\" \"Projeto_ElShaday\"");
	        pb.environment().put("PGPASSWOD", "cdfs");
	        pb.redirectErrorStream(true);
		p = pb.start();                         // <<<<<< o erro ocorre nesta linha!
		Conexao.con.commit();
		Conexao.CloseDB();
	        return true;
		}
		catch(Exception e){
			System.out.println(e.getMessage());
			JOptionPane.showMessageDialog(null, "ERRO: "+e.getMessage()+"  "+e.getStackTrace(),"ERRO BACKUP",JOptionPane.ERROR_MESSAGE);
			return false;
		}
	}

ERRO -->> Cannot run program "C:\Program Files\PostgreSQL\8.3\bin\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f "D:\Backup\nomeDoArquivo.backup" "Projeto_ElShaday"": CreateProcess error=2, The system cannot find the file specified

acusa que não consegue encontrar o file especificado, e ja tentei de tudo! só pra informar, eu busco o caminho-destino do backup com um JFileChooser, então o caminho não tem como estar errado! poderia ser a linha de codigo que é mandada para o Postgres?

Já este abaixo encontrei hoje mesmo, bastante simples e até então roda perfeitamente, com uma restrição, ele executa o processo, mas não sei o motivo da um erro onde simplesmente é iniciado o arquivo.backup, mas não é concluído (trava), é como se entrasse em um LOOP e não terminasse mais, aparece com 0 kb de tamanho, não permite exclusão, a menos que reinicie a máquina, onde continua zerado seu tamanho só que permite a exclusão. Mas não reporta erro algum!
public boolean Backup1(BackupDTO backupDTO){
		try{
			Process process = Runtime.getRuntime().exec("C:\\Program Files\\PostgreSQL\\8.3\\bin\\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f \"" + backupDTO.getNome() + ".backup\" Projeto_ElShaday");
			return true;
		}
		catch(Exception e){
			System.out.println(e.getMessage());
			JOptionPane.showMessageDialog(null, "ERRO: "+e.getMessage()+"  "+e.getStackTrace(),"ERRO BACKUP",JOptionPane.ERROR_MESSAGE);
			return false;
		}
	}
retirei o mesmo do seguinte tópico: http://www.guj.com.br/java/137290-duvida-com-backup-do-postgre

segui todos os passos mas não deu certo: "sem o '-v' com '-v', .... ou seja, tentei de tudo mas não ocorre nada!

Obrigado desde já pela atenção e tenhão uma ótima sexta e final de semana, abraços.

4 Respostas

M

Emerson_sannin,

eu faço algo parecido porém o meu servidor é linux, veja se o código abaixo te ajuda em algo:

final ArrayList<String> cmd = new ArrayList<String>();
		cmd.add("/usr/bin/pg_dump");
		cmd.add("-U");
		cmd.add("visaoti");
		cmd.add("-v");
		cmd.add("-Fc");
		cmd.add("-i");
		cmd.add("-f");
		cmd.add("linear_backup.backup");
		cmd.add(dataBase);

		final ProcessBuilder pb = new ProcessBuilder(cmd);

		final Map<String, String> env = pb.environment();
		env.put("PGPASSWORD", password);

		final Process process = pb.start();

		final BufferedReader r = new BufferedReader(new InputStreamReader(process.getErrorStream()));
		String line = r.readLine();

		xmlRetorno.append("<lines>");
		while (line != null) {
			xmlRetorno.append(line);
			line = r.readLine();	      	
		}

		xmlRetorno.append("</lines>");
		r.close();

		int exitCode;
    try {
	    exitCode = process.waitFor();
    } catch (InterruptedException e) {
	    exitCode = -1;
    }
D

Coloque o bin do postgre no path do seu SO, assim vc evita ter que usar o caminho absoluto.
Dê uma olhada aqui e adapte à sua necessidade.

http://www.guj.com.br/java/232181-dida-ao-gerar-arquivo-de-exportao-em-mysql

[]'s

E

Boa tarde pessoal,

primeiramente obrigado pela ajuda, mas tanto no caso do “macspace” e do “davidbuzatto” ocorreu o mesmo erro: estou acreditando que o problema está no código que envio para o postgres e não no java, pois nã otem outra solução!

Alguém saberia dizer se está correto?

e também david, faz tempo que não configuro uma variável no path, só pra garantir, como eu devo chama-la e continuar a especifiar o caminho? Na verdade eu sou bastante leigo nessa parte de de configuração do path, sei como criar mas não como usa-la no código!! ~~

por exemplo: “nome_variavel\pg_dump.exe …” seria isso mesmo?

Obrigado pela atenção e paciencia!

D

Olá,

Não, a partir do momento que o Path está configurado, os executáveis, dlls, etc. daquele diretório são “vistos” (podem ser invocados) em qualquer diretório. Sendo assim, para chamar o pg_dump.exe bastaria vc usar “pg_dump” ou pg_dump.exe.

[]'s

Criado 26 de janeiro de 2012
Ultima resposta 27 de jan. de 2012
Respostas 4
Participantes 3