Backup com mysqldump

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 vem me servindo bem.
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 contem 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 auto-explicativo. =)

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.

#!/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.

# 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 !"

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s