Acesso direto ao conteúdo

Busca

Visite também: Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

 

Script de Backup para Banco de Dados Firebird

Colaboração: Genivaldo Rocha

Data de Publicação: 04 de Janeiro de 2009

Muitas vezes usuários, programadores são pegos de surpresa com corrompimento de bases de dados do Firebird (problemas elétricos, falhas de hardware, etc.). Após passar por alguns problemas em clientes, resolvi fazer um script para realizar um backup (manutenção) diário na base de dados do Firebird sob Linux. Estou compartilhando esta primeira versão. Espero que seja de ajuda para alguém.

  # !/bin/sh
  
  # bkfb versao 1.0
  #
  # Script de Backup para Banco de Dados FIREBIRD
  # Escrito por Genivaldo Rocha - gldarocha@yahoo.com.br
  # Sugestoes, criticas e elogios serao bem vindas pelo email.
  #
  # Este Script estah sob a GPL Licence (COPYLEFT);
  # Em: http://www.gnu.org/copyleft/copyleft.pt-br.html
  # ou: http://www.gnu.org/home.pt-br.html
  # ou: http://www.gnu.org/philosophy/philosophy.html
  #
  #
  
  
  #
  #       *** CONSIDERACOES **
  #
  # 1 - Verifique a disponibilidade de espaco em disco para o diretorio
  # onde serao criados os backups, pois este script - nesta versao "ainda"
  # nao apaga backups de dias anteriores. Este recurso fica para as proximas
  # versoes.
  # 2 - Na medida do possivel todo comando e saidas (resultados) serao
  # logados no arquivo $DIA-bkfb.log
  # 3 - Para as proximas versoes aceito sugestoes e ja estou trabalhando
  # nas seguintes melhorias:
  # 3a) Remocao das copias(backups) de "n" dias atras;
  # 3b) Envio do arquivo de LOG (compactado) por email para o administrador;
  # 3c) Envio de relatorio de erro por email para o administrador;
  # 3d) Possibilidade de quebrar o backup em varios arquivos *.fbk(*.gbk);
  # 3f) Opcao de gravar o backup em fita DAT "/dev/st0", DVD/CD ou poderah
  #     mandar os arquivos par um diretorio da rede;
  # 3g) Enviar o backup por ftp para outro servidor remoto.
  # 3h) ...;
  # 3i) ...;
  #
  #
  #
  
  
  #
  # Coloca mensagem no console avisando sobre o inicio mostrando
  # data e hora... bom pra saber o tempo do backup.
  echo ' '
  echo -n 'Processo de backup iniciado em: ' && date +%d/%m/%Y' - as '%H:%M
  echo 'Aguarde a mensagem de finalizacao... '
  echo ' '
  echo 'Nao interrompa este processo!'
  echo ' '
  echo ' '
  
  
  #
  # Definicao de variaveis
  # Alterar as variaveis conforme as configuracoes
  # do Firebird, da base de dados e da Distribuicao LINUX.
  #
  DIA=$(date +%Y%m%d)
  GB='/opt/firebird/bin/gbak'
  GF='/opt/firebird/bin/gfix'
  US='sysdba'
  PW='masterkey'
  PH='/dados/banco'
  DB='bd_provenco.fdb'
  BK='/bkp'
  LOG=$BK/$DIA'-bkfb.log'
  
  
  #
  # Inicio dos processos
  #
  echo '*****************************************************' >> $LOG
  echo '*** Script de backup para Bases de Dados FIREBIRD ***' >> $LOG
  echo '***                   Versao 1.0                  ***' >> $LOG
  echo '***             www.tecnoredes.com.br             ***' >> $LOG
  echo '***   Genivaldo Rocha - rocha@tecnoredes.com.br   ***' >> $LOG
  echo '***                      gldarocha@yahoo.com.br   ***' >> $LOG
  echo '*****************************************************' >> $LOG
  echo ' ' >> $LOG
  echo ' ' >> $LOG
  echo '*** Iniciando Backup ***' >> $LOG
  echo -n 'Data: ' >> $LOG && date +%d/%m/%Y-%H:%M:%S >> $LOG && echo ' ' >> $LOG
  
  
  #
  # Cria diretorio diario do backup da base de dados
  #
  echo 'Criando diretorio para o backup' >> $LOG
  mkdir $BK/$DIA
  echo 'Diretorio criado :  ' >> $LOG
  ls -la -ad $BK/$DIA >> $LOG
  echo 'Diretorio criado com sucesso!' >> $LOG && echo ' ' >> $LOG
  
  #
  # Shutdown na Base de Dados
  #
  echo 'Efetuando shutdown na base de dados' >> $LOG
  $GF -z >> $LOG 2>&1
  $GF -shut -force 0 -user $US -password $PW $PH/$DB >> $LOG 2>&1
  echo 'A Base de dados agora está OFFLINE...' >> $LOG && echo ' ' >> $LOG
  
  
  #
  # Copia a base de dados
  #
  echo 'Copiando a base de dados ' >> $LOG  && echo ' ' >> $LOG
  cp $PH/$DB $BK/$DIA/$DIA-base.fdb
  ls -la $BK/$DIA/$DIA-base.fdb >> $LOG && echo ' ' >> $LOG
  echo 'Base de dados copiada com sucesso!' >> $LOG
  echo 'Uma copia da base, por seguranca estah no diretorio'$BK/$DIA >> $LOG && echo ' ' >> $LOG
  
  
  #
  # Prepara a base de dados para o GBAK (backup)
  #
  #echo 'Preparando a base de dados para o GBAK' >> $LOG  && echo ' ' >> $LOG
  echo 'Otimizando a base de dados...' >> $LOG
  $GF -sweep -user $US -password $PW $PH/$DB >> $LOG 2>&1
  echo 'Consertando erros, se existirem...' >> $LOG
  $GF -mend -full -user $US -password $PW $PH/$DB >> $LOG 2>&1
  echo 'Base de dados preparada para o backup' >> $LOG && echo ' ' >> $LOG
  
  
  #
  # Efetua o backup da base de dados
  #
  echo 'Iniciando backup da base de dados usando GBAK' >> $LOG
  echo -n 'Hora inicial: ' >> $LOG && date +%H:%M >> $LOG
  $GB -b -g -v -z -t -user $US -password $PW $PH/$DB $BK/$DIA/$DIA-backup.fbk >> $LOG 2>&1
  echo 'Backup efetuado com sucesso!' >> $LOG
  echo -n 'Hora final: ' >> $LOG && date +%H:%M >> $LOG && echo ' ' >> $LOG
  
  
  #
  # Compacta a copia da base e o backup da base
  #
  echo 'Compactando a copia da base de dados...' >> $LOG  && echo ' ' >> $LOG
  tar -czvf $BK/$DIA/$DIA-backup.tar.gz $BK/$DIA/$DIA-backup.fbk >> $LOG 2>&1
  ls -la $BK/$DIA/$DIA-backup.tar.gz >> $LOG && echo ' ' >> $LOG
  echo 'A copia da base de dados foi compactada com sucesso!' >> $LOG && echo ' ' >> $LOG && echo ' ' >> $LOG
  
  echo 'Compactando o backup da base de dados...' >> $LOG
  tar -czvf $BK/$DIA/$DIA-base.tar.gz $BK/$DIA/$DIA-base.fdb >> $LOG 2>&1
  ls -la $BK/$DIA/$DIA-base.tar.gz >> $LOG && echo ' ' >> $LOG
  echo 'O backup da base de dados foi compactado com sucesso!' >> $LOG && echo ' ' >> $LOG
  
  
  #
  # Restaura a base de dados
  #
  echo ' ' >> $LOG
  echo 'Iniciando restore da base de dados usando GBAK' >> $LOG
  echo -n 'Hora inicial: ' >> $LOG && date +%H:%M >> $LOG
  $GB -r -v -z -N -user $US -password $PW $BK/$DIA/$DIA-backup.fbk $PH/$DIA-base.fdb >> $LOG 2>&1
  echo 'Restore efetuado com sucesso!' >> $LOG
  echo -n 'Hora final: ' >> $LOG && date +%H:%M >> $LOG && echo ' ' >> $LOG
  
  
  #
  # Renomeia os arquivos e atribui privilegios
  #
  echo 'Removendo arquivos velhos (OLD)' >> $LOG
  rm $PH/$DB-old
  echo 'Arquivos antigos (OLD) removidos com sucesso!' >> $LOG && echo ' ' >> $LOG
  
  echo 'Renomeando a base de dados atual para OLD' >> $LOG
  mv $PH/$DB $PH/$DB-old
  echo 'Base de dados renomeada para OLD com sucesso!' >> $LOG && echo ' ' >> $LOG
  
  echo 'Renomeando a base restaurada para o nome real da base' >> $LOG
  mv $PH/$DIA-base.fdb $PH/$DB
  echo 'Base de dados renomeada para '$DB' com sucesso!' >> $LOG && echo ' ' >> $LOG
  
  echo 'Mudando o usuario e grupo donos da base para FIREBIRD:FIREBIRD' >> $LOG
  chown firebird:firebird $PH/$DB
  echo 'Mudanca de proprietario e grupo FIREBIRD efetuada com sucesso!' >> $LOG && echo ' ' >> $LOG
  
  echo 'Aplicando permissao total 777 ao arquivo da base' >> $LOG
  chmod 777 $PH/$DB >> $LOG 2>&1
  echo 'Permissao aplicada com sucesso!' >> $LOG && echo ' ' >> $LOG
  
  
  #
  # Volta a base de dados para o estado ONLINE
  #
  echo 'Voltando a base de dados para o estado ONLINE' >> $LOG
  $GF -online -user $US -password $PW $PH/$DB >> $LOG 2>&1  && echo ' ' >> $LOG
  echo 'Base ONLINE!' >> $LOG && echo ' ' >> $LOG
  
  
  echo -n 'Data: ' >> $LOG && date +%d/%m/%Y-%H:%M:%S >> $LOG
  echo '*** Fim do backup diario ***' >> $LOG  && echo ' ' >> $LOG
  
  #
  # Coloca mensagem no console avisando sobre o final, mostrando
  # data e hora novamente.
  echo ' '
  echo -n 'Processo de backup finalizado com sucesso em: ' && date +%d/%m/%Y' - as '%H:%M
  echo ' '
