Fazer Backup do postgre em Java

6 respostas
A

Boa noite pessoal,

estou querendo fazer backup via aplicação java no bd postgre, já visitei uns 20 fóruns sobre o assunto; tentei chamar o pg_dump pelo Runtime.getRuntime().exec(), sem muito sucesso, criei um arquivo.bat que executa normalmete, mas quando chamo este .bat no java, ele não roda. Decidi partir para a “ignorância” fiz um arquivo em vb 6 e consegui chamar este arquivo.bat; chamei este arquivo no java, ele até executou a minha aplicação em vb6 só que na hora de executar o .bat, parece que o java brocou ele.

O que posso fazer? alguém pode me ajudar?

6 Respostas

R

Como assim não executou o .bat?
Qual foi o erro que deu?

É isso mesmo que voce tá fazendo que é o caminho… presta atençao aí que voce pode estar comendo algum gambá…

E

a melhor forma é vc executar o pg_dump sem bat nenhum, pelo exec() do Runtime, assim em SOs que não sejam Windows o backup vai funcionar também…

A

Olá rogelgarcia, boa noite, o arquivo .bat executa normalmente quando dou dois cliques nele (gera o backup), chamando por uma aplicação VB 6 também funciona. Já quando eu rodo o .bat na aplicação java de alguma maneira ele não executa, e nem mostra mensagem de erro.

O arquivo .bat não tem erro.

Olá erico_kl, boa noite, será que é realmente a melhor opção, dessa maneira vou ter que armazenar a senha do banco em um arquivo .conf do Postgre, já com o arquivo .bat, eu consigo gerar ele automaticamente com a ajuda da classe PrintWriter e depois que executar o mesmo eu posso apagar, evitando que a senha fique de alguma forma exposta.

Continuo aguardando alguma solução viável.

R

Seguinte… vc tem que pegar a saida do .bat… e redirecionar para a saida do console do seu programa java… se nao… vc nao vai ver nada no console mesmo nao…

Em idioma java: pegar o inputstream da execucao do programa… ler e mandar para o output stream do seu programa java (System.out)

E


Olá erico_kl, boa noite, será que é realmente a melhor opção, dessa maneira vou ter que armazenar a senha do banco em um arquivo .conf do Postgre, já com o arquivo .bat, eu consigo gerar ele automaticamente com a ajuda da classe PrintWriter e depois que executar o mesmo eu posso apagar, evitando que a senha fique de alguma forma exposta.

Continuo aguardando alguma solução viável.


vc nao precisa necessariamente salvar a senha no .conf do postgre, pode setá-la na hora de rodar o comando pelo runtime mesmo:

set PGUSER=usuario set PGPASSWORD=senha pg_dump ...

A

Olá erico_kl, tentei setar a senha como você falou;

Runtime.getRuntime().exec("set PGPASSWORD=senha");
Process p = Runtime.getRuntime().exec("C:\\Arquivos de programas\\PostgreSQL\\8.4\\bin\\pg_dump -c -b --column-inserts -E utf8 -h 192.168.170.1 -p 5432 -U postgres -F t -i -v -f c:\\backup.tar postgres");

mas deu o seguinte erro:

GRAVE: null
java.io.IOException: Cannot run program "set": CreateProcess error=2, O sistema não pode encontrar o arquivo especificado
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
        at java.lang.Runtime.exec(Runtime.java:593)
        at java.lang.Runtime.exec(Runtime.java:431)
        at java.lang.Runtime.exec(Runtime.java:328)

Olá rogelgarcia, acho que peguei a saída do .bat, fiz assim:

Process p = Runtime.getRuntime().exec(caminhoArquivoBat + "script_backup.bat");

String line;
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
     System.out.println(line);
}
input.close();

Mas o que ele retornou foi só a seguinte linha:

C:\Documents and Settings\Atila\Meus documentos\NetBeansProjects\Sistema>pg_dump -c -b --column-inserts -E utf8 -h 127.0.0.1 -p 5432 -U postgres -F t -i -v -f C:\backup.tar banco

debug-single:
CONSTRUÍDO COM SUCESSO (tempo total: 3 segundos)

Também não deu certo.

Deixa eu explicar melhor a situação.

O servidor do banco de dados ficará em uma máquina remota, mas eu quero deixa a opção do usuário fazer o backup na aplicação ou seja na máquina que ele estiver, como eu não consigo acessar pg_dump e o pg_retore no servidor (salvo se tivesse uma aplicação rodando no servidor e trabalhasse com sockets), dai copiei a o pg_dump e o pg_restore com as respectivas dlls e coloquei em uma pasta ficando assim (como mostra a imagem “espero que de certo rsrs”):

E os arquivos script_backup.bat e script_restore.bat estão assim:

script_backup.bat

@echo off
set BACKUP_FILE=C:\backup.tar
set PGPASSWORD=senha
echo on
pg_dump -c -b --column-inserts -E utf8 -h 127.0.0.1 -p 5432 -U postgres -F t -i -v -f %BACKUP_FILE% banco

script_restore.bat

@echo off
set BACKUP_FILE=C:\backup.tar
set PGPASSWORD=senha
echo on
pg_restore -c -d banco -h 127.0.0.1 -p 5432 -U postgres -F t %BACKUP_FILE%

Esta pasta com os arquivos eu posso colocar ela em qualquer lugar (Desktop, Meus Documento, PenDrive), e quando eu dou dois cliques nos arquivos .bat eles fazem backup e restore respectivamente sem problemas; sendo o banco local ou remoto. E como eu falei, quando chamo o .bat dentro do java, da pau, não roda, e como ainda tinha falado anteriormente, no VB6 não tem esse problema, posso chamar o .bat que ele roda como se eu tivesse dado dois cliques nele.


Criado 1 de junho de 2011
Ultima resposta 2 de jun. de 2011
Respostas 6
Participantes 3