Desenvolvendo um utilitário de Backup e Restore para banco de dados Interbase

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (5)  (0)

Olá a todos. Dando continuidade à construção de utilitários para banco de dados Interbase, neste artigo estarei mostrando o desenvolvimento de um aplicativo que usamos na Empresa onde trabalho, para execução de duas atividades importantes: backup e restore.

Introdução
As atividades de backup e restore fazem-se necessárias quando o assunto é manter a integridade de um banco de dados.  Abaixo, alguns dos benefícios que se pode conseguir através delas:
  • Melhora o desempenho da base de dados executando a coleta de lixo dos registros desnecessários;
  • Faz o re-balanceamento dos índices das tabelas;
  • Reorganiza o espaço ocupado por registros deletados, reduzindo o tamanho da base de dados;
  • Permite mudar a parte estrutural do banco, como por exemplo, manipular o seu tamanho de página.
Desenvolvimento do aplicativo utilitário
Apesar de podermos realizar tanto o backup quanto o restore por linha de comando, através do gbak (utlitário que acompanha o Interbase e Firebird), é muito mais intuitivo manipularmos algo visual. Para tanto, vamos criar o nosso aplicativo que fará as mesmas atividades do gbak, porém, de uma maneira muito mais fácil de se trabalhar. Para o desenvolvimento, estaremos usando o Delphi 2007.
 
comand line simples para backup:
gbak -backup -v -user -password banco_de_dados arquivo_de_backup
 
comand line simples para restore:
gbak -create -v -user -password arquivo_de_backup banco_restaurado
 
Com a IDE aberta, inicie uma nova aplicação (menu File->New->Vcl Forms Application) e monte um layout conforme a figura abaixo:
 
 
Lista de componentes usados:
1 pagecontrol: paleta win32
1 IBBackupService1: paleta Interbase Admin
1 IBRestoreService1: paleta Interbase Admin
 
Perceba que nosso aplicativo irá ter 3 partes: Backup, Restore e Configurações.
 
Backup
Para parte destinada ao backup, monte o visual da seguinte forma:
 
 
Lista de componentes usados:
3 GroupBox: paleta Standard
2 Labels: paleta Standard
2 Edits: paleta Standard (edtBackupDatabaseName, edtBackupFile)
7 CheckBox: paleta Standard (cbxIgnoreChecksums, cbxNoGarbageCollection, cbxNonTransportable, cbxIgnoreLimbo, cbxOldMetadataDesc, cbxMetadataOnly, cbxConvertExtTables)
1 Memo: paleta Standard (memBackup)
 
Restore
Para parte destinada ao restore, monte o layout semelhante a:
 
 
Lista de componentes usados:
3 GroupBox: paleta Standard
2 Labels: paleta Standard
2 Edits: paleta Standard (edtRestoreBackupFile, edtRestoreDatabaseName)
8 CheckBox: paleta Standard (cbxReplace, cbxCreateNewDB, cbxUseAllSpace, cbxOneRelationAtATime, cbxDeactivateIndexes, cbxNoValidityCheck, cbxValidationCheck, cbxNoShadow)
1 Memo: paleta Standard (memRestore)
 
Configurações
Para finalizar a parte visual de nosso utilitário, monte a parte de Configurações da seguinte forma:
 
 
Lista de componentes usados:
3 GroupBox: paleta Standard
4 Labels: paleta Standard
3 Edits: paleta Standard (edtUsuario, edtSenha, edtServerName)
1 SpinEdit: paleta Samples (spePageSize)
1 RadioGroup: paleta Standard (rgpProtocol)
 
Funcionalidades
Vamos agora implementar a parte mais importante do nosso aplicativo, que são as rotinas de Backup e Restore. Para tal, codifique conforme abaixo o evento OnClick dos botões "Backup" e "Restore":
 
procedure TForm1.btnBackupClick(Sender: TObject);
begin
  //muda para a página de Backup
  PageControl1.ActivePage:= tbsBackup;
 
  Screen.Cursor:= CrHourGlass;
  memBackup.Lines.Clear;
  with IBbackupService1 do
  begin
    //Define o nome do servidor do banco de dados
    ServerName:= edtServerName.Text;
 
    //Define o protocolo da rede
    case rgpProtocol.ItemIndex of
      0: Protocol:= TCP;
      1: Protocol:= Local;
    end;
 
    //Configura os parâmetros do Backup
    LoginPrompt:= False;
    Params.Clear;
    Params.Values['user_name']:= edtUsuario.Text;
    Params.Values['password']:= edtSenha.Text;
   
    //Ativa verbose para mostrar informações do processo de backup
    Verbose := True;
 
    //Configura as opções de Backup
    Options:= [];
    if cbxNonTransportable.Checked then
      Options:= Options + [NonTransportable];
    if cbxIgnoreLimbo.Checked then
      Options:= Options + [IgnoreLimbo];
    if cbxMetadataOnly.Checked then
      Options:= Options + [MetadataOnly];
    if cbxNoGarbageCollection.Checked then
      Options:= Options + [NoGarbageCollection];
    if cbxIgnoreChecksums.Checked then
      Options:= Options + [IgnoreChecksums];
    if cbxOldMetadataDesc.Checked then
      Options:= Options + [OldMetadataDesc];
    if cbxConvertExtTables.Checked then
      Options:= Options + [ConvertExtTables];
 
    //Configura as propriedades de Backup 
    DatabaseName:= edtBackupDatabaseName.Text;
    BackupFile.Clear;
    BackupFile.Add(edtBackupFile.Text);
    try
      try
        Active:= True;
 
        //Inicia a operação
        ServiceStart;
 
        //Lista os processo no Memo
        while not Eof do
          memBackup.Lines.Add(GetNextLine);
      except
        on e: exception do
        begin
          memBackup.Lines.Add('Erro: ' + e.Message);
        end;
      end;
    finally
      Active:= False;
      Screen.Cursor:= CrDefault;
    end;
  end;
