Tag Archives: mysql

Simpel mysqldump script

Voor één van mijn servers wilde ik een script dat elke nacht een dump van alle databases die op de machine draaien apart zet. Een simpele mysqldump van alle databases dus. Om dat snel en makkelijk voor alle databases voor elkaar te krijgen heb ik onderstaande batch script gemaakt. Optioneel kan de flag –cron worden meegegeven om de output van het script te minimaliseren tot alleen mislukte backups (als je bijv. de output van cronjobs naar jezelf laat mailen, maar alleen mails wilt ontvangen op het moment dat er iets mislukt). Zonder deze flag wordt de status van alle backups getoond.

De source:

#!/bin/bash
if [[ $1 == "--cron" ]]; then
    # Cron mode, minimize output to only show failures
    mysql -u user -p pass -B -e "SHOW DATABASES"|sed 1d|while read db
    do
        mysqldump -u user -p pass $db|gzip>"/home/db_backup/$db.sql.gz"
        if [[ $? != 0 ]];then echo "Backup of database $db FAILED!";fi
    done
else
    # Default mode, be verbose
    mysql -u user -p pass -B -e "SHOW DATABASES"|sed 1d|while read db
    do
        echo -n "Backing up database $db: "
        mysqldump -u user -p pass $db|gzip>"/home/db_backup/$db.sql.gz"
        if [[ $? == 0 ]];then echo "OK.";else echo "FAILED!";fi
    done
fi

Op zich redelijk straight-forward. De mysql client wordt aangeroepen met de user/pass combinatie en het commando show databases wordt uitgevoerd om een lijst van huidige databases te krijgen. Vervolgens wordt ‘sed 1d’ gebruikt om de eerste regel van de output, namelijk “Databases” te verwijderen. In deze header zijn we toch niet geïnteresseerd.

Vervolgens gaan we met een while loop deze lijst van databases doorsturen naar de mysqldump utility. De output wordt geredirect naar gzip, omdat op SQL dumps een redelijk hoge compressie kan worden behaald en dus ruimte kan worden bespaard. Dat geheel schrijven we weg naar een bestand in /home/db_backup.

Ten slotte wordt de exit code van het mysqldump commando nog uitgelezen (deze staat opgeslagen in $?). Als het 0 is zijn we tevreden en is de dump succesvol. Als het iets anders dan 0 is, dan is er schijnbaar ergens iets mis gegaan en wordt er “FAILED” aangegeven.