Firma Microsoft, podobnie jak inni producenci najważniejszych, komercyjnych systemów bazodanowych (ORACLE, IBM) udostępnia darmową (również do zastosowań komercyjnych) wersję serwera baz danych – SQL Server, edycja Express.
Jest ona okrojona w stosunku do pełnych edycji, przede wszystkim w zakresie możliwości wykorzystania wysoko wydajnego, skalowalnego środowiska, a także jeśli chodzi o zakres funkcjonalności. Nie mniej jednak, od strony możliwości silnika bazodanowego – darmowa wersja Express, sprawdza się znakomicie w wielu zastosowaniach komercyjnych. Pełne porównanie możliwości poszczególnych edycji SQL Server 2012 znajdziesz tutaj.
Najbardziej dotkliwe ograniczenia, związane są z maksymalnym rozmiarem bazy (w SQL Server Express 2012 jest to max 10 GB/bazę) oraz okrojonymi zasobami hardware, które będą wykorzystane do obsługi procesu serwera (max 1 procesor lub 4 rdzenie oraz max 1GB pamięci RAM). Są one szczególne dotkliwe i nieakceptowalne w większych środowiskach, jednak SQL Server Express jest bardzo dobrym rozwiązaniem do małych, mniej wymagających środowisk. Poza tym nic nie stoi na przeszkodzie, aby w miarę rozwoju firmy, przejść do wersji mocniejszej – płatnej.
Poza ograniczeniami związanymi z zasobami, jednym z ograniczeń funkcjonalnych w porównaniu z płatnymi wersjami, jest brak SQL Server Agent. Jest to usługa odpowiedzialna m.in. za wykonywanie zaplanowanych działań. Obojętnie czy będą to zadania (JOBy) serwisowe, administracyjne czy np. synchronizujące, replikujące dane (import, export) – w SQL Server Express musimy użyć innych metod do automatycznego uruchamiania zaplanowanych procesów.
Automatyzacja zadań w środowisku bazodanowym jest bardzo przydatna i praktycznie w każdym wdrożeniu jest stosowana (chociażby do robienia kopii zapasowych). Jednym ze sposobów na obejście braku SQL Agent w SQL Server Express, jest wykorzystanie narzędzia linii poleceń SQLCMD, uruchamianego za pomocą standardowego harmonogramu zadań w Windows (Windows Scheduler). Do realizacji automatyzacji, można zaprząc również usługę Brokera (Service Broker), jednak nie będę tej metody tutaj opisywał.
Artykuł ten jest poświęcony rozwiązaniu bazującego na połączenia możliwości SQLCMD i Harmonogramu zadań Windows.
SQLCMD czyli dostęp do SQL Server z linii poleceń
SQLCMD to proste narzędzie, za pomocą którego możemy łączyć się z instancją SQL Server i wykonywać dowolne polecenia T-SQL. Jest następcą OSQL, znanego z SQL Server 2000 i powinno być używane zawsze, jeśli chcemy wykonywać jakiekolwiek polecenia T-SQL z linii poleceń (w SQL Server 2012, OSQL nie jest już dostępny).
Połączenie do bazy SQL Server za pomocą SQLCMD
Za pomocą SQLCMD możemy łączyć się z wybranym serwerem i wykonywać polecenia, kwerendy T-SQL w trybie interaktywnym lub automatycznym. Użycie tego toola jest proste, wystarczy wskazać instancję, sposób uwierzytelniania i już możemy połączyć się z SQL Server. Pełen zakres parametrów, które możemy użyć, wyświetli standardowa flaga -? (tu SQLCMD w wersji 10.5 czyli z SQL Server 2008 R2):
C:\>sqlcmd -?
Jeśli instancja SQL Server do której chcesz się połączyć jest nazwana i chcesz użyć zintegrowanego uwierzytelniania Windows, trzeba zastosować flagi wskazujące serwer : –S server_name oraz tryb autentykacji –E (trusted connection). W ten prosty sposób, uzyskasz połączenie z serwerem w ramach autentykacji Windows (aktualnego konta). Będziesz połączony ze „swoją” domyślną bazą danych, właściwą dla konta w którego kontekście się logujesz.
C:\sqlcmd -S MyServer\SQLEXPRESS -E
W trybie interaktywnym, możemy wprowadzać polecenia SQL linia po linii, aby je wykonać użyj komendy GO.
Nie będę tu opisywał wszystkich możliwości narzędzia SQLCMD, bo nie jest to przedmiotem tego artykułu, ograniczę się tylko do tego co istotne w kontekście automatyzacji, wykonywania zadań.
Wykonywanie skryptów T-SQL za pomocą SQLCMD
Polecenia T-SQL możemy wykonywać za pomocą SQLCMD w trybie interaktywnym lub nazwijmy to automatycznym (bez interakcji użytkownika). W naszym scenariuszu, interesujące będą dwie opcje.
Opcja QUERY : czyli flaga -Q – umożliwia wykonanie dowolnej kwerendy (Query) za pomocą SQLCMD bez konieczności wchodzenia w tryb interaktywny. Po prostu określona kwerenda lub batch (może to być przecież szereg komend T-SQL) zostanie wykonana na danym serwerze w kontekście konta określonego w parametrach połączenia.
C:\sqlcmd -S MyServer\SQLEXPRESS -E -Q "SELECT getdate()"
Opcja INPUT FILE : flaga – i – pozwala na wykonanie skryptu T-SQL, zapisanego w pliku wejściowym (input file). Może to być dowolny skrypt zapisany w pliku tekstowym, wykonujący określone zadania. Dla prostego przykładu, załóżmy że nasz skrypt będzie wykonywał prostą operację backupu. Zawartość pliku backup_script.sql niech wygląda następująco :
DECLARE @FileName varchar(100), @BackupName varchar(100)
SET @FileName = N'D:\Backups\TEST_FULL_BACKUP_' +
Replace(Convert(varchar(10),getdate(),120),'-','_') + '.bak'
SET @BackupName = N'Test-Full Database Backup from ' +
Convert(varchar(10),getdate(),120)
-- skrypt uruchamiany codziennie, unikalna nazwa pliku
PRINT @FileName + char(10) + @BackupName + char(10) + REPLICATE('-',50)
BACKUP DATABASE [TEST] TO DISK = @FileName
WITH FORMAT,
NAME = @BackupName
Dwa słowa komentarza. Skrypt ten będzie tworzył pełen backup bazy danych TEST, zapisywał go do pliku o nazwie zawierającej bieżącą datę. Taka forma może być przydatna, jeśli zadanie to będzie wykonywane np. raz dziennie i chcemy, żeby każdy backup był w osobnym pliku (stąd konieczność zapewnienia unikalnej nazwy).
Wywołanie teraz SQLCMD z parametrem –i (input file) będzie następujące :
C:\sqlcmd -S MyServer\SQLEXPRESS -E -i D:\temp\backup_script.sql
Zatem wiemy już w jaki sposób działa SQLCMD i jak możemy wywołać dowolne skrypty T-SQL z linii poleceń. Jedyne co nam pozostało do realizacji celu automatyzacji zadań w SQL Server Express to wyzwalanie skryptów automatyczne. Do tego celu idealnie nadaje się Harmonogram Zadań Windows.
Planowanie zadań w Harmonogramie zadań (Windows Scheduler)
Windows Scheduler to usługa pozwalająca na zdefiniowanie zadań w ramach serwera / stacji roboczej, pracującej pod kontrolą systemu operacyjnego Windows. Zdefiniowanie nowego zadania jest bardzo proste. Sprowadza się w zasadzie do wskazania programu lub skryptu, który będzie uruchamiany zgodnie z określonym harmonogramem. Możemy także określić konto (login) w kontekście którego dane zadanie zostanie wykonane.
W naszym scenariuszu, będziemy chcieli wywołać skrypt backupu bazy TEST, za pomocą już znanej składni SQLCMD oraz przygotowanego wcześniej skryptu T-SQL (plik backup_script.sql). Ponadto, będziemy chcieli dokonać kompresji (zip) tegoż i na koniec zrobimy mały porządek. Skasujemy wszystkie starsze niż 14 dni kopie zapasowe oraz inne, niespakowane zipem pliki w katalogu backupów.
Na początek utwórzmy skrypt (batch) o nazwie backup_bazy_TEST.bat. Skrypt ten będzie odpalany automatycznie codziennie. Zawartość pliku :
sqlcmd –S SQLEXPRESS -E –iD:\temp\backup_script.sql set dt=%DATE% set dt = %dt:-=_% zip d:\backs\TEST_FULL_BACKUP_%dt:-=_%. zip d:\backs\TEST_FULL_BACKUP_%dt:-=_%.bak Forfiles -p D:\backs\ -s -m TEST_FULL_BACKUP*.zip -d -7 -c "cmd /c del /q @path" del D:\backs\*.bak
To co najważniejsze, dzieje się tak naprawdę w pierwszej linii– uruchomienie skryptu backupu bazy. Następnie przypisanie do zmiennej dt informacji o bieżącej dacie, aby móc odpowiednio obsłużyć (spakować), utworzony plik backupu. Na koniec stosuję narzędzie FORFILES do skasowania wszystkich plików backupu starszych niż 14 dni. Oczywiście można użyć kompresje już w trakcie jego tworzenia, potraktuj ten przykład czysto edukacyjnie – chodziło mi o pokazanie szeregu działań w zadaniu.
Mamy więc plik skryptu, teraz trzeba zaplanować zadanie w ramach którego będzie on uruchamiany.
Poniżej kilka kluczowych screenów.
- Dodanie nowego zadania w harmonogramie zadań
- Określenie akcji (jaki program lub skrypt ma być uruchomiony)
- Określenie harmonogramu (Wyzwalacze)
Podsumowanie
Pomimo swoich ograniczeń funkcjonalnych, w SQL Server Express jesteśmy w stanie wykonywać dowolne zadania automatycznie. Pokazany w tym przykładzie skrypt backupu, mógłby być w prosty sposób rozszerzony o pełne logowanie samego procesu, czy backup zakończył się powodzeniem, ile trwał, wysyłać powiadomienia mailowe w przypadku wystąpienia błędu.
Ostatnia linijka najlepsza: del D:\backs\*.bak
Masz je spakowane .zip więc wersje nie spakowane nie są już potrzebne 😉 zresztą to tylko przykład
Bardzo fajny artykuł, dobrze napisany. Jeżeli miałbym się do czegoś przyczepić, to polecenie „zip” nie jest dostępne z linii komend, natomiast „compact” już tak. Program 7zip posiada również wersję przeznaczoną dla linii komend, która umożliwia wykonanie kompresji z wiersza poleceń.
Pozdrawiam.
Z tym poleceniem „zip” to bardzo subiektywna sprawa 🙂 Ja akurat korzystam z zipa i mam go dostępnego w linii poleceń, ale fakt – u Ciebie może go nie być… to tylko przykład.
Bardzo przydatne informacje. Dziękuję i pozdrawiam.
Dokładnie i rzeczowo , dzięki. Dobry artykuł, dzięki.