Backup com mysqldump

Publicado por Osimar Medeiros (última atualização em 20/06/2013)

[ Hits: 7.284 ]

Homepage: http://linuxshia.wordpress.com

Download backupDB.sh

Download backupDO.sh (versão 2)




Um backup atualizado não é questão de "se" - antes é uma necessidade primária em qualquer ambiente de produção (missão crítica nem se fala).

Montei este pequeno script que uso regularmente e compartilho para os membros da comunidade pois se há algo certo neste mundo é que scripts shell sempre podem ser melhorados. =)

Explicação da rotina:

- backupDB.sh :: backup de tabelas específicas (críticas).
Uso uma tabela que armazena um ID para cada tabela crítica - além de armazenar a data/hora do último backup (campos "intervalo" e "data"). O campo intervalo armazena a data no formato "segundos desde 1970-01-01 00:00:00 UTC" e o campo data armazena a mesma informação no formato padrão (YYYY-MM-DD HH:MM:SS).

O script lê um array estático que contém o ID e nome de cada tabela crítica - há também um array de periodicidade pois há tabelas que precisam ser becapeadas a cada 1 hora e outras a cada 2 horas. Ele verifica se a tabela é elegível para backup naquele momento e - em caso positivo - realiza o backup e compacta o resultado com o gunzip. Ele cria um arquivo de PID e checa se este arquivo já existe antes de iniciar a execução - evitando que a rotina seja executada mais de uma vez simultaneamente. O script é bem autoexplicativo. =)

O script é executado obviamente de um outro servidor. Foi configurado no crontab (roda 1 vez por minuto]).

P.S.: obviamente alterei os nomes das tabelas, DB e caminhos de diretórios.

  



Versões atualizadas deste script

Versão 2 - Enviado por Osimar Medeiros em 18/06/2013

Changelog: Implementação de melhorias no controle do arquivo de PID - havia situações em que o mysqldump retornava erro ao executar uma query e o script era encerrado mas o arquivo de PID não era removido - o que impedia que o script fosse executado posteriormente - impedindo novos backups.
Corrigido com a validação do PID no arquivo.

Alterada também a linha de comando do mysqldump - para inserir data e hora no nome da tabela becapeada - para verificação de integridade antes de um restore em produção - e para correção de problemas com encoding [UTF-8 e Latin-1].

Download backupDO.sh


Esconder código-fonte

#!/bin/bash

# Script de backup desenvolvido por Osimar Medeiros -- osimar.medeiros[at]gmail[dot]com
# Data de criacao: 03 de junho de 2013
# Data da ultima atualizacao 04 de junho de 2013 17:47

# Este script realiza o backup do banco de dados `x`;
# Ele eh executado a cada 1 minuto e checa se eh o momento de becapear as tabelas de acordo com o esquema abaixo.

# Esquema de funcionamento

# As tabelas:
   #   critical_1
   #   critical_2
   #   critical_3
   #   critical_4
   #   critical_5
   #   critical_6
   #   critical_7
   #   critical_8
   #   critical_9
   #   critical_10
   #   critical_11
   #   critical_12
   #   critical_13
   #   critical_14
# sao becapeadas a cada 1 hora.

# As tabelas:
        #       critical_15
        #       critical_16
        #       critical_17
        #       critical_18
        #       critical_19
        #       critical_20
# sao becapeadas a cada 2 horas.

# Todos os backups sao mantidos durante 24 horas.

# Variaveis
CONFFILE="/home/backup/etc/default-mysql.conf"
LOG="/home/backup/logs/backupDO.log"
ERR="/home/backup/logs/backupDO.err"
BKP_DIR="/home/backup/tabelas/"

tabela_controle_ID[0]="110";      tabela_controle_PROJETO[0]="BACKUP_critical_1";   HORA[0]="3600";
tabela_controle_ID[1]="121";      tabela_controle_PROJETO[1]="BACKUP_critical_2";   HORA[1]="3600";
tabela_controle_ID[2]="122";      tabela_controle_PROJETO[2]="BACKUP_critical_3";   HORA[2]="3600";
tabela_controle_ID[3]="123";      tabela_controle_PROJETO[3]="BACKUP_critical_4";   HORA[3]="3600";
tabela_controle_ID[4]="154";      tabela_controle_PROJETO[4]="BACKUP_critical_5";   HORA[4]="3600";
tabela_controle_ID[5]="155";      tabela_controle_PROJETO[5]="BACKUP_critical_6";   HORA[5]="3600";
tabela_controle_ID[6]="156";      tabela_controle_PROJETO[6]="BACKUP_critical_7";   HORA[6]="3600";
tabela_controle_ID[7]="175";      tabela_controle_PROJETO[7]="BACKUP_critical_8";   HORA[7]="3600";
tabela_controle_ID[8]="176";      tabela_controle_PROJETO[8]="BACKUP_critical_9";   HORA[8]="3600";
tabela_controle_ID[9]="177";      tabela_controle_PROJETO[9]="BACKUP_critical_10";   HORA[9]="3600";
tabela_controle_ID[10]="260";      tabela_controle_PROJETO[10]="BACKUP_critical_11";   HORA[10]="3600";
tabela_controle_ID[11]="271";      tabela_controle_PROJETO[11]="BACKUP_critical_12";   HORA[11]="3600";
tabela_controle_ID[12]="283";      tabela_controle_PROJETO[12]="BACKUP_critical_13";   HORA[12]="3600";
tabela_controle_ID[13]="284";      tabela_controle_PROJETO[13]="BACKUP_critical_14";   HORA[13]="3600";
tabela_controle_ID[14]="118";      tabela_controle_PROJETO[14]="BACKUP_critical_15";   HORA[14]="7200";
tabela_controle_ID[15]="119";      tabela_controle_PROJETO[15]="BACKUP_critical_16";   HORA[15]="7200";
tabela_controle_ID[16]="120";      tabela_controle_PROJETO[16]="BACKUP_critical_17";   HORA[16]="7200";
tabela_controle_ID[17]="124";      tabela_controle_PROJETO[17]="BACKUP_critical_18";   HORA[17]="7200";
tabela_controle_ID[18]="138";      tabela_controle_PROJETO[18]="BACKUP_critical_19";   HORA[18]="7200";
tabela_controle_ID[19]="139";      tabela_controle_PROJETO[19]="BACKUP_critical_20";   HORA[19]="7200";

