Não consigo fazer Backup do Banco de Dados pela aplicação

Olá pessoal estou tentando realizar um backup do banco de dados direto pela aplicação Java Swing que desenvolvi, já havia conseguido realizar este comando porém estou utilizando o Postgresql 9.5 e não estou conseguindo gerar o backup pleo código abaixo, simplesmente não gera o arquivo e não da nenhum erro, tentei gerar direto pelo Postgresql e o arquivo é gerado normalmente.
Será que tem que fazer alguma configuração no Postgresql para gerar este backup pelo java?
Abaixo o código:

try {
            ProcessBuilder pb;
            Process p;
            pb = new ProcessBuilder("C:\\Arquivos de programas\\PostgreSQL\\9.5\\bin\\pg_dump.exe", "-i", "-h", "localhost", "-p", "5432", "-U", "USUARIO DO BANCO", "-F", "c", "-b", "-v", "-f", "C:\\backup\\bkpBanco.backup", "base_de_dados");
            pb.environment().put("PGPASSWORD", "SENHA DO BANCO");
            pb.redirectErrorStream(true);
            p = pb.start();
            JOptionPane.showMessageDialog(this, "Backup Gerado com sucesso!\n A Aplicação  será finalizada para efetivação do Backup. ", "BACKUP!", JOptionPane.INFORMATION_MESSAGE);
            System.exit(0);

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "Ocorreu um Erro ao GERAR O BACKUP: " + ex.getMessage(), "ERRO BAKCUP!", JOptionPane.ERROR_MESSAGE);
        }

Nenhum erro? O código é o mesmo que funcionava com a outra versão do Postgres?

Sim nenhum erro, simplesmente não gera o arquivo de backup, pelo menos na saida do Netbeans não é gerado nada, o código não cai na execption.

Tentou olhar o log do DB?

Onde consigo ver este log? estava executando direto pela aplicação, quando é executado pelo Postgresql o backup gera normalmente

Depende do sistema operacional. Procura aqui. No meu fica em /var/log/postgresql/{versão}/. Lá vai ter os erros que deu. Executa o teu programa e abre o log pra ver o que foi escrito por último. Se o erro estiver acontecendo no banco, vai aparecer lá (é para aparecer).

Isso pelo menos vai te guiar um pouco mais em direção à solução.

Oi o postrgres tem um agendador de tarefas e você pode usar pra fazer o backup, não vejo pq você quer fazer isso pela aplicação? pelo banco com e bem simples e seguro.

olá Charles_tenorio , você tem algum exemplo de como usar este agendador do postgresql?

estou tentando fazer um .bat, mas com os exemplos que eu peguei na net não está dando certo

@shodaime quando você inicia o processo ele não pára a execução do seu código até finalizar o processo, ele inicia o processo a execução do seu código segue adiante (a execução é assíncrona) e duas linhas depois você mata ele… Tente adicionar uma verificação se o processo ainda está sendo executado antes de finalizar o seu programa…
Mais ou menos assim:

try {
        ProcessBuilder pb;
        Process p;
        pb = new ProcessBuilder("C:\\Arquivos de programas\\PostgreSQL\\9.5\\bin\\pg_dump.exe", "-i", "-h", "localhost", "-p", "5432", "-U", "USUARIO DO BANCO", "-F", "c", "-b", "-v", "-f", "C:\\backup\\bkpBanco.backup", "base_de_dados");
        pb.environment().put("PGPASSWORD", "SENHA DO BANCO");
        pb.redirectErrorStream(true);
        p = pb.start();
        // VERIFICAR SE PROCESSO AINDA ESTA ATIVO
        while(p.isAlive()) {
            Thread.sleep(100L);
        }
        JOptionPane.showMessageDialog(this, "Backup Gerado com sucesso!\n A Aplicação  será finalizada para efetivação do Backup. ", "BACKUP!", JOptionPane.INFORMATION_MESSAGE);
        System.exit(0);

    } catch (Exception ex) {
        JOptionPane.showMessageDialog(this, "Ocorreu um Erro ao GERAR O BACKUP: " + ex.getMessage(), "ERRO BAKCUP!", JOptionPane.ERROR_MESSAGE);
    }

@Eldius adicionei esta linha no código e debuguei, quando ele chega no while ele nem entra e já sai do sistema, e o backup não gera.

Então eu consigo ver mais duas possibilidades, uma é que está dando erro na execução do comando dump, o que você pode verificar acrescentando as linhas abaixo antes de iniciar o processo:

        File file = Paths.get("output.txt").toFile();
        File error = Paths.get("error_output.txt").toFile();
        if(file.exists()) {
            file.delete();
        }
        if(error.exists()) {
            error.delete();
        }
        error.createNewFile();
        pb.redirectOutput(file);
        pb.redirectError(error);

E assim você vai ver a saída do console nos arquivos criados…

