Backup serwera i plików

Backup plików

Często zachodzi potrzeba wykonywania okresowych kopii zapasowych ważnych plików i folderów.  Serwerowe systemy windows oferuje takie narzędzie. Jednakże kopia wykonywana jest do specjalnego pliku czy miejsca na dysku. W przypadku uszkodzenia archiwum nie możemy go odtworzyć. Występuje jeszcze szereg innych problemów. Co w efekcie skutkuje brakiem możliwości odzyskania odpowiedniej wersji kopii. Aby zabezpieczyć swoje dane postanowiłem zastosować własne proste rozwiązanie działające na każdym systemie windows w wersjach home, proffesional czy serwerowych. Użyjemy tutaj kliku istniejących narzędzi a także rozwiązania autorskie.

Założenia.

Listę instrukcji do wykonywania kopii zapiszemy w pliku wsadowym (z rozszerzeniem bat) pozwoli to nam na jego prostą modyfikację do konkretnych potrzeb użytkownika.
Mi potrzebne było codzienne wykonywanie kopii bazy danych oraz raz w tygodniu kopii wszystkich dokumentów na serwerze.
Kopię wykonuję podwójnie raz na tym samym komputerze na drugi dysk oraz drugi raz na sąsiedni serwer (podwójne zabezpieczenie przed utrata danych)
Po wykonaniu kopii wykonuję porządki i pozostawiam odpowiednią ilość kopii wstecz np dwa miesiące.

1. Zaczynamy.

W dowolnym edytorze tworzymy plik z rozszerzeniem bat np backup.bat
u mnie jest zapisany on na dysku D:
wpisujemy najpierw komendy porządkujące to co się będzie wyświetlało na ekranie

 @echo off
 cls

 D:
 cd folder_do_pliku_backup.bat np D:KOPIOWANIE

 

Teraz definiujemy w pliku nazwę folderu docelowego. Ja założyłem że będę zapisywał dane w lokalizacji E:BACKUPS i za każdym razem będę tworzył folder  z datą i godziną np taki: BACKUP_2016-11-27_01-04-25

Tworzymy zmiennną %SAVESTAMP% która będzie zawierała nazwę tego folderu:

 set SAVESTAMP=%DATE:/=-%_%TIME:~0,8%
 set SAVESTAMP=%SAVESTAMP::=-%
 set SAVESTAMP=%SAVESTAMP: =0%
 set SAVESTAMP=BACKUP_%SAVESTAMP%
 echo KOPIA DO WYKONANIA: %SAVESTAMP%

Zmienną %SAVESTAMP%  możemy wykorzystywac później w programie np echo %SAVESTAMP%

2. Kopia bazy danych

Aby moc skopiowac pliki bazy danych najpierw należy zatrzymać serwer SQL. W moim przypadku jest to serwer Microsoftu więc jego zatrzymanie jst proste z linii komend:

 net stop "MSSQL$SQLEXPRESS"

Teraz tworzymy katalogi lokalne dla kopii :

 md  E:SQL_BACKUP
 md  E:SQL_BACKUP%SAVESTAMP%
 md  E:SQL_BACKUPCURRENT

Oraz katalogi sieciowe:

 md  SERWER2backupsSQL_BACKUP%SAVESTAMP%
 md  SERWER2backupsSQL_BACKUPCURRENT

a następnie kopiujemy pliki :

 copy D:SQLBAZA_DANYCH*.*  "E:SQL_BACKUP%SAVESTAMP%*.*" 
 copy D:SQLBAZA_DANYCH*.*  "E:SQL_BACKUPCURRENT*.*"
 copy D:SQLBAZA_DANYCH*.* "SERWER2backupsSQL_BACKUP%SAVESTAMP%*.*" 
 copy D:SQLBAZA_DANYCH*.* "SERWER2backupsSQL_BACKUPCURRENT*.*" 

jak warto zauważyć baza danych kopiowana jest do folderu z datą a także do folderu CURRENT - czyli bieżąca kopia. 

teraz należy uruchomić ponownie serwer SQL. W naszym pliku backup.bat wpisujemy więc polecenie :

 net start "MSSQL$SQLEXPRESS"

Na koniec należy posprzątać stare kopie do tego posłuży nam dodatkowy program deleteOldBackups

Uruchamiamy go z dwoma parametrami pierwszy jest liczbą folderów do pozostawienia drugi katalogiem gdzie są wykonywane kopie.

 deleteOldBackups 60 "E:SQL_BACKUP"
 deleteOldBackups 60 "SERWER2backupsSQL_BACKUP"

Program poprawnie działa z folderami w których w nazwie jest zawarte słowo BACKUP jego użycie w innym miejscu niż kopie zapasowe lub użycie do kopii zapasowych wykonywanych inaczej może spowodować usuniecie innych ważnych danych !!!

3. Kopia dokumentów

W moim przypadku kopii dokumentów nie musze robić codziennie. Wykonuję ją dwa razy w tygodniu.