log() {
   msg="[ `/bin/date` ] PID [$$] $1"
   echo "$msg" >> $LOG
}

err() {
   msg="[ `/bin/date` ] PID [$$] $1"
   echo "$msg" >> $ERR
}

# Dependencias

log "Validando dependencias ..."

err="";
gzip=$(which gzip)            || err="gzip";
date=$(which date)            || err="date";
mysql=$(which mysql)         || err="mysql";
mysqldump=$(which mysqldump)   || err="mysqldump";

if [ ! -z $err ] ; then
   err "Dependencia nao validada: comando $err nao encontrado."
   exit 0
fi

if [ ! -f $CONFFILE ] ; then
   err "Arquivo $CONFFILE nao encontrado."
   exit 0
fi

log "Dependencias validadas com sucesso."
log "Iniciando execucao do script ..."

PIDFILE="/tmp/backupDO.pid"

if [ ! -f "$PIDFILE" ] ; then
   echo $$ >> "$PIDFILE"
else
   PID=`cat "$PIDFILE"`
   log "Script jah em execucao com pid $PID ... Saindo agora ..."
   exit 0
fi

x=0
while [ $x != ${#tabela_controle_ID[@]} ] ; do

   STAT_INTERVAL=`mysql --defaults-file=$CONFFILE -C --skip-column-names DB -e "SELECT STATUS,INTERVALO FROM tabela_controle WHERE Id = \"${tabela_controle_ID[$x]}\"" 2>> $ERR`

   if [[ $? -eq 1 ]] ; then
      err "Erro ao retornar status e intervalo da tabela tabela_controle para o projeto ${tabela_controle_PROJETO[$x]}."
      exit 0
   fi

   STATUS=`echo "$STAT_INTERVAL" | cut -f1`
   INTERVALO=`echo "$STAT_INTERVAL" | cut -f2`
   TABELA=`echo "${tabela_controle_PROJETO[$x]}" | sed -r s/BACKUP_//g`
   SECS_ATUAL=`date +%s`
   CALC_INTERVAL=`echo "$INTERVALO + ${HORA[$x]}" | bc`

   if [[ "$STATUS" == "ATIVO" ]] && [[ "$CALC_INTERVAL" -le $SECS_ATUAL ]] ; then

      log "Iniciando processo de backup da tabela $TABELA ..."

      DIR_NAME="$TABELA"
      FILE_NAME="$TABELA""-"`date +%Y_%m_%d_%H_%M_%S`".sql"

      if [[ ! -d "$BKP_DIR/$TABELA" ]] ; then
         mkdir "$BKP_DIR/$TABELA"
      fi

      BACKUP_TABELA=`mysqldump --defaults-file=$CONFFILE -C --skip-opt --add-drop-table --skip-add-locks --skip-lock-tables --create-options --disable-keys --extended-insert --quick --set-char --single-transaction DB $TABELA  >> "$BKP_DIR/$TABELA/$FILE_NAME" 2>> $ERR`

      if [[ $? -eq 1 ]] ; then
         err "Erro ao becapear tabela $TABELA. Continuando execucao do script ..."
         continue
      else
         log "Atualizando tabela tabela_controle com horario da ultima execucao do backup da tabela $TABELA ..."
      fi

      SECS_FINAL=`date +%s`
      UPDATE=`mysql --defaults-file=$CONFFILE -C DB -e "UPDATE tabela_controle SET INTERVALO=\"$SECS_FINAL\",DATA=NOW() WHERE Id=\"${tabela_controle_ID[$x]}\"" 2>> $ERR`

      if [[ $? -eq 1 ]] ; then
         err "Erro ao atualizar tabela tabela_controle com horario da ultima execucao do backup da tabela $TABELA. Continuando execucao do script ..."
      fi

      log "Backup da tabela $TABELA finalizado com sucesso !"

      log "Iniciando processo de compactacao do arquivo de backup $BKP_DIR/$DIR_NAME/$FILE_NAME ..."

      gzip $BKP_DIR/$DIR_NAME/$FILE_NAME

      if [[ $? -eq 1 ]] ; then
         err "Erro ao compactar arquivo $BKP_DIR/$DIR_NAME/$FILE_NAME"
         continue
      else
         log "Arquivo $BKP_DIR/$DIR_NAME/$FILE_NAME.gz criado com sucesso."
      fi

   fi

   let "x = x + 1"

done

log "Removendo arquivo $PIDFILE ..."

rm -f $PIDFILE

log "Rotina finalizada !"

Scripts recomendados

PKG Sync v4.0 - utilitário para backup de pacotes DEB baixados

Backup incremental com rsync

Script para gravação de BKPs em DVDs-RW

Backup do PostgreSQL 8.3 e aviso por e-mail

Backup completo


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts