Backup com mysqldump
Publicado por Osimar Medeiros (última atualização em 20/06/2013)
[ Hits: 7.557 ]
Homepage: http://linuxshia.wordpress.com
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ã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].
#!/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 !"
weekly-backup - backup agendado
Limpeza dos dados do rConfig (ferramenta open-source de gerenciamento de configuração
DriveTool.sh: um script para cópia rápida e segura de arquivos para unidades flash USB
Realiza backup de VMs ligadas no XenServer 6.5
Backup de MySQL para uso no cron / cPanel
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como realizar um ataque de força bruta para desobrir senhas?
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Atalho para usar interrogação (0)
VOL já não é mais como antes? (12)
Scripts ou binários [RESOLVIDO] (4)
Pergunta: Meu teclado não está respondendo direito como e consertar? ... (4)