Genivaldo Rocha é Especialista em Redes Novell Netware, agora muito mais linux. Trabalho atualmente como consultor de segurança de TI e tem uma pequena empresa de consultoria em redes de computadores. A Tecnoredes nasceu da vontade de trabalhar por conta própria e fazer o que gosta... Usa a distro SuSE Linux Enterprise Server para bancos de dados e Slackware para firewall. Administra o NUI-Brasil, Novell Users International. Aqueles que quiserem fazer uma visita ao grupo fiquem a vontade para acessar: http://groups.yahoo.com/group/nui-brasil

Veja a relação completa dos artigos da Bancos de Dados Livres

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir
  • Currently 2.85/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 2.9 /5 (27 votos)


Para se manter atualizado sobre as novidades desta coluna, consulte sempre o newsfeed RSS

Para saber mais sobre RSS, leia o artigo O Padrão RSS - A luz no fim do túnel.

Opinião dos Leitores

Tiago Dib
06 Fev 2009, 00:23
Grande Rocha, fiquei afastado por um tempo, viajando e também fiquei doente. Mas já estamos na ativa novamente.

Aguardo ansioso a atualização do seu script com os testes que mencionei.. Realmente ficaria show de bola.

Abraços

Tiago Dib.
Genivaldo Rocha
06 Jan 2009, 11:53
Olá amigos, Mascarenhas e Dib.
Nesta primeira versão realmente eu não implementei estes testes, mas já tinha me ocorrido sobre essa possibilidade de o gbak der erro e a base ficar incompleta (como voce citou Dib).
Vou implemetar o teste e o laço pra gerar o log na proxima versão dessse script. Desde já agradeço a colaboração. O tempo tá corrido... e na semana que vem vou viajar de férias com esposa e filhas pro pantanal... mas quando voltar darei continuidade.

