[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!!!
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!