Backup

Prezado(a) colega,

Estou querendo implementar em meu sisteminha uma rotina de backup. Já procurei exemplo e ajuda aqui no fórum mas não encontrei. Gostaria de uma ajuda sua com algum exemplo para que eu possa estudar e implementar em meu sisteminha. Quero de toda forma implementar mesmo, ou seja; estudar, modificar, fazer de maneira diferencianda aperfeiçoando. Ficarei muito grato,

Edson

Olá colega!

Vc quer “backupear” o que? a base de seu sistema? arquivos gerados por seu sistema? Se for arquivos basta vc trabalhar com classes de arquivos (File, FileInputStream,etc) para manipular copias (já que vc quer desenvover tudo). Deve existir classe que jah faz isso (com compactação e tudo). Se for backup da base vc pode programar em seu servidor de BD o backup ou programar alguma outra coisa (copiar todos os registros para arquivo, para outra base…) com codigos em Java.

Att,

Prezado Leo,

Isso mesmo, voce disse tudo. O que eu quero é principalmente para o banco de dados. Eu gostaria de um exemplo de fazer isso em java, pelo jeto, da forma que voce sugeriu, só que não sei fazer isso.
Quero criar uma classe com os procedimentos para fazer o backup do banco de dados, inclusive até, se for o caso, quando eu for executar a rotina, eu puder ter a opção de escolher o local para armazenar o arquivo backupiado.

Atenciosamente,

Edson

Caro Edson,

Pelo que entendi então vc quer gerar um backup (.sql) com a estrutura e os dados de sua base. Eu nunca fiz isso, logo não tenho certeza de como fazer. Mas se eu fosse fazer eu teria duas opções:

Opção mais certa: Verificar se api de conexão com o banco não me oferece este recurso. Dando uma rápida pesquisada no google nos termos “procedure backup sql java” apareceu este link da ibm que tem um codigo-exemplo de atualização online: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.sample.doc/doc/java_jdbc/s-AdmCmdOnlineBackup-java.htm
Eu não testei o código mas parece que é o que vc quer.

Opção Mais grosseira: Fazer um select geral de cada tabela e inserir num arquivo (a sua escolha). Isso só vai vai ser 100% um backup pq não guardará a estrutura da tabela.

Bom, Testa aí e me fala.
Att,

Prezado Leo,

Apenas ilustrando o que eu gostaria de ver numa rotina de backup; por exemplo: eu chamo a rotina de backup, ela localiza o banco de dados e gera um localizador de direório como no exemplo abaixo onde eu irei gravar o backup. Como é que eu faço isso?? veja o exemplo:

Não estou conseguindo inserir a imagem mas ela é gerada, me parece que é pelo objeto choser… Resumindo… gostaria de saber como funciona isso…

Grato,

Edson[/img]

Não sei se é esta sua dúvida, mas pelo JFileChooser pode se abrir uma janela daquela em que a gente escolhe um arquivo/diretorio surgindo ai um ponteiro pro local. Daí podemos criar/abrir arquivos /diretorios. Tem um exemplo abaixo (o mesmo que tem na documentação http://java.sun.com/javase/6/docs/api/):

JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "JPG & GIF Images", "jpg", "gif"); chooser.setFileFilter(filter); int returnVal = chooser.showOpenDialog(parent); if(returnVal == JFileChooser.APPROVE_OPTION) { System.out.println("You chose to open this file: " + chooser.getSelectedFile().getName()); }

Aí ele abre uma janela para se escolher um tipo de arquivo especifico. Acredito que por ae tb se consiga abrir um diretorio, para que vc possa escolher o local do seu backup.

Att ,

Prezado Leo,

É isso mesmo que voce entendeu ou seja; eu quero ter uma janela onde eu possa procurar dentro de diretórios, os arquivos para os quais eu quero fazer o backup. Em outro momento, procurar desta mesma forma, o lugar onde eu vou gravar o backup. Agora, o que eu tenho que fazer, é completar o código com estes procedimentos. Ainda não sei mas desde já vou começar a tentativa. Já me ajudou muito mesmo!!

Fico muito agradecido,

Edson Amorim

brother, to querendo fazer a mesma coisa.
seu BD é MY SQL ??
se for eu acho q tem um jeito mais fácil pra implementar.
Gerando dump do mysql.
1º baixa o programa.

