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.