Sytuacja z życia wzięta. Poszukiwałem jakiegoś dobrego sposobu, zautomatyzowanego najlepiej do systematycznego wykonywania kopii bezpieczeństwa plików na serwerze, oraz bazy MySQL. Nic nie znalazłem, więc zacząłem nieco kombinować. W sieci jedyne pomocne rzeczy, jakie znajdywałem to fakt, że:
- najlepiej wykorzystać do tego Bash’a;
- skoro ↑ to potrzeba też CRON’a.
Super – pomyślałem. Korzystam z Linuxpl.com, który stoi na serwerze Debian’owym, mam dostęp do CRON’a, więc wszystko da się zrobić. No ale, przecież nie znam Bash’a. Krótkie studiowanie samego języka, parę porad od (nie)znajomych i oto jest, mój pierwszy skrypt napisany w Bash’u, który zarazem niezmiernie może ułatwić mi życie.
Analiza kodu
#!/bin/bash
AKTUALNY=`date +%F`
WYWAL=`date +%F -d"-XX day"`
Zmienna AKTUALNY wprowadza do skryptu po prostu obecną datę – wykonania skryptu. WYWAL odejmuje od daty wykonania skryptu XX dni.
if [ -e /home/{user}/{katalog}/$WYWAL.7z ]
then
rm /home/{user}/{katalog}/$WYWAL.7z
tar cpvfP /home/{user}/{katalog}/www.tar /home/{user}/
/usr/local/mysql/bin/mysqldump {tabela_bazy} -u{użytkownik} -p{hasło} > /home/{user}/{katalog}/{tabela_bazy}.sql
7z a -mx9 /home/{user}/{katalog}/$AKTUALNY.7z /home/{user}/{katalog}/www.tar /home/{user}/{katalog}/{tabela_bazy}.sql
rm /home/{user}/{katalog}/www.tar /home/{user}/{katalog}/{tabela_bazy}.sql
Jeśli istnieje AKTUALNY – XX dni wtedy, podejmij akcje:
- Usuń plik AKTUALNY – XX dni;
- Stwórz kopię zapasową katalogu /home/ użytkownika, pakując go bez kompresji, z zachowaniem praw dostępu do pliku www.tar;
- Pobierz odpowiednią tabelę bazy danych i zapisz ją;
- Spakuj z maksymalną kompresją plik www.tar oraz kopię tabeli bazy danych do pliku AKTUALNY.7z;
- Usuń pozostawione zbędne pliki, które są w archiwum *.7z.
Jeśli natomiast na serwerze nie ma pliku AKTUALNY-XX dni podejmij te same akcje, ale nie usuwaj czegoś, czego nie ma i tak na serwerze (linia nr 7 ↑).
else
tar cpvfP /home/{user}/{katalog}/www.tar /home/{user}/
/usr/local/mysql/bin/mysqldump {tabela_bazy} -u{użytkownik} -p{hasło} > /home/{user}/{katalog}/{tabela_bazy}.sql
7z a -mx9 /home/{user}/{katalog}/$AKTUALNY.7z /home/{user}/{katalog}/www.tar /home/{user}/{katalog}/{tabela_bazy}.sql
rm /home/{user}/{katalog}/www.tar /home/{user}/{katalog}/{tabela_bazy}.sql
fi
W praktyce
Działanie skryptu jest bardzo proste. Pakuje wybrany przez nas folder do archiwum, następnie pobiera tabelę bazy MySQL, po czym pakuje obydwa pliki (archiwum i kopia bazy) i usuwa niepotrzebne pliki zostawiając jedno archiwum z kopią.
Ustawienia
W skrypcie (który załączę na końcu wpisu) napisałem, co należy zmienić i mniej więcej co należy posiadać. W razie pytań – komentujcie.
Dla przykładu, ja wykonuję skrypt raz na tydzień, więc nie mogę w polu XX day wpisać 30, ponieważ nie znajdzie mi takiego pliku z racji na fakt, że 7+7+7+7=28, a nie 30. Co daje więc efekt, że skrypt ma usunąć skrypt plik, który w nazwie ma aktualna_data-28dni – jest to jedyne rozwiązanie dla cotygodniowych backupów. Jeśli chcesz robić kopię codziennie, a po tygodniu usuwać stare kopie, to wpisujesz tam 7 – proste 8).
Najważniejsze jednak jest wykonanie prostego polecenia zmieniającego uprawnienia skryptu na wykonanie – bez tego ni rusz:
chmod +x skrypt.sh
Bądź z poziomu klienta FTP zmieniamy uprawnienia na 711.
Licencja
Skrypt udostępniam na licencji GPL v. 3. Co oznacza, że możecie z nim robić, co chcecie, ale zachowajcie dane autora ;). Byłbym niezmiernie wdzięczny za wszelakie sugestie rozwojowe, bo ktoś może mieć większy łeb ode mnie i podsunie jakieś pomysły.
Skrypt – pobieranie
Zaznacz wszystko i zapisz pod dowolną nazwą, z rozszerzeniem sh – a z poziomu CRON’a wpisujesz sh /home/{user}/{katalog}/backup.sh i ma działać. Pamiętaj o uzupełnieniu danych w skrypcie.
#!/bin/bash
# Skrypt wykonujący kopię plików na serwerze oraz wybranej tabeli bazy MySQL na serwerach Uniksowych z dostępem do zadań CRON.
# Autor: Filip (inzaghi89) Cierpich
# URL: http://keepmind.eu
# Mail: filip małpa keepmind dot eu
# Licencja: GPL v. 3
# By skrypt działał poprawnie należy:
# - Zamienić:
# -- XX na ilość dni
# -- {user} na naszą nazwę użytkownika w katalogu /home/ na danym serwerze
# -- {katalog} na folder/katalog, w którym ma być zapisana kopia - katalog MUSI być stworzony ręcznie
# -- {tabela_bazy} na tabelę, którą ma pobrać skrypt
# -- {użytkownik} na nazwę użytkownika, za pośrednictwem której logujemy się do PHPmyAdmin
# -- {hasło} na hasło, za pośrednictwem której logujemy się do PHPmyAdmin
#
# - Posiadać:
# -- Uprawnienia wykonania skryptu na serwerze
# -- Zainstalowaną paczkę p7z-full
# -- Dostęp do zadań CRON na serwerze
# 2010-03-20 modyfikacja skryptu dzięki uwadze JaspEra: http://blog.keepmind.eu/pelny-backup-danych-ze-strony-www-dzieki-cronbash.html#comment-856
AKTUALNY=`date +%F` #odpowiada za nazwę pliku - aktualna data, np. 2010-03-18
WYWAL=`date +%F -d"-XX day"` #odejmuje od aktualnej daty XX dni. Np. 2010-03-18 - 10 = 2010-03-08
if [ -e /home/{user}/{katalog}/$WYWAL.7z ]
then
rm /home/{user}/{katalog}/$WYWAL.7z #jeśli istnieje plik 2010-03-08.7z (czyli aktualna data - xx dni = usuń go)
fi
tar cpvfP /home/{user}/{katalog}/www.tar /home/{user}/ #pakuje katalog /home/{user}/ do pliku www.tar
/usr/local/mysql/bin/mysqldump {tabela_bazy} -u{użytkownik} -p{hasło} > /home/{user}/{katalog}/{tabela_bazy}.sql #pobiera tabelę_bazy, którą zdefiniujemy do pliku tabela_bazy
7z a -mx9 /home/{user}/{katalog}/$AKTUALNY.7z /home/{user}/{katalog}/www.tar /home/{user}/{katalog}/{tabela_bazy}.sql #pakuje z najwyższym stopniem kompresji do formatu 7z - wymagany pakiet p7z-full
rm /home/{user}/{katalog}/www.tar /home/{user}/{katalog}/{tabela_bazy}.sql #usuwa plik www.tar i tabela_bazy.sql, które krok wcześniej spakował
Skomentuj Backup danych na serwerze Anuluj pisanie odpowiedzi