Jeszcze prostszy backup serwera MySQL

Stare ludowe przysłowie mówi “tylko prawdziwi twardziele nie robią backupu”. Ja niestety do prawdziwych twardzieli się nie zaliczam, więc robię regularne backupy. Wiadomo – spadały wahadłowce, nasz serwer też się prędzej czy później spali 😉
Współczesna architektura aplikacji skupia się na trzymaniu danych w… bazach danych. W naszym przypadku jest to zwykle MySQL. Więc na tym się skupimy. Nie wiem jak wy, ale ja lubię mieć kopię każdej bazy w osobnym pliku. Jak to zautomatyzować? Poprzednie używałem Perla, a teraz wiem jak zrobić to bez niego.
#!/bin/bash
USER="root"
PASSWORD="secret"
OUTPUTDIR="/root/backup"
MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"
# kasujemy stare backupy
rm "$OUTPUTDIR/*sql" > /dev/null 2>&1
# wyciagamy listę baz danych
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
# i teraz każda do osobnego pliku
for db in $databases; do
echo $db
$MYSQLDUMP --force --opt --user=$USER --password=$PASSWORD --databases $db > "$OUTPUTDIR/$db.sql"
done
W ramach potrzeb możemy rozbudować nasz kod o parę dodatkowych funkcji, mianowicie kompresję i… wysyłanie kopi do S3 albo Google Storage . No i oczywiście nie chcemy trzymać backupów na wieczność, 2 tygodnie wystarczą.
Dodajemy więc do nagłówka dwie zmienne – datę dzisiaj i datę 2 tygodnie temu.
TODAY=`date "+%Y-%m-%d"`
OLDB=`date --date "-14 days" "+%Y-%m-%d"`
A potem dodajemy funkcje kompresji i wgrywania na S3 albo GS
/bin/tar -cvjf $TODAY.tar.bz2 mysql
/usr/bin/s3cmd put $TODAY.tar.bz2 s3://bucket/backup/$TODAY.tar.bz2
/usr/bin/s3cmd del s3://bucket/backup/$OLDB.tar.bz2