ClipaTec Informática

Receba novidades por e-mail. Digite seu e-mail abaixo e clique no botão "Cadastrar"

Delivered by FeedBurner

6 de outubro de 2016

Backup da base de dados com Delphi e FireDac

backup delphi firedac

Olá terrestres. Neste artigo, vamos montar um esquema de backup de uma base de dados FireBird.
Backup sempre foi uma preocupação tanto da parte do desenvolvedor, quanto da parte do usuário.
Claro que nem sempre o usuário se preocupa em fazer backup, mas sempre o sistema é o culpado, se um dia, o banco corromper, não é verdade?
Então, vamos aprender como implementar um recurso de backup, simples, usando o FireDac.
Existem diversas maneiras. Alguns preferem usar o aplicativo WinRar, para este função, no qual, simplesmente, gera um arquivo compactado com o banco de dados. Outros somente fazem uma cópia da base de dados para um determinado local. E outros, geram o arquivo de backup que os próprios SGBDs oferecem. No caso do FireBird, o famoso "FBK".
Neste exemplo, trabalharemos com a geração do arquivo "FBK" que o próprio FireBird oferece, usando alguns componentes da paleta FireDac.
Com base neste exemplo, você poderá incrementar mais recursos, como por exemplo, opção de compactar, agendamentos, etc.
Crie um novo projeto em Delphi e adicione os componentes: FDIBBackup, FDPhysFBDriverLink, FDGUIxWaitCursor, Memo (name = mmoProgresso) e dois Button (name btnIniciar, btnFechar).
Selecione o componente FDIBBackup e ligue na propriedade "DriverLink" o componente FDPhysFBDriverLink.
Tente montar um layout parecido com este:
backup delphi firedac

Obs: o componente ImageList (imgs16x16) está sendo utilizado apenas como repositório das imagens que estão sendo usadas nos botões.
Agora, vamos para as implementações. Declare os seguintes métodos na seção "Private" do formulário:
backup delphi firedac

Vamos implementar primeiro o método "HabilitarBotoes", segue a implementação:
backup delphi firedac

A única coisa que fazemos neste método, é atribuir para a propriedade "Enabled" dos botões o parâmetro da função, que por padrão é "True" conforme especificamos na declaração do método.
Este método será útil quando for iniciado o processo do backup, desabilitaremos os botões, e só habilitaremos novamente, no final do processo, ou caso, der erro e o processo não for concluído.
Agora, vamos implementar o método "GerarBackup". Segue implementação:
backup delphi firedac

Neste método, toda implementação ficará dentro de um bloco de tratamento (try...except), caso ocorrer algum erro durante o processo, simplesmente emitiremos uma mensagem para o usuário.
No início do método, desabilitamos os botões, conforme dito anteriormente.
Alimentamos as propriedades do componente FDIBBackup, que dispensa comentários, visto que, na imagem acima, já está explicando o que significa cada propriedade.
Após chamar o método "Backup" do componente, o processo verdadeiramente se inicia. Se ocorrer tudo bem, uma mensagem é exibida para o usuário, informando que deu tudo certo, e em seguida, volta habilitar os botões. Como por padrão definimos no método "HabilitarBotoes" que seu valor é "True", por este motivo, não passamos nenhum valor para o parâmetro neste ponto do método.
Se por acaso, ocorrer algum erro, o método entrará no bloco de exceção, onde habilitamos os botões e mandamos uma mensagem de erro para o usuário, inclusive, com a mensagem capturada pela classe de exceção do bloco "Try...except".
Simples, prático e objetivo. Desta forma, temos o nosso backup, pronto, implementado. Porém, seria interessante, acompanharmos o processo não?
É exatamente por isso que colocamos um "memo" no projeto. Ele mostrará cada processo realizado.
Para isso, selecione o "memo" e na propriedade "ScrollBars", selecione a opção "ssVertical".
Legal, agora, vá até o evento "OnProgress" do componente "FDIBBackup" e implemente-o da seguinte forma:
backup delphi firedac

