PS Simple Backuper – dokumentacja

Co to jest?

To narzędzie pozwoli Ci wykonać kopię zapasową folderów lokalnych lub udziałów sieciowych rekursywnie. Narzędzie jest także w stanie wykonać kopię zapasową baz danych MSSQL. Zasadniczo kopiuje wszystkie bazy danych na serwerze (oprócz tempdb), ale umożliwia także definiowanie własnych wykluczeń.

To narzędzie jest konfigurowalne za pomocą prostego pliku konfiguracyjnego w formacie XML.

Wymagania

  • Powershell 4.0 (lub nowszy),
  • SQLPS Powershell Module (jeśli chcesz wykonywać backup baz MSSQL,
  • Narzędzie do archiwizacji 7-zip (https://z-zip.org)

Instalacja

Po prostu skopiuj pobrany pakiet na serwer i rozpakuj go w dowolnym folderze na dysku twardym. Pamiętaj, że dzienniki będą przechowywane w tym folderze (zostanie utworzony podfolder .\Logs), więc będziesz potrzebować od kilkudziesięciu, do kilkuset megabajtów rocznie na pliki z logami, w zależności od częstotliwości kopiowania i liczby kopiowanych zasobów.
Na przykład:
Utwórz folder c: \ PSSimpleBackupTool \ i wyodrębnij tam pliki.

Konfiguracja – praca z plikiem XML

Wszystkie parametry zadania można znaleźć w pliku. \Config.xml. Otwórz plik za pomocą dobrego edytora (np. Notepad ++).

Przykładowy plik z konfiguracją (wersja 1.0)

Konfiguracja jest logicznie podzielona na trzy części:
1) Konfiguracje zadań – kopia zapasowa,
2) Wspólne parametry,
3) Konfiguracja powiadamiania email.

Konfiguracja zadań

Narzędzie wykona tyle zadań kopii zapasowych, ile umieścisz węzłów/bloków <backup> w pliku konfiguracyjnym podczas pracy.
Każdy blok <backup> ma kilka następujących atrybutów:

Nazwa atrybutuTyp danych – możliwe wartościOpis
name[string]
etykieta, nazwa zadania. Będzie elementem nazwy pliku z backupem.
type[przełącznik: file, mssql]definiuje typ zadania. Wartość [file] dla kopii plików i folderów w danej ścieżce. Wartość [mssql] dla zadania kopii zapasowej baz danych.

