#!/bin/sh
# backupMysql.sh - Efetua backup do banco de dados MySQL.
#
# Homepage   : http://neto.gsibr.com/scripts
# Autor      : José Morelli Neto <neto@univali.br>
#
# ----------------------------------------------------------------------------
#  Este programa permite executar o backup gerando um arquivo gzip com o DUMP
#  total de todas os bancos de dados, ou um gzip individual para cada banco
#  de dados. Também é possível manter um histórico das últimas n execuções
#
#  Para configurar, basta ajustar as variáveis abaixo conforme suas neces-
#  sidades.
# ----------------------------------------------------------------------------
#
# Histórico:
#
#   v1.0 2005-11-29, José Morelli Neto:
#      - Versão inicial
#
#
# Licenciamento: Este programa é GPL.
# ----------------------------------------------------------------------------

# Informações para acesso ao MySQL
myUser=root
myPassword=_SENHA_

# Diretório que será armazenado o backup
dirBackup=/home/backup

# Arquivo de Log
logFile=/var/log/backup.log

# Permitir histórico de versões (caso N o arquivo será sobrescrito cada vez que
# for realizado o backup) (Y=sim; N=não)
history=N

# Número máximo de versões a ser armazenado
numVersions=10

# Backup de todos os BDs em um único arquivo, ou gerar um arquivo para cada BD?
# (Y=sim; N=não)
allBDinOneFile=N

# BDs que não serão copiados. Para adicionar mais de um BD, separe-os por pipe
# (e.g. 'bd1|bd2|bd3')
noBackup='test'

# Texto que iniciar o nome do arquivo (antes do nome do BD)
filePrefix=mysql

# Exibi mensagens de Debug na saída padrão (1=sim; 0=não)
Debug=0

# Binários utilizados (não é necessário alterar caso a instalação seja padrão)
_mysqldump=/usr/bin/mysqldump
_mysql=/usr/bin/mysql
_gzip=/bin/gzip
_ls=/bin/ls
_head=/usr/bin/head
_wc=/usr/bin/wc
_tr=/usr/bin/tr
# ----------------------------------------------------------------------------

# Função de Logs
function doLog() {
        echo "[$Date] $*" >> $logFile
        Debug "LOG> $*"
}

# Função para geração de Debugs
function Debug() {
        [ "$Debug" = 1 ] && echo "$*" ;
}

# Funcao responsavel por efetua backup de DUMP total
function doDumpinOneFile() {

        doLog "Iniciando backup do MySQL [Dump total]"

        $_mysqldump --all --all-databases --quick --user=$myUser\
        --password=$myPassword | $_gzip >\
        $dirBackup/$filePrefix${Date:-$Date}.gz

	doLog "Backup concluído."
        Debug "Retornando valor: $ret"
        return $ret
}

# Função responsável por efetuar backup de DUMP por Database
function doDumpPerDB() {

        doLog "Iniciando backup do MySQL [Dump por BD]"

        for db in $($_mysql -u$myUser -p$myPassword -B -s -e 'show databases;'\
        | egrep -v $noBackup); do

                doLog "Efetuando backup do DB: $db"
                $_mysqldump --all --quick --user=$myUser --password=$myPassword\
                $db | $_gzip > $dirBackup/$filePrefix-$db${Date:-$Date}.gz

        done
        doLog "Backup concluído."
        Debug "Retornando valor: $ret"
        return $ret
}

# Limpa os arquivos anteriores ao número máxio de versões (para backups de
# apenas um arquivo .gz)
function doCleaning() {
        while [ "$($_ls -1 $dirBackup/$filePrefix*|$_wc -l|$_tr -d ' ')" -gt\
         "$numVersions" ]; do

                _file=$($_ls -1 $dirBackup/$filePrefix* -r --sort=time\
                | $_head -1)

                doLog "Removendo arquivo antigo: $_file"
                rm -f  $_file
        done
}

# Limpa os arquivos anteriores ao número máximo de versões (para backups de
# um arquivo .gz para cada BD)
function doCleaningPerDB() {
        # pega o número de daatabases que serao copiados
        _totDB=$($_mysql -u$myUser -p$myPassword -B -s -e 'show databases;'\
        | egrep -v $noBackup | $_wc -l | $_tr -d ' ')

        # remove arquivos anteriores ao numero de retencao
        while [ "$($_ls -1 $dirBackup/$filePrefix-[a-zA-Z]* | $_wc -l\
        | $_tr -d ' ')" -gt "$((numVersions*_totDB))" ]; do

                _file=$($_ls $dirBackup/$filePrefix-[a-zA-Z]* -r --sort=time\
                | $_head -$_totDB)

                doLog "Removendo arquivo antigo: $_file"
                rm -f $_file
        done
}

# Funcao principal -----------------------------------------------------------

Debug "Permitir histórico de backup: $history"
# Backup em arquivo único ou efetuar a rotação
if [ "$history" = "N" ]; then
        Debug "Dump de todos os BDs em um .gz: $allBDinOneFile"
        if [ "$allBDinOneFile" = "Y" ]; then
                doDumpinOneFile
        else
                doDumpPerDB
        fi
else
        # Data que será utilizada no arquivo
        Date=-$(date +%y%m%d-%H%M)

        Debug "data que será utilizada no arquivo: $Date"
        Debug "Dump de todos os BDs em um .gz: $allBDinOneFile"
        if [ "$allBDinOneFile" = "Y" ]; then
                doCleaning
                doDumpinOneFile
        else
                doCleaningPerDB
                doDumpPerDB
        fi
fi
