Jeszcze prostszy backup serwera MySQL

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