String host,user,pw; 
............. 
............ 
File test=new File("c:test00.sql"); 
FileWriter fw=null; 
try { 
fw = new FileWriter(test); 
} 
catch (IOException ex) { 
} 
try{ 
Process child = rt.exec("mysqldump -h"+host+" -u"+user+" -p"+pw+" dump_test"); 

InputStream in = child.getInputStream(); 
InputStreamReader xx = new InputStreamReader(in,"latin1"); 
char[] chars=new char[1024]; 
int ibyte=0; 
while((ibyte=xx.read(chars))>0) 
{ 
fw.write(chars); 
} 
fw.close(); 

Hi, 

I am trying to perform a database backup using mysqldump through a java servlet, but it is not working... All suggestions greatly appreciated, as i need this done yesterday! 



try{ 
String line; 
String name = "portiadb"; 
String[] cmd2={"mysqldump", "--opt","portiadb"}; 
Process p=Runtime.getRuntime().exec(cmd2); 
p.waitFor(); 
DataInputStream input = new DataInputStream(p.getInputStream()); 

Vector theBytes = new Vector(500); // It will probably be far more 
boolean keepOn = true; 
while(keepOn) { 
byte b = input.readByte(); 
if(b == -1) 
keepOn = false; 
else 
theBytes.add(b); 
} 

theBytes.trimToSize(); 
byte [] output = new byte[theBytes.size()]; 
for(int i = 0; i < output.length; i++) { 
output[i] = theBytes.elementAt(i); 
} 

System.out.println(output); 
// It will be more useful to create a FileOutputStream, and write 'output' to the file. 

input.close(); 
} 
catch (Exception err) { 
err.printStackTrace(); 
out.println(err); 

}

não testei o código, mas vou testar hoje.
se puder faça o mesmo, heheh

Prezados colegas,

Estou quase conseguindo. Peguei as orientações de nosso amigo Cristiano através do codigo postado por ele acima mas ainda não consegui faze-lo funcionar; continuo insistindo e estou tentando implementar a sugestão de nosso outro colega, o Leo. Peguei um exemplo do filechoser mas não estou conseguindo é fazer a cópia do arquivo selecionado pelo filechoser, para o diretorio que determinei. Veja se é possivel me darem esta ajuda!!

Vejam o meu código:

// Este exemplo mostra como exibir um JFileChooser
// e escolher um arquivo a partir de uma aplicação
// console

import javax.swing.*;
import java.io.*;

public class EstudosFileChoser{
    public static void main(String[] args) {
        final JFileChooser fc = new JFileChooser();
        int res = fc.showOpenDialog(null);
        
        if(res == JFileChooser.APPROVE_OPTION){
          File arquivo = fc.getSelectedFile();  
          System.out.println("Voce escolheu o arquivo: " + arquivo.getName());
          	try{
            	File arquivo1 = new File("arquivo.getName()"); //File("C:\\java\\arquivo.getName()");
        		File arquivo2 = new File("C:\\java\\Meus_testes\\Exemplo2.java"); //Copiei para o diretorio
            	copiar(arquivo1, arquivo2);
            	System.out.println("O arquivo1 foi copiado para o arquivo2");
        	   }
            catch(IOException e)
            {
            // pode ocorrer erros
        	}

        }
        else
          System.out.println("Voce nao selecionou nenhum arquivo.");
    }
    
      	static void copiar(File fonte, File destino) throws IOException{
        InputStream in = new FileInputStream(fonte);
        OutputStream out = new FileOutputStream(destino);
    
        byte[] buf = new byte[1024];
        int len;
        while((len = in.read(buf)) > 0){
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    }

}

Atenciosamente,

Edson

Caríssimos,

Quebrando cabeça daquí, dalí e com a grande ajuda de voces eu já consegui fazer parte da rotina funcionar.

Preciso agroa faz-la funcionar a partir da chamada dela por um item de menu. Fiz o procedimento corretamente porém, quando eu clico no menu para carregar esta rotina, não aparece nada, ela não carrega mas também não dá nenhuma mensagem.

Se eu executar ela sozinha, tudo funciona certinho.

O que pode estar acontecendo?

Atenciosamente,

Edson

Edson

Tenho uma classe que é muito interessante, poís é possível vc determinar o colcar onde vc criar seu backup.

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;

/**

  • @author Ricardo Azevedo

*/
public class MyExec{
public static final int TAM_BUF = 4096;
public static final String COMMAND_LINE = "mysqldump -uroot -plalala --opt teste ";
public static final String TMP_DIR = “D://mysql//Bkps”;
public static final String SENHA = “lalalla”;
public static String data = new SimpleDateFormat(“yyyy-MM-dd_h-mm_a”).format(new Date());
public MyExec() {
super();
}

public static void main(String[] args) {
	MyExec my = new MyExec();
	
	my.run();
}

public void run()
{
	boolean result = true;
	try {  
		Process processReturn = Runtime.getRuntime().exec(COMMAND_LINE);
		if(processReturn != null){
			BufferedOutputStream bo = new BufferedOutputStream(processReturn.getOutputStream());
			bo.write(SENHA.getBytes());
			bo.close();
		}
		
		InputStream in = processReturn.getInputStream();
        if(in != null){
        	String arqResult = this.buildResult(in, "bkpTeste_"+data, new File(TMP_DIR).getAbsolutePath());
        	
        	if(result){
        		System.out.println("Backup executado com sucesso em " + arqResult);
        	}else{
        		System.out.println("Backup::executado com erro ! Resultado em arquivo "+arqResult);
        	}
        }      
		
	} catch (IOException e) {
		System.out.println("MyExec::run:exception "+e.toString());
	}
}  

public String buildResult(InputStream in, String nomeParcial, String tempDir)
{
	File flOut = null;
	BufferedWriter bw = null;
	BufferedReader br = null;
	char buff[] = new char[TAM_BUF];
	try {			
		flOut = File.createTempFile(nomeParcial, ".dmp", new File(tempDir));			
		bw = new BufferedWriter(new FileWriter(flOut));
		br = new BufferedReader(new InputStreamReader(in));
		int c;
		do{
			c = br.read(buff);
			if(c > 0){
				bw.write(buff,0,c);
			}
		}while(c > 0);
	} catch (Exception e) {
		System.out.println("MyExec::buildResult:exception "+e.toString());
	}
	finally{
		try {
			if(bw != null)
				bw.close();
			if(br != null)
				br.close();
		} catch (Exception e) {
			System.out.println("MyExec::buildResult:(close)exception "+e.toString());
		}
	}
	return(flOut.getAbsolutePath());
}

}

Espero ter ajudado

Ricardo Azevedo

Prezado Ricardo,

Achei muito interessante mesmo a sua classe. Vou adapta-la a minha necessidade que neste caso, estou usando o banco Access. Voce sabe como é que eu implemento esta modificação?

Atenciosamente,

Edson