Um outro problema que eu costumava ter antigamente utilizando um objeto Runtime pra iniciar um processo (Runtime.getRuntime().exec()) no Windows era necessário adicionar ao início do comando um “cmd /C” (testando aqui no Java 8 eu não precisei adicionar isso mas acredito que vale a menção).

o engraçado é que se eu executar o backup pelo Postgresql ele é gerado normalmente

@Eldius em qual linha posso colar este ultimo código?
coloquei antes da

p = pb.start(); 

e não adiantou.

Então acho que a única coisa que resta testar é a questão do comando em ambiente Windows (em alguns casos, que eu não faço ideia de quais são) você precisa acrescentar um “cmd /C” antes do comando em si, então tente alterar a linha onde cria o ProcessBuilder para:

pb = new ProcessBuilder("cmd", "/C", "C:\\Arquivos de programas\\PostgreSQL\\9.5\\bin\\pg_dump.exe", "-i", "-h", "localhost", "-p", "5432", "-U", "USUARIO DO BANCO", "-F", "c", "-b", "-v", "-f", "C:\\backup\\bkpBanco.backup", "base_de_dados");

@Eldius fiz como vc disse mas sem sucesso, não estou conseguindo entender o porque este comando não está funcionado, ja o utilizei em outros projetos porém agora ele não gera.
Tentei também alguns exemplos para que seja criado um .bat mas também não consegui.
Você teria algum exemplo para que eu otimizasse um backup isso já me ajudaria também.

@shodaime não tenho como testar aqui, mas no site do Postgresql tem um tutorial de como agendar o backup como um job no Windows [0] e tem um psAgent que pelo que vi é uma ferramenta pra agendar tarefas no banco [1] (mas eu não tenho ideia se é uma boa abordagem)…

Espero que ao menos isso te ajude…

[0] http://www.postgresonline.com/journal/archives/19-Setting-up-PgAgent-and-Doing-Scheduled-Backups.html

[1] http://www.postgresonline.com/journal/archives/19-Setting-up-PgAgent-and-Doing-Scheduled-Backups.html

@Eldius stalei o pgAgent mas o problema é no batch, também não estou tendo sucesso para o backup dessa forma, veja meu arquivo .bat como esta

@ECHO OFF
@CLS
@COLOR 02
@FOR /F “tokens=1-4 delims=/ ” %%I IN (‘DATE /t’) DO SET data=%%L-%%K-%%J
@FOR /F “TOKENS=1-2* delims=:” %%A IN (‘TIME /t’) DO SET hora=%%Ahr%%Bmin
@SET
caminho=C:\backup\
@SET database=NOME_DO_BANCO

@ECHO =======================================================
@ECHO BACKUP TESTES – FINAL
@ECHO =======================================================
@ECHO.
@ECHO.
@ECHO Backup Data: “%data%”
@ECHO Backup Hora: “%hora%”
@ECHO.
@ECHO Arquivo de Backup: %caminho%%database%_%data%_%hora%.backup
@ECHO.
@ECHO.

SET PGPASSWORD=SENHA_DO_BANCO

@c:
@cd c:\Arquivos de programas\PostgreSQL\9.5\bin

@pg_dump.exe %database% -Fc -U postgres >
%caminho%%database%_%data%_%hora%.backup

@pg_dump.exe %database% -Fp –inserts -U postgres >
%caminho%%database%_%data%_%hora%.sql

if not exist %caminho%%database%_%data%_%hora%.backup goto MESSAGE

if not exist %caminho%%database%_%data%_%hora%.sql goto MESSAGE

@ECHO *******************************************
@ECHO BACKUP REALIZADO COM SUCESSO !!!!
@ECHO *******************************************
@ECHO.

goto END
:MESSAGE

@ECHO *******************************************
@ECHO ATENCAO: ERRO NA CRIACAO DO BACKUP !
@ECHO *******************************************
@ECHO.
PAUSE

:END

Consegui gerar um backup direto pela aplicação o problema estava nas barras

estava passando dessa forma

pb = new ProcessBuilder("cmd", "/C", "C:\\Arquivos de programas\\PostgreSQL\\9.5\\bin\\pg_dump.exe", "-i", "-h", "localhost", "-p", "5432", "-U", "USUARIO DO BANCO", "-F", "c", "-b", "-v", "-f", "C:\\backup\\bkpBanco.backup", "base_de_dados");

e o correto seria

pb = new ProcessBuilder("cmd", "/C", "C:/Arquivos de programas/PostgreSQL/9.5/bin/pg_dump.exe", "-i", "-h", "localhost", "-p", "5432", "-U", "USUARIO DO BANCO", "-F", "c", "-b", "-v", "-f", "C:/backup/bkpBanco.backup", "base_de_dados");

Mas gostaria também de fazer o backup pelo .bat no windows mas ainda não consegui

1 curtida

O engraçado é que na versão 9.5 não funciona de jeito nenhum, na 9.4 que eu consegui fazer o backup