Script Bash para backup do mysql - tratamento de erros

1

Eu estou tentando fazer backup de um monte de tabelas MyISAM de uma forma que me permita rsync / rdiff o diretório de backup para um local remoto. Eu criei um script que despeja apenas as tabelas alteradas recentemente e define a data do arquivo para que o rsync possa pegar apenas as alteradas, mas agora eu não sei como fazer o tratamento de erros - eu gostaria o script para sair com um valor não 0 se houver erros. Como eu pude fazer isso?

#/bin/bash   
BKPDIR="/var/backups/db-mysql"
mkdir -p $BKPDIR
ERRORS=0

FIELDS="TABLE_SCHEMA, TABLE_NAME, UPDATE_TIME"
W_COND="UPDATE_TIME >= DATE_ADD(CURDATE(), INTERVAL -2 DAY) AND TABLE_SCHEMA<>'information_schema'"
mysql --skip-column-names -e "SELECT $FIELDS FROM information_schema.tables WHERE $W_COND;" | while read db table tstamp; do

    echo "DB: $db: TABLE: $table: ($tstamp)"
    mysqldump $db $table | gzip > $BKPDIR/$db-$table.sql.gz
    touch -d "$tstamp" $BKPDIR/$db-$table.sql.gz
done
exit $ERRORS
    
por Jure1873 04.10.2012 / 09:21

3 respostas

2

O comando mysqldump retorna 0 para sucesso e > 0 para condições de aviso / erro. Como você está em loop, você precisaria proteger o $ ERRORS de ser sobrescrito por comandos subsequentes bem-sucedidos, então é necessário um pouco de lógica

mysqldump ...
EXITSTATUS=$?
if [ "$ERRORS" -eq "0" -a "$EXITSTATUS" -ne "0" ]
   then 
       ERRORS=$EXITSTATUS 
   fi

Agora, quando o script sair, ele sairá com 0 ou o status do primeiro erro encontrado.

    
por 04.10.2012 / 11:02
1

Ok, eu tive que reordenar as coisas um pouco. A resposta de Iain não funcionou, como mysqldump é canalizado para gzip, então eu obtive o valor de retorno de gzip então usei PIPESTATUS e então tive que reordenar o comando para o loop while para obter a variável Errors fora da subshell.

#/bin/bash
ERRORS=0
BKPDIR="/var/backups/db-mysql"
mkdir -p $BKPDIR

FIELDS="TABLE_SCHEMA, TABLE_NAME, UPDATE_TIME"
W_COND="UPDATE_TIME >= DATE_ADD(CURDATE(), INTERVAL -2 DAY) AND TABLE_SCHEMA<>'information_schema'"

while read db table tstamp; do

        echo "DB: $db: TABLE: $table: ($tstamp)"
        mysqldump $db $table | gzip > $BKPDIR/$db-$table.sql.gz

        EXITSTATUS=${PIPESTATUS[0]}
        if [ "$EXITSTATUS" -ne "0" ]
        then 
                 echo "ERROR when backing up $db $table!"
                 ERRORS=$((ERRORS+1))
        fi

        touch -d "$tstamp" $BKPDIR/$db-$table.sql.gz

done < <(mysql --skip-column-names -e "SELECT $FIELDS FROM information_schema.tables WHERE $W_COND;")

if [ "$ERRORS" -ne "0" ]
then 
        echo "ERRORS when backing up MySQL!" 
fi

exit $ERRORS
    
por 04.10.2012 / 15:56
0

eu uso

ERRORS=$? 

após o comando mysqldump.

$? retorna o status do último comando executado.

Se você quiser, pode verificar os resultados depois de todos os comandos e definir ERRORS com base em vários resultados.

    
por 04.10.2012 / 09:43