end;
 
procedure TForm1.btnRestoreClick(Sender: TObject);
begin
  //muda para a página de Restore
  PageControl1.ActivePage:= tbsRestore;
 
  Screen.Cursor:= CrHourGlass;
  memRestore.Clear;
  with IBRestoreService1 do
  begin
    //Define o nome do servidor do banco de dados
    ServerName:= edtServerName.Text;
 
    //Define o protocolo da rede
    case rgpProtocol.ItemIndex of
      0: Protocol:= TCP;
      1: Protocol:= Local;
    end;
 
    //Configura os parâmetros do Restore
    LoginPrompt:= False;
    Params.Clear;
    Params.Values['user_name']:= edtUsuario.Text;
    Params.Values['password']:= edtSenha.Text;
 
    //Ativa verbose para mostrar informações do processo de backup
    Verbose:= True;
 
    //Configura as opções de Restore
    Options:= [];
    if cbxReplace.Checked then
      Options:= Options + [Replace];
    if cbxCreateNewDB.Checked then
      Options:= Options + [CreateNewDB];
    if cbxUseAllSpace.Checked then
      Options:= Options + [UseAllSpace];
    if cbxValidationCheck.Checked then
      Options:= Options + [ValidationCheck];
    if cbxNoShadow.Checked then
      Options:= Options + [NoShadow];
    if cbxOneRelationAtATime.Checked then
      Options:= Options + [OneRelationAtATime];
    if cbxDeactivateIndexes.Checked then
      Options:= Options + [DeactivateIndexes];
    if cbxNoValidityCheck.Checked then
      Options:= Options + [NoValidityCheck];
 
    //Configura o tamanho de página 
    PageSize:= spePageSize.Value;
 
    //Configura as propriedades de Restore
    DatabaseName.Clear;
    DatabaseName.Add(edtRestoreDatabaseName.Text);
    BackupFile.Clear;
    BackupFile.Add(edtRestoreBackupFile.Text);
    try
      try
        Active:= True;
 
        //Inicia a operação
        ServiceStart;
 
        //Lista os processo no Memo
        while not Eof do
          memRestore.Lines.Add(GetNextLine);
      except
        on e: exception do
        begin
          memRestore.Lines.Add('Erro: ' + e.Message);
        end;
      end;
    finally
      Active:= False;
      Screen.Cursor:= CrDefault;
    end;
  end;
end;
 
Especificações
Você reparou que tanto para Backup quanto para Restore há várias opções de configuração do processo a ser executado. Abaixo segue uma pequena apresentação de cada uma delas:
 
Options - Backup
  • IgnoreChecksums: Ignora checksums
  • IgnoreLimbo: Ignora transações limbo
  • MetadataOnly: Gera um backup da parte de metadados. Suas tabelas estarão vazias
  • NoGarbageCollection: Não executa o "garbage collection" durante o processo
  • OldMetadataDesc: Gera metadado no formato pre-4.0
  • NonTransportable: Gerar backup no formato non-XDR
  • ConvertExtTables: Converte dados de tabela externa para tabelas internas

Options - Restore

  • DeactivateIndexes: Não interpreta os índices durante o restore
  • NoShadow: Não cria "shadow files" durante o processo
  • NoValidityCheck: Sem condições de validez
  • ValidationCheck: Inverso ao NoValidityCheck
  • OneRelationAtATime: Realiza um commit após o "restore" de cada tabela
  • Replace: Sobrescreve o banco de dados se este já existir
  • CreateNewDB: Restaura sem sobrescrever um banco de dados existente
  • UseAllSpace: Não reserva os 20% de espaço de cada "datapage"
Observação
Agora com todas as especificações explicadas e as rotinas principais comentadas no código fonte, basta você fazer os devidos testes e utilizar o aplicativo no seu dia-a-dia de manutenção do banco de dados Interbase. Lembrando que para cada ação (Backup ou Restore), o log de operações é listado no Memo de cada aba, dando a você a possibilidade de acompanhar o passo-a-passo das atividades, bem como os possívies erros.
 
Obrigado.
 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?