Backup e Restore (BD) Postgres 8.4 usando Java

[size=14]Olá a todos[/size]
Gostaria de receber alguma orientação de como fazer[color=darkred] Backup[/color] e [color=darkred]Restore[/color] (BD) Postgres 8.4 usando Java.
Estou desenvolvendo uma aplicação desktop, e o usuário deseja poder fazer Backup e poder também restaurar o BD, quando necessário; infelizmente não tenho ideia de como fazer isso.
Desde já agradeço a todos pela ajuda.

Olá,

O que podes fazer é executar um comando externo através do java, utilizando as ferramentas de backup e restoure do próprio banco de dados.

Exemplo de como fazer o Backup no postgres:

try {
            String ipServidor = "192.168.1.1";
            String arquivoBackup = "nomeArquivoBackup.sql";
            String user = "usuario";
            Process process = Runtime.getRuntime().exec("pg_dumpall -h "+ipServidor+" -U "+user+" -f "+arquivoBackup);
            process.waitFor();

            InputStream stream = process.getErrorStream();
            byte[] content = new byte[stream.available()];
            if (content.length > 0){
               stream.read(content);
               System.out.println("*** ERRO *** ");
               System.out.println(new String(content));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

Caso tenha dúvidas de como utiliizar o pg_dumpall clique aqui.

T+

gdc

Só mais uma orientação. Quando é executado esse comando, não é solicitado a[color=darkred] senha[/color]?

Podes fazer os seguinte para adicionar a senha, antes de executar o pg_dumpall execute o seguinte comando:

Runtime.getRuntime().exec("SET PGPASSWORD="+SENHA); 

E no final de tudo execute:

Runtime.getRuntime().exec("SET PGPASSWORD=*****"); 

Observação: Vai ter diferença entre os SO.

T+

Consegui através deste post

Abaixo faz o Backup.

    import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.util.ArrayList;  
    import java.util.List;  
    import javax.swing.JOptionPane;
      
      
    public class PostgresRestore {        
        public static void realizaRestore() throws IOException, InterruptedException{      
           final List<String> comandos = new ArrayList<String>();      
             
           comandos.add("C:\\Arquivos de programas\\PostgreSQL\\9.1\\bin\\pg_restore.exe"); //testado no windows xp
           
           
           comandos.add("-i");      
           comandos.add("-h");      
           comandos.add("localhost");    //ou   comandos.add("192.168.0.1"); 
           comandos.add("-p");      
           comandos.add("5432");      
           comandos.add("-U");      
           comandos.add("NOME DO USUARIO");      
           comandos.add("-d");      
           comandos.add("NOME DO BANCO");     
           comandos.add("-v");      
             
           comandos.add("C:\\bkp.backup");   // eu utilizei meu C:\ e D:\ para os testes e gravei o backup com sucesso.  

           ProcessBuilder pb = new ProcessBuilder(comandos);      
             
           pb.environment().put("PGPASSWORD", "SUA SENHA");     //Somente coloque 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();    
               process.destroy(); 
               JOptionPane.showMessageDialog(null,"Restore realizado com sucesso.");  
         
           } catch (IOException e) {      
               e.printStackTrace();      
           } catch (InterruptedException ie) {      
               ie.printStackTrace();      
           }         
               
       }      
          
        public static void main(String[] args) {  
            try {  
                PostgresRestore.realizaRestore();           
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
          
          
    }  

Abaixo faz o Restore.

import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.util.ArrayList;  
    import java.util.List;  
import javax.swing.JOptionPane;
      
      
    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"); 
          //comandos.add("C:\\Program Files\\PostgresPlus\\8.4SS\\bin\\pg_dump.exe"); 
           comandos.add("C:\\Arquivos de programas\\PostgreSQL\\9.1\\bin\\pg_dump.exe");    // esse é meu caminho  
           
           comandos.add("-i");      
           comandos.add("-h");      
           comandos.add("localhost");     //ou  comandos.add("192.168.0.1"); 
           comandos.add("-p");      
           comandos.add("5432");      
           comandos.add("-U");      
           comandos.add("USUARIO");      
           comandos.add("-F");      
           comandos.add("c");      
           comandos.add("-b");      
           comandos.add("-v");      
           comandos.add("-f");      
             
           comandos.add("c:\\bkp.backup");   // eu utilizei meu C:\ e D:\ para os testes e gravei o backup com sucesso.  
           comandos.add("NOME DO BANCO");      
           ProcessBuilder pb = new ProcessBuilder(comandos);      
             
           pb.environment().put("PGPASSWORD", "SUA SENHA");      //Somente coloque 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();    
               process.destroy(); 
               JOptionPane.showMessageDialog(null,"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();  
            }  
        }  
          
          
    }  

Espero ter ajudado pelo menos um pouco, pois quebrei a cabeça atras!!!

1 curtida

Amigo, testei seu código e funcionou certinho. O Problema é que na hora de fazer o restore ele está me retornando vários erros deste:

pg_restore: criando FK CONSTRAINT solicitacao_emp_cod_fkey pg_restore: [arquivador (bd)] Erro no registro do TOC 1963; 2606 24640 FK CONSTRAINT solicitacao_emp_cod_fkey postgres pg_restore: [arquivador (bd)] could not execute query: ERRO: restrição "solicitacao_emp_cod_fkey" para relação "licenca" já existe Comando foi: ALTER TABLE ONLY licenca ADD CONSTRAINT solicitacao_emp_cod_fkey FOREIGN KEY (emp_cod) REFERENCES empresa(emp_cod); AVISO: erros ignorados durante restauração: 27

E ele acaba não fazendo o restore do backup como o esperado. O banco continua intacto.
Poderia me ajudar? Agradeço desde já! Valeu!