Backup com mysqldump
Publicado por Osimar Medeiros (última atualização em 20/06/2013)
[ Hits: 7.592 ]
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 !"
Shell Script para gravar iso de xbox 360 para LT 3.0 burnisolt3
Script de backup de usuários do sistema
Backups automáticos de rádios Intelbras APC5
Script de Back Up, com limpeza de back ups antigos e e-mail com logs
Backup-Menu - Backup com menu de ajuda, sair e fazer backup
Nenhum comentário foi encontrado.
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Criação de diretórios e aplicação de restrições de acesso no Linux
diferença entre o Tor baixado pelo Gerenciador de Aplicativos e o Tor ... (1)
Podem me chamar de 1mbecil :) (2)
Debian Stable travado em atualizações: dist-upgrade não resolve [RESOL... (11)
Como ler fonte de um projeto? [RESOLVIDO] (5)
Perfil criado no samba ad dc não loga no Windows 10 e 11 [RESOLVIDO] (14)