Mozna utworzyć oddzielny plik wykonywalny i uruchomić go z innym harmonogramem. Jednakże wtedy  kopia dokumentów nie wie czy poprzednie zadanie (kopia bazy danych) sę zakończyło. Można to zrobić ustawiając inne godziny lub po prostu wykonywac kopię dokumentów z tego samego pliku tj. backup.bat

Ponieważ plik backup.bat wykonywany jest codziennie a kopie dokumentów robimy w wybrane dni musimy sprawdzić jaki dzień tygodnia jest teraz. Do tego posłuży dodatkowy program.

 set %errorlevel%=
 dayOfWeek /Q

Program dayOfWeek zwraca w %errorlevel% numer dnia np errorlevel=1 gdy poniedziałek.  2- wtorek itd

parametr /Q powoduje że program nic nie wyświetla

parametr /N powoduje że tydzień zaczyna się od niedzieli czyli niedziela-1 poniedziałek-2 itd

Przykłady:

Niedziela

 if %ERRORLEVEL% EQU 7 (goto doJob

Środa

 if %ERRORLEVEL% EQU 3 (goto doJob

 Wykonujemy dalej naszą pracę:

 goto end

 :doJob
 echo ===================================
 if %ERRORLEVEL% EQU 1 (echo PONIEDZIALEK - KOPIA RESZTY DOKUMENTOW)
 if %ERRORLEVEL% EQU 2 (echo WTOREK - KOPIA RESZTY DOKUMENTOW)
 if %ERRORLEVEL% EQU 3 (echo SRODA - KOPIA RESZTY DOKUMENTOW)
 if %ERRORLEVEL% EQU 4 (echo CZWARTEK - KOPIA RESZTY DOKUMENTOW)
 if %ERRORLEVEL% EQU 5 (echo PIATEK - KOPIA RESZTY DOKUMENTOW)
 if %ERRORLEVEL% EQU 6 (echo SOBOTA - KOPIA RESZTY DOKUMENTOW)
 if %ERRORLEVEL% EQU 7 (echo NIEDZIELA - KOPIA RESZTY DOKUMENTOW)

Tworzymy katalogi jak poprzednio:

 md E:MyDocs_BACKUP
 md E:MyDocs_BACKUP%SAVESTAMP%

 md SERWER2backupsMyDocs_BACKUP
 md SERWER2backupsMyDocs_BACKUP%SAVESTAMP%

Teraz wykonamy kopię folderów. Można użyć standardowego xcopy lecz ma on wady dlatego napisałem program TFxcopy
Uruchamiając program należy podac dwa parametry tj. folder źródłowy i folder docelowy
jezeli folder zawiera spacje należy podać go w " "
Podane foldery nie powinny mieć polskich znaków. Kopiowane podfoldery mogą.

Różnice pomiędzy TFxcopy a xcopy:
- obsługuje długie ścieżki i nazwy plików do 32000 znaków standartowe xcopy do 256 w systemach starszych niż WIN 10
- bezproblemowo tworzy foldery i subfoldery jeśli potrzeba.
- nie pyta się o zastępowanie plików tylko je zastepuje
- błąd nie przerywa kopiowania następnych plików
- zachowuje oryginalne daty utworzenia, modyfikacji i dostępu do plików i folderów.

kopiujemy jak zawsze w dwa miejsca na drugi dysk i na inny serwer:

 TFxcopy "D:Moje Dokumenty" SERWER2backupsMyDocs_BACKUP%SAVESTAMP%
 TFxcopy "D:Moje Dokumenty" E:MyDocs_BACKUP%SAVESTAMP%

I na koniec jak zawsze porządki w kopiach - pozostawiam ostatnie 10 kopii

 deleteOldBackups 10 E:MyDocs_BACKUP
 deleteOldBackups 10 SERWER2backupsMyDocs_BACKUP

I dodatkowo robię kopię bieżącą:

 echo(
 echo Aktualizacja kopii biezacej
 TFxcopy "D:Moje Dokumenty" e:Dokumenty_kopia

A na zakończenie porządki

 :end
 set SAVESTAMP=
 set %errorlevel%=

 echo KONIEC KONCOW !!!
 timeout 5

 

Następnie należy utworzyć harmonaogram. Odanjdujemy w panelu starowania bądź narzędziach administracyjnych Harmonogram zadań i urucuamiamy go. Dodajemy nowe zadanie. Przykładowa konfiguracja harmonogramu na obrazkach poniżej:

Ważne jest aby wpisać folder w którym rozpocznie się działanie programu (Rozpocznij w). Po zatwierdzeniu OK program poprosi o hasło administratora. Oczywiście możemy uruchamiac program z innymi uprawnieniami. Wszystko zależy od konfiguracji.

Aby przetestowac działanie programu z harmonogramu klikamy w utworzone zadanie prawym klawiszm myszy i wybieramy Uruchom.


Niezbędne programy do pobrania poniżej:

Script logo