Backup com mysqldump
Publicado por Osimar Medeiros (última atualização em 20/06/2013)
[ Hits: 7.292 ]
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 !"
Script de backup dos hosts do Zabbix
Backup da pasta de usuário em sistemas GNU/Linux sem copiar os arquivos ocultos
Realiza backup de VMs ligadas no XenServer 6.5
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Excluir banco de dados no xampp (1)
phpmyadmin não abre no xampp (2)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta