Erro ao fazer backup do postgre via código![RESOLVIDO]

14 respostas
andre_bento
Olá amigos. Estou precisando da ajuda de vocês aqui. É o seguinte, estou desenvolvendo uma aplicação e ela faz o backup do banco de dados automaticamente a cada 3 dias... Só que estou tentando utilizar esse código abaixo mas ele gera erro:
public void realizaBackup() throws IOException, InterruptedException{  
             List<String> comandos = new ArrayList<String>();  
            comandos.add("C:\\Program Files\\PostgresPlus\\8.4SS\\bin\\pg_dump.exe");  
            comandos.add("-i");  
            comandos.add("-h");  
            comandos.add("localhost");  
            comandos.add("-p");  
            comandos.add("5432");  
            comandos.add("-U");  
            comandos.add("postgres");  
            comandos.add("-F");  
            comandos.add("c");  
            comandos.add("-b");  
            comandos.add("-v");  
            comandos.add("-f");  
            comandos.add("C:\\IBV System");  
            comandos.add("banco_teste");  
      
            ProcessBuilder pb = new ProcessBuilder(comandos);  
      
            pb.environment().put("PGPASSWORD", "post");          
      
            try {  
                final Process process = pb.start();  
      
                final BufferedReader r = new BufferedReader(  
                    new InputStreamReader(process.getErrorStream()));  
                String line = r.readLine();  
                while (line != null) {  
                System.err.println(line);  
                line = r.readLine();  
                }  
                r.close();  
      
                final int dcertExitCode = process.waitFor();  
      
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (InterruptedException ie) {  
                ie.printStackTrace();  
            }  
            
        }
ERRO:
pg_dump: [arquivador personalizado] nao pode abrir arquivo de saida "C:\IBV System": Permission denied

O que eu faço para poder liberar o acesso, ou alguém tem um outro código que faça o backup do banco via código java!!?!??
Já liberei o acesso total a pasta IBV System no diretório C:, que inclusive faço várias transações de arquivos nesse diretório via código e sem nenhum problema...
Se tiverem outro código que funfe por favor me passem aqui pra eu dar uma olhada...
Abraços
Me ajuuuda!!!

14 Respostas

fabiozanardi

problema pode ser o espaço no nome da pasta de backup

experimente mudar

comandos.add("C:\\IBV System");    
comandos.add("banco_teste");

para

comandos.add("C:\\backup\\");    
comandos.add("banco_teste.sql");
andre_bento

Olá amigo…
Cara, tentei fazer o que vc me falou mas o erro de permissão continua… :frowning:
Vc tem outro código que faça esse backup?
Não estou entendendo o porque da permissão negada, pois eu estou dando todos os privilégios nessa pasta para todos os usuários…
E mesmo assim não vai :frowning:

fabiozanardi

Você consegue disponibilizar o seu codigo para eu dar uma olhada?

tenho um postgres aqui nesse pc e acho que consigo resolver e te falar onde era o erro

abraço

andre_bento
Tá na mão amigo!!
public void realizaBackup() throws IOException, InterruptedException{  
             List<String> comandos = new ArrayList<String>();  
            comandos.add("C:\\Program Files\\PostgresPlus\\8.4SS\\bin\\pg_dump.exe");  
            comandos.add("-i");  
            comandos.add("-h");  
            comandos.add("localhost");  
            comandos.add("-p");  
            comandos.add("5432");  
            comandos.add("-U");  
            comandos.add("postgres");  
            comandos.add("-F");  
            comandos.add("c");  
            comandos.add("-b");  
            comandos.add("-v");  
            comandos.add("-f");  
            comandos.add("C:\\IBV System");  
            comandos.add("banco_teste");  
      
            ProcessBuilder pb = new ProcessBuilder(comandos);  
      
            pb.environment().put("PGPASSWORD", "post");          
      
            try {  
                final Process process = pb.start();  
      
                final BufferedReader r = new BufferedReader(  
                    new InputStreamReader(process.getErrorStream()));  
                String line = r.readLine();  
                while (line != null) {  
                System.err.println(line);  
                line = r.readLine();  
                }  
                r.close();  
      
                final int dcertExitCode = process.waitFor();  
      
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (InterruptedException ie) {  
                ie.printStackTrace();  
            }  
            
        }
fabiozanardi

segura ae

fabiozanardi

O Arquivo até gerou mas zerado, parece que ele fica aguardando digitar a senha mesmo passando ela depois, você já fez isso funcionar alguma vez?

andre_bento

Ainda não amigo…
Eu peguei esse código na net mas ainda não consegui executar ele…
Vc já tentou algo assim cara?
Tem algum código que funcione?
Obrigado pela força!

fabiozanardi

Funcionou, se der erro ai pode ser permissão do seu sistema OS na hora de criar o arquivo, segue abaixo o codigo completo, apenas altere o que for diferente para sua instalação, caso não funcione vamos ver o que pode ser, mas deve ser algo no seu OS de permissão.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


public class PostgresBackup {

	public static void realizaBackup() throws IOException, InterruptedException{    
       final List<String> comandos = new ArrayList<String>();    
       
       //comandos.add("C:\\Program Files (x86)\\PostgreSQL\\8.4\\bin\\pg_dump.exe");     // esse é meu caminho
      comandos.add("C:\\Program Files\\PostgresPlus\\8.4SS\\bin\\pg_dump.exe");  
      
       comandos.add("-i");    
       comandos.add("-h");    
       comandos.add("localhost");    
       comandos.add("-p");    
       comandos.add("5432");    
       comandos.add("-U");    
       comandos.add("postgres");    
       comandos.add("-F");    
       comandos.add("c");    
       comandos.add("-b");    
       comandos.add("-v");    
       comandos.add("-f");    
       
       comandos.add("c:\\bkp.txt");   // eu utilizei meu C:\ e D:\ para os testes e gravei o backup com sucesso.
       comandos.add("seu_banco");    
   
       ProcessBuilder pb = new ProcessBuilder(comandos);    
       
       pb.environment().put("PGPASSWORD", "sua_senha");            
       
       try {    
           final Process process = pb.start();    
   
           final BufferedReader r = new BufferedReader(    
               new InputStreamReader(process.getErrorStream()));    
           String line = r.readLine();    
           while (line != null) {    
           System.err.println(line);    
           line = r.readLine();    
           }    
           r.close();    
   
           process.waitFor();
           System.out.println("backup realizado com sucesso.");
   
       } catch (IOException e) {    
           e.printStackTrace();    
       } catch (InterruptedException ie) {    
           ie.printStackTrace();    
       }       
         
   }  	
	
	public static void main(String[] args) {
		try {
			PostgresBackup.realizaBackup();			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	
}
andre_bento

Fáááááábio vc é d++++++++ brother!!!
rsrsrrs
Muito obrigado cara, funcionou legal mesmo…
Alterei aqui para minahs informações e funcionou…
Acho que eu não tinha colocado o nome do arquivo como vc fez…
Muito obrigado brother pela ajuda.
Um forte abraço!!!

fabiozanardi

Cara, eu tava dando uma ultima analisada e vi que ta faltando voce matar o processo, senao cada backup que rodar ele vai abrir um novo pg_dump.exe e manter em memoria

coloca isso emabixo da linha que aguarda o processo:

process.waitFor(); 
process.destroy(); // adicionar essa.
andre_bento

Olá amigo…
Cara, obrigado mesmo…
Eu add essa linha que vc comentou, nem tinha reparado nisso…
Mais uma vez, muito obrigado cara…
Um abraço

D

boa noite…
só me tira uma dúvida, ele demora mesmo para gerar o backup, fiz o teste com um banco com apenas uma tabela e esta demorando muito.

javaflex

Se fez o backup localmente não deveria demorar nao.

M

BOA NOITE, PESSOAL
vi hj essa conversa de vcs sobre o postgres e java, seguinte estou começando nos 2 sou iniciante ainda rsrsrs
mas ja fiz um projeto de cadastros de usuários em java como netbeans e uso o postgres dae queria ver quem tem a aplicação pra fazer bkp do java , tipo eu fiz uma tela como um botão de bkp e um botão de restore, e um campo pra buscar o caminho e o arquivo de bkp …
mas não tenho o macete de fazer o codigo kk alguem poderia me dar help, se funcionar poderemos ate combinar um valor que eu pago estou precisando urgente caso precisar envio o meu projeto …

Criado 19 de dezembro de 2011
Ultima resposta 9 de jun. de 2016
Respostas 14
Participantes 5