2008
12.24

Backup MySQL na szybko

Czasem muszę zrobić backup na szybko – tylko, aby była kopia jak coś się wysypie. Dziś przytrafiło mi się zrobić taki backup dla MySQL. Na pierwszy rzut oka sprawa wydaje się banalna, ponieważ developerzy MySQL podarowali nam sprytne narzędzie jakim jest mysqldump. 

Przy jego pomocy bardzo fajnie (i co ważne bezpiecznie!) możemy dokonać backupu naszych wszystkich baz danych, pojedynczej bazy lub nawet jednej, interesującej nas tabeli. My chcemy mieć backup wszystkich baz danych, więc na pierwszy rzut oka napisalibyśmy:

mysqldump --all-databases -u username -ppassword > backup.sql

I wszystko by było pięknie, ładnie, fajnie gdyby nie jedna rzecz: gdy padnie nam jedna baza i będziemy chcieli ją odzyskać korzystając z pliku backup.sql to mamy fackup. Dlaczego? Otóż dlatego, że mamy jeden zajebiście duży plik z backupem, przez który musimy się przewalić i wyciągnąć z niego tylko bazę danych, która nas interesuje.

Pierwsza myśl jaka przychodzi nam do głowy to, że przecież możemy napisać:

mysqldump -u username -ppassword database_name > database_name.sql

No i gites. Problem jednak w tym, że nigdy nie wiemy jakie (i ile) baz danych leży na aktualnym serwerze, więc mamy kilka możliwości:

  • z palca pisać każdą nazwę bazy danych,
  • napisać sobie w bashu długą linijkę, która to zrobi lub też…

… skorzystać z poniższego skryptu:

#!/bin/bash

DB_USER=y3ti
DB_PASS=moje_fajne_haslo
DB_PATH="/var/lib/mysql"
DATE=`date "+%Y%m%d"`
TMP_DIR="./db_$DATE"

mkdir -p "/tmp/db_$DATE"
cd /tmp
echo `date "+%F %H:%M:%S: "`"**** Creating MySQL Backup ****"

echo `date "+%F %H:%M:%S: "`"Databases:"
for filename in $( ls $DB_PATH ); do
  if [ -d $DB_PATH/$filename ]; then
    echo `date "+%F %H:%M:%S:"`"  - $filename "
    mysqldump -u $DB_USER -p$DB_PASS $filename > /tmp/db_$DATE/$filename.sql
  fi
done

echo `date "+%F %H:%M:%S:"`" Compressing dumped databases"
bzip2 -9 /tmp/db_$DATE/*
tar -cf db_$DATE.tar db_$DATE
rm -rf /tmp/db_$DATE
echo `date "+%F %H:%M:%S:"`" Moving to /backup/mysql"
mkdir -p /backup/mysql
mv db_$DATE.tar /backup/mysql
echo `date "+%F %H:%M:%S: "`"Complete."

Dodatkowo mamy informację, o wszystkich znalezionych bazach danych w czytelnie wydrukowanym raporcie, który może wyglądać mniej więcej tak:

2008-12-24 19:16:59: **** Creating MySQL Backup ****
2008-12-24 19:16:59: Databases:
2008-12-24 19:16:59:  - blog
2008-12-24 19:16:59:  - mysql
2008-12-24 19:16:59:  - plix
2008-12-24 19:16:59:  - test
2008-12-24 19:16:59:  - webistrano
2008-12-24 19:16:59: Compressing dumped databases
2008-12-24 19:17:00: Moving to /backup/mysql
2008-12-24 19:17:00: Complete.

Nic, tylko dodać do crona i ustawić, aby raz na dobę robił backup :)

1 comment so far

Add Your Comment
  1. [...] źródło: blog.y3ti.pl Follow us on Twitter 26 śledzących RSS Feed 218 czytelników Backup MySQL na szybko 1 głosuj! Czasem muszę zrobić backup na szybko – tylko, aby była kopia jak coś się [...]