Automatyzacja zadań w SQL Server Express

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 -?

sqlcmd_options

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.

sqlcmd_interactive

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()"

sqlcmd_query

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

sqlcmd_input_file

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ń
    Harmonogram_zadan_Plan_backupu_bazy_01
  • Określenie akcji (jaki program lub skrypt ma być uruchomiony)
    Harmonogram_zadan_Plan_backupu_bazy_02
  • Określenie harmonogramu (Wyzwalacze)
    Harmonogram_zadan_Plan_backupu_bazy_03

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.

6 Responses

  • 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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.