Boa noite pessoas.
Já estou a 1 dia tentando achar uma solução para a criação de rotina de backup e restauração pelo Java mas, não consigo. Não sou de abrir tópico mas, não consegui achar nada na internet.
Estou realizando a criação do arquivo de backup pelo código abaixo:
public String geraBackup(String sCaminhoDiretorio, String sData){
String sMensagem = "";
Runtime r = Runtime.getRuntime();
try{
Process p = r.exec(System.getProperty("user.dir")+"/lib/pg_dump -c -b --column-inserts -E utf8 -h localhost -p 5432 -U postgres -F t -i -v -f "+sCaminhoDiretorio+"/"+sData+".tar controdoc");
if(p != null){
OutputStream outputStream = p.getOutputStream();
outputStream.write("SENHA".getBytes());
outputStream.flush();
outputStream.close();
InputStreamReader streamReader = new InputStreamReader( p.getErrorStream() );
BufferedReader reader = new BufferedReader( streamReader );
String linha;
while( (linha = reader.readLine()) != null ){
System.out.println(linha);
}
}
} catch(IOException ioe){
ioe.printStackTrace();
sMensagem = ioe.getMessage();
}
return sMensagem;
}
O arquivo é gerado de forma correta porém, não consigo restaurar esse backup. Já usei vários tipos de restore, com várias opções. Alguns dão erro de “Broken Pipe” (pelo fato de algumas combinações de comandos não estarem de forma correta). Nos restore que deram certo, para testar se o mesmo está mesmo realizando o backup fiz o seguinte teste:
01 - Fiz o backup e o arquivo foi gerado e salvo;
02 - Alterei um registro no programa. Ex.: estava com nome de “Daniel” e coloquei “Daniel TESTE TESTE TESTE”;
03 - Fiz o restore do arquivo gerado anteriormente e esse registro que eu alterei, deveria estar da mesma forma antes (Daniel) mas o mesmo não retornou na forma original, ficando como “Daniel TESTE TESTE TESTE”
Peço, por gentileza, para verificarem se o pg_dump (as opções dele) estão corretas (preciso gerar um backup completo…tabelas, dados, etc…) e se estiver, qual o pg_restore eu devo proceder.
Esse pg_dump está em formato “tar” mas, já fiz o teste em formato “text” alterando o Process para:
Mesmo com essa alteração, continuo com a pendência.
Obs.: estou utilizando o MacbookPro para desenvolvimento e o programa roda em Windows na empresa. Ambos estão com o banco PostgreSQL instalados.
Boa tarde!
Não querendo ser chato mas, se alguém tiver alguma ideia, por gentileza, favor postar!
Att.
Bom dia!
Alguém teria alguma ideia?
Bom dia!
Novamente, alguém teria alguma idéia? Se tiver algum exemplo que deu certo, por favor, postar para eu fazer testes e quando resolver, eu coloco a resolução do problema.
dia desses precisei dessa rotina também, e foi demorado encontrar uma solução clara e funcional para backup e restore no PostgreSQL
O código abaixo funciona perfeitamente no Windows (ainda não testei no Linux)
public class Postgre_backup {
static String BD_NAME = "nomeDoBanco";
public static void main(String[] args) {
// TODO code application logic here
doBackup();
doRestore();
}
//FAZ O BACKUP
public static void doBackup(){
try{
ProcessBuilder pb;
Process p;
pb = new ProcessBuilder("C:/Program Files/PostgreSQL/9.1/bin/pg_dump.exe ", "-i", "-h", "localhost", "-p", "5432","-U", "postgres", "-F", "c", "-b", "-v" ,"-f", "C:\\Users\\rafael\\Desktop\\BKP.backup", BD_NAME);
pb.environment().put("PGPASSWORD", "seuPassword");
pb.redirectErrorStream(true);
p = pb.start();
}catch(Exception ex){
JOptionPane.showMessageDialog(null, ex);
}
}
//FAZ O RESTORE
public static void doRestore(){
try{
ProcessBuilder pb;
Process p;
pb = new ProcessBuilder("C:/Program Files/PostgreSQL/9.1/bin/pg_restore.exe ", "-i", "-h", "localhost", "-p", "5432","-U", "postgres", "-d" ,BD_NAME, "-v", "C:\\Users\\rafael\\Desktop\\BKP.backup");
pb.environment().put("PGPASSWORD", "seuPassword");
pb.redirectErrorStream(true);
p = pb.start();
}catch(Exception ex){
JOptionPane.showMessageDialog(null, ex);
}
}
}
Finalmente!!!
Rafael Nascimento, obrigado pelo Post!
Vou testar o código e se der certo te aviso.
Estou utilizando o Eclipse e o PostGree pelo MacBook. Se der certo, te aviso e ai agente sabe que o código funciona em Windows e Mac!
Abraços!
At.
Daniel
Tarde pessoas.
Finalmente, depois de tanto tempo consegui realizar a rotina de forma correta.
Segue os códigos abaixo:
public void geraBackup(){
try {
List<String> comandos = new ArrayList<String>();
comandos.add("\"C:\\Arquivos de programas\\PostgreSQL\\9.1\\bin\\pg_dump.exe\""); //Caminho aonde encontra o comando pg_dump
comandos.add("-i");
comandos.add("-h");
comandos.add("localhost"); //Caminho do Banco de Dados
comandos.add("-p");
comandos.add("5432"); //Porta do Banco de Dados
comandos.add("-U");
comandos.add("postgres"); //Username
comandos.add("-F");
comandos.add("t");
comandos.add("-b");
comandos.add("-v");
comandos.add("-f");
comandos.add(("\"C:\\backup.tar\""); //Diretório e nome do arquivo que será gravado o Backup
comandos.add("nomedobanco"); //Nome do Banco de Dados
ProcessBuilder pb = new ProcessBuilder(comandos);
pb.environment().put("PGPASSWORD", "senha"); //Senha do Banco de Dados
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();
}
return sMensagem;
}
public void restaurarBackup(){
try {
List<String> comandos = new ArrayList<String>();
comandos.add("\"C:\\Arquivos de programas\\PostgreSQL\\9.1\\bin\\pg_restore.exe\""); //Caminho aonde encontra o comando pg_restore
comandos.add("-c");
comandos.add("-d");
comandos.add("nomedobanco"); //Nome do Banco de Dados
comandos.add("-F");
comandos.add("t");
comandos.add("-v");
comandos.add("-h");
comandos.add("localhost"); //Caminho do Banco de Dados
comandos.add("-p");
comandos.add("5432"); //Porta do Banco de Dados
comandos.add("-U");
comandos.add("postgres"); //Username
comandos.add(("\"C:\\backup.tar\""); //Diretório e nome do arquivo que será restaurado
ProcessBuilder pb = new ProcessBuilder(comandos);
pb.environment().put("PGPASSWORD", "senha"); //Senha do Banco de Dados
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();
}
}
Os dois métodos deram certos no Windows e no Mac porém, no Mac, os caminhos do arquivo pg_dump e pg_restore são diferentes e também para salvar o arquivo por usar a estrutura diferente do Windows.
Da forma que está, o método copia toda a estrutura do banco e as informações das tabelas e restaura depois completo.
Fiz um teste da seguinte forma:
- Realizei o Backup;
- Alterei vários registros das tabelas;
- Realizei o Restore e verifiquei que os registros alterados após o Backup foram modificados para o registro original, antes do Backup.
Se alguém precisar do método correto para Mac, só pedir aqui q eu passo novamente. Deixei apenas do Windows pois é o mais utilizado e para o Mac é apenas inverter as barras deixando apenas 1 barra ao invés de duas (por isso q eu adoro o Mac, não tem frescura q nem do Windows).
Valeu Rafael nascimento pela força!
Falowwww!!