Artigos
Delphi
Desenvolvendo um utilitário de Backup e Restore para banco de dados Interbase
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.