Generalną zasadą jest umieszczenie tylu węzłów <backup> ile kopii chcemy wykonać. Na przykład, jeśli chcemy wykonać kopię zapasową jednego folderu (z podfolderami), jednego folderu udostępnionego i np. baz z dwóch serwerów MSSQL to zadań będzie cztery. Powstaną też cztery wynikowe pliki zarchiwizowane 7-zip (w nazwie każdego będzie występował element <name> i odpowiedni timestamp.
Dla każdego węzła <backup> wyróżniamy następujące opcje konfiguracji:

Podwęzły konfiguracji zadania
Atrybut
Typ danych – możliwe wartości
dla typu <file>dla typu <mssql>
sourcepath[string]Absolutna ścieżka plikowa lub ścieżka unc do udziału sieciowego, np.

c:\user\docs

\\sharedfolder\user\docs
Pełna ścieżka wskazująca na instancję MSSQL, np.

dbsrv\mssqlexpress

lub

databaseServer
targetpath[string]Absolutna ścieżka docelowa do folderu gdzie będą zapisywane kopie zapasowe.Absolutna ścieżka docelowa do folderu gdzie będą zapisywane kopie zapasowe.
target remove[przełącznik: true, false]Decyduje, czy kopia zostanie usunięta z folderu skonfigurowanego w opcji target, po przesłaniu pliku na udział smb.
Decyduje, czy kopia zostanie usunięta z folderu skonfigurowanego w opcji target, po przesłaniu pliku na udział smb.
excludeitems[string], wartości oddzielone przecinkamiDefiniuje nazwy podfolderów wyłączonych z procesu backupuDefiniuje nazwy baz danych wyłączonych z procesu backupu (tempdb wyłączone jest domyślnie).
smbsendbackup[przełącznik: true, false]Decyduje, czy wynikowy plik zapisany w <target> zostanie dodatkowo przesłany do zdefiniowanej lokalizacji sieciowej.
Decyduje, czy wynikowy plik zapisany w <target> zostanie dodatkowo przesłany do zdefiniowanej lokalizacji sieciowej.
smbcredentialVaultName[string]nazwa portfela zawierającego poświadczenia do udziału sieciowego na który będzie kopiowany plik, zapisanego w Windows Credential Manager nazwa portfela zawierającego poświadczenia do udziału sieciowego na który będzie kopiowany plik, zapisanego w Windows Credential Manager
smbunc[string]Definiuje ścieżkę UNC do której wysłany zostanie plik z kopią.Definiuje ścieżkę UNC do której wysłany zostanie plik z kopią


Klucze wspólne dla wszystkich zadań wyrażonych w blokach <backup>.

PodwęzełAtrybutTyp danych/możliwe wartościOpis
sevenzippath[string]ścieżka do pliku wykonywalnego 7z.exe
temppath[string]ścieżka do folderu tymczasowego w którym zapisywane będą pliki i foldery podczas zadania backupu
archivecompressionlevel[liczba: 0-9]stopień kompresji wynikowego pliku 7-zip (gdzie 0 oznacza brak kompresji a 9 maksymalną kompresję)
outputfolder
itemToKeep[liczba całkowita]ilość kopii przetrzymywanych w każdym z folderów wyrażonych w <target – path>

Dodatkowe parametry dla powiadamiania email:

AtrybutTyp DanychprzykładOpis
EmailToAddress[string], oddzielony przecinkamijkowalski@gmail.com, nowak@wp.pl
Adresy skrzynek email na które należy wysłać powiadomienie.
EmailFromAddress[string]alerts@mymail.comAdresy skrzynki z której będą wysyłane powiadomienia.
SmtpPort[liczba całkowita]465
Nr portu serwera smtp
SmtpAddress[string]mail.mymail.comadres serwera smtp
ssl
[przełącznik: true, false]trueDefiniuje czy do połączeń z serwerem smtp ma być nawiązywane połączenie ssl/tls
sendLog [przełącznik: true, false]
trueOkreśla czy w załączniku do maila ma być wysyłany plik LOG z przebiegu backupu.

UWAGA! w pliku będą widoczne nazwy i ścieżki plików, baz danych oraz adresy udziałów sieciowych. Nie będą widoczne żadne poświadczenia.
EmailSubject[string]Powiadomienie o wykonaniu kopiiTemat wiadomości emai.
EmailBody[string]On %checktime%: on server %hostname% the defined backup was performed. In the attachment you will find the log file. Don’t reply to this email.Określa treść wiadomości email. Możemy posłużyć się dwoma placeholderami:

%hostname% określa nazwę maszyny z której wyzwalana jest kopia,

%checktime% określa czas rozpoczęcia zadania.

Jak to działa – przebieg zadania

Dla zadania <file>, narzędzie skopiuje rekursywnie wszystkie dane ze ścieżki <source> z wyjątkiem elementów które zdefiniujemy w węźle <exclude> do ścieżki <temp> a następnie skompresuje je za pomocą 7-zip <sevenzip> z siłą kompresji <archive – compressionlevel> i zapiszę plik w folderze docelowym <target>. Jeśli atrybut <smb – sendbackup> ustawimy na true, skrypt będzie próbował skopiować plik dodatkowo na udział sieciowy <smb – unc>. Jeśli udział sieciowy nie jest publiczny i wymaga logowania, musimy dodać do Windows Credential Manager odpowiedni portfel (zobacz rozdział niżej) z poświadczeniami i nazwę portfelu umieścić w atrybucie <smb – credentialVaultName>. Dodatkowo, możemy zdecydować czy po przesłaniu na smb, plik z kopią zapasową zostanie skasowany od razu <target – remove> czy będzie podlegał rolowaniu zgodnie z ustawieniem wyrażonym w <outputFolder – itemToKeep>.

Dla zadania <mssql>, narzędzie wykona backup wszystkich baz danych z wyjątkiem tych, które zdefiniujemy w węźle <exclude> do ścieżki <temp> a następnie skompresuje je za pomocą 7-zip <sevenzip> z siłą kompresji <archive – compressionlevel>. Plik zostanie zapisany w folderze docelowym <target>. Kolejne kroki są analogiczne na zadania <file>.

Wszystkie kroki logowane są do pliku który na bieżąco zapisywany jest w podfolderze .\logs. Po wykonaniu wszystkich zadań, skrypt podejmie próbę wysłania notyfikacji poprzez skrzynkę email zdefiniowaną w węźle <EmailSettings>. Jeśli <EmailToAddress> będzie pusty – email nie będzie wysyłany.

Niektóre kroki wykonywane przez skrypt wykonywane są w taki sposób, aby ponowić dany krok w przypadku niepowodzenia. Przykładem tego typu kroku jest nawiązywanie połączenia z udziałem sieciowym. Czasami czas odpowiedzi serwera jest na tyle długi że w odpowiedzi dostaniemy timeout. Skrypt jest tak napisany aby ponawiać krok do skutku przez określoną ilość razy.

Konfiguracja Windows Credential Manager

Windows Credential Manager to część systemu Windows, która służy do bezpiecznego przechowywania poświadczeń. Dzięki niemu, w konfiguracji nie są przechowywane loginy czy też hasła do udziałów sieciowych zapisane otwartym tekstem. Służy to zwiększeniu bezpieczeństwa.

Jak już napisałem wyżej, PS Simple Backuper może wysyłać kopie do określonej lokalizacji smb. Zwykle kopie zapasowe są przechowywane w lokalizacji wymagającej uwierzytelnienia – co jest właściwą praktyką. Pozwoli to uchronić kopię zapasową przed zaszyfrowaniem, jeśli użytkownik komputera z którego wykonywana jest kopia nie zachowa należytej ostrożności i uruchomi malware szyfrujący dane. Jeśli jednak korzystasz z lokalizacji publicznej (bez logowania), pozostaw atrybut <smb – credentialsVaultName> pusty.

Jeśli chcesz aby skrypt logował się do udziału sieciowego w kontekście określonego użytkownika, zapoznaj się z poniższym opisem.

Aby skrypt był w stanie otworzyć połączenie do udziału sieciowego używając konkretnych poświadczeń, musimy w konfiguracji umieścić nazwę portfela w których zapiszemy poświadczenia. Zwróć uwagę na atrybut <smb – credentialVaultName> w pliku konfiguracyjnym. Tam umieścimy nazwę porfela. Atrybut ten jest definiowany dla każdego zadania <backup> osobno, ponieważ każde zadanie może być wysyłane na inny udział sieciowy z innymi poświadczeniami.

Kroki:
1. Otwórz config.xml wstaw nazwę kontenera z poświadczeniami do atrybutu credentialsVaultName – np. „Backup”.

2. Otwórz Credential Manager i wybierz <New generic credentials>.

3. Dodaj poświadczenia wypełniając wszystkie pola. Pole Internet or network address powinno zawierać nazwę portfela.

Smoke test

Przed skonfigurowaniem zaplanowanego zadania musisz sprawdzić, czy poprawnie skonfigurowałeś narzędzie. Aby to zrobić, po prostu uruchom Powershell (jako inny użytkownik – użyj poświadczeń tego użytkownika, który ma uprawnienia do wykonywania kopii zapasowej bazy danych i jest w stanie połączyć się z udziałem sieciowym, którego kopię chcesz wykonać). W konsoli PowerShell przejdź do folderu głównego narzędzia (tam, gdzie wyodrębniono pobrany pakiet) i uruchom narzędzie, używając polecenia:
. \ RunBackup.ps1
i obserwuj, czy wszystko idzie gładko. Sprawdź, czy plik dziennika został poprawnie utworzony. Jeśli coś jest źle skonfigurowane, zobaczysz błędy w danych wyjściowych skryptu (w konsoli Powershell).
Jeśli wszystko jest w porządku, przejdź do następnej części – Konfiguracja zaplanowanego zadania.

Konfiguracja harmonogramu zadań

Oczywiście tworzenie kopii zapasowej powinno być wykonywane automatycznie w dogodnym momencie – np. w nocy, kiedy nikt nie korzysta z danych. Dlatego powinieneś skonfigurować zaplanowane zadanie z poziomu np. harmonogramu zadań (ew. innego wyzwalacza). Ja preferuje mechanizmy systemu operacyjnego. Więc…

  • otwórz Harmonogram zadań,
  • w lewym panelu utwórz folder Kopia zapasowa i wybierz go,
  • w prawym panelu wybierz opcję Create Task …
  • w oknie Create task wpisz nazwę zadania (dowolne – np. „Kopia zapasowa danych”), jeśli chcesz, wypełnij opis,
  • wybierz Run whether user is logged or not, i Run with highest privileges. Przejdź do zakładki Triggers i kliknij New … i wybierz dogodny dla Ciebie schemat uruchamiania,
  • przejdź do zakładki Actions i kliknij New…
  • wpisz w polu Program / skrypt:% SystemRoot% \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe
  • w polu Add Arguments: -ExecutionPolicy Bypass -File. \ RunBackup.ps1
  • w polu Start in wpisz ścieżkę, w której znajduje się skrypt RunBackup.ps1.
  • potwierdź wszystko i zapisz zadanie. System poprosi o poświadczenia użytkownika w kontekście którego będzie uruchamiany skrypt. Pamiętaj, że ten użytkownik musi mieć prawa do wykonywania kopii bezpieczeństwa baz danych oraz musi mieć prawa do otwarcia udziału z którego kopiujemy dane plikowe (jeśli kopiujesz je z udziału sieciowego).

Troubleshooting

Nie można zalogować się do bazy danych

Rozwiązanie:

Sprawdź czy nazwa instancji w konfiguracji jest poprawna. Sprawdź czy użytkownik, w kontekście którego uruchamiasz skrypt, ma prawo do nawiązywania połączenia z bazą danych i wykonywania kopii.

Tips

  1. Aby nie ułatwić sobie życie definiując konfiguracje zadania <mssql> skopiuj nazwę instancji MSSQL z okienka Connect to server w SQL Menagement Studio – pole Server Name: