Dúvida com backup do postgre

Olá pessoal…

Bom, basicamente tenho três duvidas, vou descrever uma após a outra pra facilitar…

  1. Por que quando eu rodo o pg_dump.exe através de um JButton do meu programa, a tela em questao fica travada e o arquivo de backup é gerado só depois q eu finalizo o programa ?
    Pra rodar o pg_dump.exe eu uso o seguinte trecho de código, que se acha em qq fórum por ai (arq == caminho e nome do arquivo escolhido num save dialog):

try { Runtime.getRuntime().exec("D:\\PROGRAMAS\\PostgreSQL\\8.3\\bin\\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f \"" + arq + "\" jsacteste"); } catch (Exception ex) { ex.printStackTrace(); }
2) Eu consegui que o programa não fique travado, executando o cmd e passando o comando pra ele ao invés de chamar diretamente o pg_dump, só que eu tentei usar o comando waitFor(); para esperar o cmd ser finalizado e entao obter o exitValue(); verificar se é igual a 0 ou não pra dizer se o backup foi feito com sucesso ou não, (apesar de eu achar q nao vai funcionar, pq o programa executado foi o cmd e nao o pg_dump) mas o comando waitFor(); não funcionou, passou direto por ele, ou seja, o println ali é imprimido antes do pg_dump terminar. Por que será? chamando outros programas, como no notepad por exemplo, ele fica esperando …

try { Process p = Runtime.getRuntime().exec("cmd.exe /c start D:\\PROGRAMAS\\PostgreSQL\\8.3\\bin\\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f \"" + arq + "\" jsacteste"); p.waitFor(); System.out.println("terminou"); } catch (IOException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); }
3) A ultima dúvida é a respeito das mensagens geradas pelo pg_dump, por exemplo, se eu executar o cmd e dai rodar o comando pro pg_dump fazer o backup, varias mensagens serão exibidas no console, (reading table … reading nao sei o q…), se eu fizer o backup a partir do pgAdmin, essas mensagens tbem aparecem na telinha lah do pgAdmin, será q tem como eu obter essas mensagens e joga-las num JTextArea por exemplo ??? eu quero verificar o código de saída tbem pra informar o usuário se o backup foi feito com sucesso, mais como dito acima, ou fica travado ou passa direto… Alguem já fez alguma coisa assim ?

Desde já grato t+

Comigo tb acontecia de travar, entao testando vi que tirando o “-v” funcionava certinho.
Nao vi diferença alguma com ou sem este parametro entao deixei assim.

:wink:

pois é cara, na sexta feira quando comecei a fazer isso, tava travando, mas agora to fazendo o backup com o seguinte código, que é justamente o que travava, o tah com o -v que vc disse q teve q tirar…

try { Runtime.getRuntime().exec("D:\\PROGRAMAS\\PostgreSQL\\8.3\\bin\\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -v -f \"C:\\Documents and Settings\\Cleiton\\Desktop\\teste.backup\" jsacteste"); } catch (IOException ex) { ex.printStackTrace(); }
puts, eu queria fazer as mensagens do modo verboso (-v) aparecer num text area pro usuario poder analizar e ver se o backup foi realizado com sucesso, vc implementou algo assim, verificar se o código de saida é igual a zero e tallz, ou só tah chamando o pg_dump mesmo?

vlw t+

puts, esquece o q eu disse, tah travando sim, eu nao tinha compilado antes de testar, mas é o que vc disse, tirando o modo verboso -v, funciona

sobre as mensagens que o pg_dump exibe, eu tentei obter elas usando o getInputstream(); de Process, mas nao aparece nada, a string impressa não contem nada…
Obs: na primeira linha está sem o -v(modo verboso, que exibe as mensagens) para não travar, mas eu tentei executando o cmd tbem, como postei no primeiro post, com o -v, e tbem nao funcionou…

[code]try {
Process p = Runtime.getRuntime().exec(“D:\PROGRAMAS\PostgreSQL\8.3\bin\pg_dump.exe -i -h localhost -p 5432 -U postgres -F c -b -f “C:\Documents and Settings\Cleiton\Desktop\teste.backup” jsacteste”);

BufferedInputStream buffer = new BufferedInputStream(p.getInputStream());
BufferedReader commandResult = new BufferedReader(new InputStreamReader(buffer));

StringBuffer newData = new StringBuffer(10000);
String s = "";
while (null != ((s = commandResult.readLine()))) {
    newData.append(s + "\n");
}
commandResult.close();
String texto = newData.toString();
if (texto.equals("")) {
    System.out.println("nada");
} else {
    System.out.println(texto);
}

} catch (IOException ex) {
ex.printStackTrace();
}[/code]
Não sei se essa é a maneira correta de se obter as mensagens do pg_dump…

Alguem tem alguma idéia ???

é, a mensagem de erro eu consigo obter, só faltaria mesmo as mensagens do -v(modo verboso) pra ficar mais legalzinho, mas com esse parametro o programa java fica travado…

Fui fazer um teste com o pg_restore e adivinha, tbem ficou travado, dai tirei o parametro -v(modo verboso), mas não adiantou, continuou travando…

Runtime.getRuntime().exec("D:\\PROGRAMAS\\PostgreSQL\\8.3\\bin\\pg_restore.exe -i -h localhost -p 5432 -U postgres -d jsacteste \"C:\\Documents and Settings\\Cleiton\\Desktop\\teste.backup\"");

E na linha de comando este comando funciona…
Alguem tem alguma idéia pra fazer com que este comando não trave o meu programa ??

Cara já passei por algo parecido mas faz um tempo que não uso esse código, talvez possa te ajudar…

	private static void dumpDataBase() throws Exception
	{
		String dirDumper = properties.getProperty("dir.dumpers");
		String dirArqBkp = dirBKP.replaceAll("/", "//") + "/dump_fortesrh_" + hoje + ".sql";

		lf.addLine("Verificando Sistema Operacional");
		if(System.getProperty("os.name").toLowerCase().contains(LINUX))
		{
			lf.addLine("Sistema Operacional verificado: " + LINUX);
			lf.addLine("Efetuando Backup da Base de Dados.");
			Runtime.getRuntime().exec("sh " + dirDumper + "/dumper.sh " + dirArqBkp);
			lf.addLine("Backup efetuado: " + dirArqBkp);
		}
		else if(System.getProperty("os.name").toLowerCase().contains(WINDOWS))
		{
			lf.addLine("Sistema Operacional verificado: " + WINDOWS);
			lf.addLine("Efetuando Backup da Base de Dados.");
			if (FileUtil.exists(dirDumper))
			{
				Runtime.getRuntime().exec(dirDumper + "/dumper.bat \"" + properties.getProperty("dir.pg_dump") + dirArqBkp);
				lf.addLine("Backup efetuado: " + dirArqBkp);
			}
			else
			{
				lf.addLine("ERRO: Exec. para Backup do BD não localizado: " + dirDumper);
				throw new Exception("Exec. para Backup do BD não localizado: " + dirDumper);
			}
		}
		else
		{
			lf.addLine("ERRO: Sistema Operacional não suportado.");
			throw new Exception("Sistema Operacional não suportado");
		}
	}

opa barroso…

vlw ai a resposta, acho q vou acabar implementando verificação de SO tbem… Intaum, o pg_dump na verdade eu ja consegui fazer o jeito que eu queria, o problema mesmo é o pg_restore que não consigo obter o código de saída dele, pra informar o usuario se deu certo ou nao…