Posts tagged PowerShell
[PL] SQL Server 2008 – kopia zapasowa zadań
Apr 28th
Czy kiedykolwiek zdarzyło Ci się, że trzeba było przenosić zadania (ang. jobs) usługi SQL Server Agent? Dość oczywistym sposobem jest wykorzystanie mechanizmu skryptowania dostępnego w SQL Server Management Studio. Po kolei:
- Łączymy się z instancją SQL Server 2008 za pomocą okna Object Explorer (wciśnij F8, by to okno zobaczyć).
- Przechodzimy w drzewie do węzła SQL Server Agent – Jobs.
- Otwieramy okno Object Explorer Details (wciśnij F7, by to okno zobaczyć).
- Zaznaczamy wszystkie zadania w oknie Object Explorer Details, klikamy prawym przyciskiem myszy i wybieramy Script Job as – CREATE To i wybieramy odpowiednią dla nas opcję (do pliku, do nowego okna skryptu, do schowka).
Wszystko dobrze, ale co, gdy taką kopię zapasową zadań musimy wykonywać cyklicznie? Chcemy mieć do tego zadania automat. Pierwsza myśl – użyć T-SQL. Trzeba się jednak nieźle naklepać kodu, by napisać takie narzędzie. Druga myśl – użyć tego, czego używa Management Studio – .NET i bibliotek SMO. Dobry pomysł, ale nadal sporo kodu do napisania. Czy na pewno? Otóż nie, bo z odsieczą przychodzi nam… PowerShell!
A zatem – otwieramy na początek konsolę sqlps.exe (klikamy prawym przyciskiem myszy na nazwie instancji w oknie Object Explorer i wybieramy Start PowerShell).
Na powyższym zrzucie 0809-001 to nazwa mojej maszyny, a DEFAULT oznacza oczywiście instancję domyślną. Gdy nie wiemy, dokąd dalej nawigować w oknie konsoli PowerShell, wystarczy uruchomić komendę dir (jest to tutaj alias na odpowiedni commandlet). Teraz nawigujemy (cd jest kolejnym przydatnym aliasem – działa zupełnie jak w konsolach DOS i umożliwia nawigację po “folderach” SQL Servera) do zbioru zadań usługi SQL Server Agent. U mnie to wyglądało tak:
- cd JobServer
- cd Jobs
- dir
I mamy listę zadań. W konsoli PowerShell wiele klasy SMO są dostępne bez pokrętnego dodawania bibliotek. Praktycznie każdy obiekt dysponuje metodą Script() i ten fakt właśnie można wykorzystać. Gdy w konsoli PowerShell pojawił się prompt:
PS SQLSERVER:\SQL\0809-001\DEFAULT\JobServer\Jobs>
wpisałem coś takiego:
dir | %{$_.Script()}
I dostałem kod T-SQL zawierający definicje zadań. Kod niestety niedoskonały, ale w zasadzie brakowało w nim jedynie odseparowania każdej definicji końcem wsadu (słowem GO).
Czyli skryptować zadania w PowerShell już umiem. Teraz zapis do pliku. Nic prostszego. Lekka modyfikacja dopiero co uruchomionego skryptu:
dir | %{$_.Script()} >> C:\jobs.sql
I mam zapisane definicje zadań w pliku C:\jobs.sql. Oczywiście – warunkiem jest to, by wskazać folder, do którego SQL Server (a w zasadzie konto Windows przydzielone do tej usługi) ma prawo zapisu.
I teraz ostateczny szlif. Jak spowodować, żeby – po pierwsze – taki skrypt PowerShell był uruchamiany cyklicznie i – po drugie – by za każdym razem wynikowy kod T-SQL lądował w nowym pliku (np. oznaczonym datą i godziną)?
Skoro cyklicznie, to pewnie wypada użyć zadania usługi SQL Server Agent. Tworzymy więc nowe zadanie:
- W oknie Object Explorer przechodzimy do węzła SQL Server Agent – Jobs.
- Klikamy prawym przyciskiem myszy na węźle Jobs i wybieramy New Job….
- Wpisujemy nazwę zadania (pole Name) i po lewej stronie okna New Job wybieramy opcję Steps, a następnie klikamy na przycisku New…
- Wpisujemy nazwę nowego kroku zadania (pole Name), a następnie z rozwijanej listy Type wybieramy PowerShell.
- W polu Command wpisujemy skrypt PowerShell. W moim przypadku wyglądał on tak:
$data = Get-Date –Format yyyyMMddHHmm
dir SQLSERVER:\SQL\0809-001\DEFAULT\JobServer\Jobs | %{$_.Script() + “GO”} >> C:\backup_jobs_$data.sql
Pierwsza linijka skryptu ustawia jako obiekt $data bieżącą datę i czas zapisaną w odpowiednim formacie. Druga linijka dla każdego zadania uruchamia metodę Script(), dokleja do treści zadania zamknięcie wsadu (GO), a całość zeskryptowanego kodu T-SQL zapisuje do pliku o zmiennej nazwie, np. C:\backup_jobs_201004282220.sql.
Teraz pozostaje już tylko wybrać harmonogram dla zadania i przetestować (oczywiście, usługa SQL Server Agent musi być uruchomiona). U mnie działa. Wykorzystałem ten mechanizm także u klienta, który miał potrzebę przenoszenia zadań między serwerami zawierającymi bazy sprzężone mechanizmem log shippingu. PowerShell zaoszczędził mi w tym przypadku wiele pracy.
Przy okazji – polecam sesje Łukasza Grali poświęcone wykorzystaniu PowerShell do administracji systemem SQL Server 2008. Sesje te są organizowane przez portal VirtualStudy.pl (gratulacje dla prowadzących portal z okazji rocznicy istnienia portalu – tak trzymać!).
[PL] VirtualStudy.pl – dużo o SQL Server 2008 i PowerShell
Feb 2nd
Już za dwa tygodnie, w poniedziałek 15 lutego, startuje nowa seria spotkań online zorganizowana wspólnie przez portal VirtualStudy.pl i Polską Grupę Użytkowników SQL Server (PLSSUG). Tym razem seria, pod wiele mówiącym tytułem – “SQL Server 2008 nie tylko dla orłów”, będzie przeznaczona dla osób, które chcą poznać od podstaw system Microsoft SQL Server 2008 i język Transact-SQL (poprzednia seria była ukierunkowana na przygotowanie do egzaminu 70-432). Jeżeli nie znasz Microsoft SQL Server, a chcesz go poznać i to w najnowszej odsłonie, zapraszam serdecznie. Będę jednym z prelegentów w tej serii (poprowadzę dwie prezentacje poświęcone typom danych w SQL Server 2008). Spotkania będą odbywały regularnie w poniedziałki. Jak zwykle wykorzystamy technologię Live Meeting. Wstęp jest całkowicie darmowy (wymagana jest jedynie rejestracja na portalu VirtualStudy.pl). Polecam.
A już za tydzień, 8 lutego, rozpocznie się inna, równie ciekawa seria – o PowerShell. Najpierw Grzegorz Tworek (Microsoft MVP – Enterprise Security) poprowadzi trzy prezentacje o tworzeniu skryptów PowerShell od podstaw po bardziej zaawansowane zagadnienia (WMI), a później lider poznańskiego oddziału PLSSUG – Łukasz Grala – poprowadzi dwie prezentacje o wykorzystaniu PowerShell w SQL Server 2008. Bezwzględnie warto to zobaczyć.
Dodam jeszcze, że wszystkie prezentacje są nagrywane i udostępniane online na portalu VirtualStudy.pl. Zachęcam jednak do oglądania ich na żywo, bo wówczas można podjąć dyskusję z prelegentem i innymi uczestnikami spotkania.