Abraços,

Rocha
Jose Fernando Scheid Mascarenhas
05 Jan 2009, 16:11
Caro Genivaldo,

Com o objetivo de simplificar seu script você pode fazer um único redirecionamento para o arquivo de log da seguinte forma:

(
comando 1
comando 2
comando 3
....
....
comando n
) >$LOG 2>&1

Isso evita que vc. tenha que fazer >>$LOG em praticamente todos os comandos do script.
Quanto a pergunta do Tiago Dib, a solução seria testar o status de saida do comando gbak assim:

gbak ... ... ... ...
if [ $? -eq 0 ]
then
echo "gbak executado com sucesso...."
.....
....
else
echo "Erro na execução do gbak!"
....
fi

Atenciosamente,

Fernando

Tiago Dib
05 Jan 2009, 10:26
Amigo gostei do script, uma vez eu fiz um parecido com o seu, mas esbarrei no seguinte problema. Não tem como testar se o gbak deu algum tipo de problema, exemplo as vezes da algum erro no gbak na hora de fazer o restore com isso minha base com o nome original ficava quebrada, e a antiga(correta) ficava renomeada, fazendo com que ninguem conseguisse entrar no sistema, teria como implementar algum teste desse tipo, pois confesso que quando fiz o script da maneira como lhe disse tive varios problemas assim, e eu precisava ficar logando no cliente e renomear a base antiga e depois rodar um gbak manualmente para entender o que ocorreu.

Grato e parabéns pelo script.

Abraços

Tiago Dib.
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script

 

 

Procure pela casa ou apartamento ideal à venda ou para aluguel na busca inteligente do Imohoo
Buscar imóveis