A única coisa que fazemos é adicionar no "memo", as linhas de mensagens retornadas pelo serviço de backup do banco. Desta forma, conseguiremos visualizar o processo que está sendo realizado.
Ufa, chegamos ao fim deste artigo, ficou um tanto massante, porém, não tem como ficar com dúvida né? Mas se tiver dúvida, deixe seu comentário que ajudaremos com todo prazer.
Muito bem, agora basta chamar o método no botão. Para isso, de um duplo clique sobre o botão "Iniciar" e chame o método "GerarBackup", e no botão "Fechar", chame o comando "Close", conforme mostra a imagem:
backup delphi firedac

Muito bem gente, algumas dicas que você pode incrementar, é que antes de começão o processo, você pode adicionar uma linha ao "memo" informando que o processo de backup está iniciando, e no final, outra linha informando que o backup foi concluído com sucesso, ou com o erro. Isso poderia substituir as mensagens que exibimos. Também é interessante trabalhar em cima do nome do arquivo de backup, colocando data e hora por exemplo. Fica a critério. Vocês são livres para personalizar da maneira que lhe convém. Abraços e até o próximo.

Download

- Download do código fonte do projeto;

(Por ClipaTec Informática)

38 comments:

  1. É possível construir as modificações para o bd MySQL?

    ResponderExcluir
    Respostas
    1. Sim. Só que você teria que trocar o componente "FDPhysFBDriverLink" pelo "FDPhysMySQLDriverLink". Abraço.

      Excluir
  2. Como poderia substituir o memo por um TGauge?

    ResponderExcluir
    Respostas
    1. Cremos que sim rsrsrs, só que não temos uma solução para isso ainda. Mas vamos procurar, e postaremos se encontrarmos. Abraço.

      Excluir
  3. Ola, tudo bem? Para usar o MySQL, tentei fazer o q vcs sugeriram: "Sim. Só que você teria que trocar o componente "FDPhysFBDriverLink" pelo "FDPhysMySQLDriverLink". Abraço." porém não deu certo... APontei o DriverLink para este do MySQL mas diz que é Incompatível. Busquei no google e não achei nada a respeito. Obrigado.

    ResponderExcluir
    Respostas
    1. Certo. Você tem o MySQL instalado? Vamos fazer um teste aqui também e postaremos o resultado. Abraço.

      Excluir
  4. Ola. Quer dizer se tenho instalado no PC? Sim, mas seria o acesso a uma base MySQL online... O estranho é que o DriverLink não permite o apontamento para o componente FDPhysMySQLDriverLink. O pior é que na Web não encontro nada sobre isso...

    ResponderExcluir
  5. Olá, quais são os componentes para quem usa o SQL Server?

    ResponderExcluir
    Respostas
    1. Ao invés de usar o componente "FDPhysFBDriverLink", use o "FDPhysMSSQLDriverLink", que é referente ao driver do SQL Server. Abraço.

      Excluir
  6. Desculpe, Mas acredito que você não tenha testado o comando com o Mysql.
    Pois os componentes de backup disponibilizados pelo Firedac não são compatíveis com o Mysql.

    Em nenhum dos componentes de backup reconhece o link do Mysql.

    Se alguém conseguiu me passa como pois nos meus testes não tive sucesso.

    ResponderExcluir
    Respostas
    1. Não fizemos testes com o MySQL, porque trabalhamos com o FireBird, mas vamos tentar fazer alguns testes. Abraço.

      Excluir
  7. Fiz o teste aqui e deu certo. O único probleminha é que eu faço o back-up a partir de um terminal e quero que o arquivo de back-up fique no terminal. Mas, está sendo gerado lá no servidor. Alguém já passou por isso? Se alguém souber o problema, me dá um toque. Obrigado!

    ResponderExcluir
  8. Fiz o teste aqui e deu certo. O único probleminha é que eu faço o back-up a partir de um terminal e quero que o arquivo de back-up fique no terminal. Mas, está sendo gerado lá no servidor. Alguém já passou por isso? Se alguém souber o problema, me dá um toque. Obrigado!

    ResponderExcluir
  9. No caso sua função está implementada no servidor e você apenas a chama pelo client?

    ResponderExcluir
  10. Respostas
    1. Bom dia amigo, segue o link: http://www.clipatecinformatica.com.br/2016/10/restore-base-dados-delphi-firedac.html

      Excluir
  11. Este comentário foi removido pelo autor.

    ResponderExcluir
  12. Na rede não funcionou...

    FDIBBackup1.Host := '192.168.25.178'; // local do servidor da base de dados
    FDIBBackup1.Protocol := ipTCPIP; // protocolo de conexao com a base de dados

    e não consegue conectar... alguma solução ?

    ResponderExcluir
    Respostas
    1. Realmente não rede não funciona, dá erro como se o arquivo de destino não existisse...
      ---------------------------
      Debugger Exception Notification
      ---------------------------
      Project Sync.exe raised exception class EIBNativeException with message '[FireDAC][Phys][FB]cannot open backup file @1'.
      ---------------------------

      Excluir
    2. Bom dia, realmente na rede não está funcionando... Configurei o host, mudei para TCP/ip. Dá a mensagem: [FireDAC][Phys][FB]cannot open backup file @1. Teria alguma dica? Obrigado.

      Excluir
    3. Você está passando a extensão do arquivo juntamente com o nome?

      Excluir
  13. deu certo so que ele pega mesmo tamanho da base quando faz o bpk nao deveria ficar menor ?

    ResponderExcluir
    Respostas
    1. achei ele criava um arquivo menor ou tem fazer algo.. porque quando uso o Gbak fica bem menor

      Excluir
    2. ou estou faltando mudar algo no componente

      Excluir
    3. Vamos fazer alguns testes aqui pra verificar isso. Abraço.

      Excluir
  14. Caso dê erro para fazer o backup local... só mudar de ipTCPIP para ipLocal...
    Aconteceu comigo hehe.

    ResponderExcluir
  15. Quando faço o backup a primeira vez da certo, mas se eu manter o programa aberto e executar novamente da um "Access Violation". O que fazer?

    ResponderExcluir
    Respostas
    1. Olá Adailton, já vamos fazer alguns testes aqui e postaremos o resultado e como resolver este problema o mais rápido possível. Abraço.

      Excluir
  16. Quando executo a primeira vez funciona direitinho, mas se manter o programa aberto e tentar gerar novamente, da um erro de "Access Violation". Como resolver?

    ResponderExcluir
    Respostas
    1. Olá amigo, fizemos os testes, não tivemos ocorrência de "Access Violation" em nosso projeto, apenas estava ocorrendo o seguinte erro ao tentar pela segunda vez: "Multiple sources or destinations specified". Para resolver este segundo erro, basta adicionar antes desta linha "FDIBBackup1.BackupFiles.Add('c:\cadcliente.fbk');" a seguinte linha: "FDIBBackup1.BackupFiles.Clear;", desta forma, antes de adicionar o destino ele limpa o que já está lá.

      Excluir
    2. O seu projeto está igual ao nosso? Já tentou debugar para saber em qual linha ocorre este erro de AV?

      Excluir
  17. Tem com por uma ProgressBar ou Gauge para verificar o processo?

    ResponderExcluir
    Respostas
    1. Sim, é possível, essa implementação deve ser feita no evento "OnProgress".

      Excluir
  18. Boa noite ClipaTec Informática! que bom saber que ainda está na ativa.

    ResponderExcluir
  19. Minha dúvida é a seguinte criei o sistema de backup e tá funcionando tudo ok na maquina local, mas quando quero fazer backup do bd q está em um servidor linux, ele até faz o backup. porém não salva o arquivo .fbk. pode me ajudar?

    ResponderExcluir

Visite nossa página de Política de comentarios antes de comentar para ter certeza de que seu comentário não será excluído! Lembre-se, assim que aprovarmos o teu comentário ele será publicado, por isso, não deixe de sempre visitar nosso blog e conferir nossa resposta ao seu comentário, abraço!