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ł
Dodaj komentarz