USER32: The attempt by user DOMAIN\USERNAME to restart/shutdown computer COMPUTERNAME failed

2015-07-07

Znalazłem taki wpis w event logu. Panika w oczach. Przecież wcale nie próbowałem wyłaczać serwera! O co chodzi? Za długo się siedzi po nocach czy co? Zaburzenia świadomości? Chwila poszukiwań pozwoliła ustalić przyczynę.

Podczas wylogowywania się z sesji zdalnej, miałem ciągle otwarte SQL Server Management Studio, które nie chciało się poprawnie zamknąć. Dostałem komunikat, mówiący, że nadal mam otwarte pewne aplikacje i Windows dał mi możliwość anulowania wylogowania. Super. Kliknąłem „Cancel”.

Niestety czy to aplikacja, czy Windows niepoprawnie obsługuje zdarzenie „Anulowanie wylogowania” i zamiast tego wpisuje do dziennika zdarzeń „Anulowanie wyłączenia serwera”. Że tak powiem, chyba pewna różnica między jednym a drugim chyba jednak jest!

Microsoft opublikował specjalną łatkę na tą dziurę:

https://support.microsoft.com/en-us/kb/2627489#/en-us/kb/2627489

Wpisy, które naprowadziły mnie do tego znaleziska:

http://serverfault.com/questions/371282/thttp://discussions.citrix.com/topic/271862-disconnecting-ica-session-attempts-to-restartshutdown-the-server/he-attempt-by-user-domain-user-to-restart-shutdown-computer-server-failed

 

Sprawdzenie wielkości clustra dyskowego

2015-07-06

SQL przechowuje dane na stronach

Każda strona ma 8KB

SQL czyta dane z dysku w extentach (1 extent = 8 * strona, czyli 64KB)

Dlatego dobrze by było gdyby wielkość clustra na dysku wynosiła również 64 KB. Poniższa komenda pozwala sprawdzić rozmiar clustra dyskowego:

fsutil fsinfo ntfsinfo [drive letter]

By Rafał Kraik in SQL

Powershell i SQL 08 – Informacje o instancji, zapytania

2015-07-05

W kolejnym przykładzie, spróbujemy uzyskać kilka informacji o instancji. Ponieważ informacje wyciągniemy z serwera wykorzystując zapytanie, przy okazji dowiesz się także jak uruchamiać zapytania na wybranej instancji SQL serwera w inny sposób niż pokazaliśmy to w części drugiej serii.

Zaczynamy od załadowania modułu SQLPS:

Import-Module sqlps

Zakładamy, że chcemy uzyskać informacje z kilku instancji SQL, więc przygotowujemy zmienną przechowującą listę nazw tych instancji. U nas dwa razy odwołamy się do tej samej instancji, ale to tylko dlatego, że na aktualnie wykorzystywanym komputerze jest zainstalowana tylko jedna instancja (proszę o wyrozumiałość):

$Servers = 'localhost','localhost'

Teraz pora zdecydować, co chcemy odczytać z tych instancji. Będzie to po prostu zapytanie do uruchomienia

$query = "SELECT SERVERPROPERTY('ServerName') As ServerName, 
                 SERVERPROPERTY('ProductVersion') As ProductVersion, 
                 SERVERPROPERTY('Edition') AS Edition"

No i pora na uruchomienie zapytania. Można to zrobić co najmniej na dwa sposoby:

1. – Wykorzystamy parametr -ServerInstance polecenia Invoke-Sqlcmd. Lista serwerów jest przekazywana potokiem do ForEach, który z kolei wywołuje Invoke-Sqlcmd na aktualnie iterowanej nazwie instancji:

 $Servers | foreach { $server = "$_"; Invoke-Sqlcmd -query $query -ServerInstance $server }

server_info

Czytaj dalej »

SQL: Przykładowe dane do testowania wydajności aplikacji

2015-07-03

Microsoft dostarcza do testowania MS SQL Server przykładowe dane w postaci szkoleniowej bazy danych AdventureWorks. Wielu na nią narzeka, że zbyt skomplikowana. Dawniej można było uczyć się i ćwiczyć na bazie NorthWind lub Pubs. Były to bazy o o wiele prostszej strukturze. Przykładowe bazy można pobrać z:

Ostatnio jednak kolega potrzebował bazy większej niż AdventureWorks. Chodziło o testowanie aplikacji, która na różne sposoby pobierała by dane. Nie wystarczało zwykłe złączenie sys.objects z samym sobą, bo dane miały mieć strukturę hierarchiczną. Kilka prób i poniżej masz skrypt, który podwaja zamówienia (przepisując istniejące). Skrypt można uruchamiać nawet kilka razy, co spowoduje zawsze podwajanie rekordów w tabelach Sales.OrderHeader i Sales.OrderDetail: Czytaj dalej »

By Rafał Kraik in SQL

Powershell i SQL 07 – Protokoły sieciowe

2015-07-03

Jedno z zadań administratora bazy danych, wykonywane zazwyczaj zaraz po zainstalowaniu SQL jest konfiguracja protokołów sieciowych. Mamy do skonfigurowania dwa rodzaje protokołów: protokoły klienckie oraz protokoły serwera. Zaczynamy od protokołów klienckich.

Oczywiście pierwszy krok to załadowanie SMO:

[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.SqlWmiManagement")
$mc = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer localhost

I właściwie już jesteśmy u celu. Obiekt managed computer pozwala na odwołanie się do kolekcji ClientProtocols. Tak sprawdzisz, które protokoły są włączone:

$mc.ClientProtocols | Select Name, Urn, IsEnabled

Jeśli chcesz sprawdzić stan jednego protokołu. Wyślij wynik poprzedniego polecenia do Where-Object, a jeśli chcesz się odwoływać do tego protokołu w swoim skrypcie zapisz wynik w zmiennej:

$cp = $mc.ClientProtocols | Where { $_.name -eq 'np' }

Tak uzyskane obiekty pozwalają na modyfikowanie ustawień klienckich protokołów sieciowych z poziomu powershell. Aby wyłączyć protokół Named Pipes posłuż się instrukcją:

$cp.IsEnabled = $false
 $cp.Alter()
 $mc.Refresh()

Przypisanie wartości $false do właściwości IsEnabled zmienia tę właściwość tylko w zmiennej, nie na systemie. Polecenie Alter wysyła zmiany do serwera i od tej pory protokół jest rzeczywiście wyłączony. Polecenie Refresh odświeża obiekt, który sam nie śledzi możliwych zmian wykonywanych w systemie. Pora sprawdzić, czy protokół jest rzeczywiście wyłączony:

$mc.ClientProtocols | Select Name, Urn, IsEnabled

protocols

Naturalnie można pracować z protokołami jeden po drugim budując pętlę, ale to już mniej zasługa SMO, a raczej swoistego uroku powershell: Czytaj dalej »

Powershell i SQL 06 – Instancje i usługi

2015-07-02

Administrator SQL uwielbia  życie w swoim zamkniętym SQL-owym świecie. Czasem jednak administrator musi obejrzeć swój serwer z zewnątrz. Odpowiedzieć na pytanie ile instancji jest zainstalowanych, jakie usługi w ramach tych instancji zostały wybrane albo jakie konta są przez te usługi wykorzystywane. Nowe wersje SQL nierzadko pozwalają odpytać o takie informacje z wykorzystaniem widoków (jak np select * from sys.dm_server_services) bez odczytywania informacji z rejestru. A my przyjrzymy się, jak wykonać te zadania z poziomu powershell.

Zacznijmy od czegoś prostego. Get-Service zwraca informacje o wszystkich usługach w systemie Windows. Dlaczego więc, szukając informacji o SQL nie zawęzić listy usług do tych, które zawierają w nazwie SQL:

Get-Service *sql*

Tak, to prawda. Wystarczyłoby, żeby ktoś uruchamiał własną usługę o nazwie np. SQLAudit i to polecenie też złapie tę usługę. Polecenie nie jest więc idealne, ale i tak zadziała na prawie 90% systemów. Jeśli trzeba zmienić pewne ustawienia usługi np. przestawienie usługi SQL Browser z trybu disabled na manual wykonasz poleceniem:

Set-Service sqlbrowser -StartupType Manual

a uruchomienie usługi to:

Start-Service sqlbrowser

Standardowe polecenie Get-Service nie zwraca zbyt szczegółowych informacji. Jeśli np. chcesz zobaczyć na jakim koncie pracuje usługa SQL lepiej będzie skorzystać z Get-WMIObject. Poniższe polecenie zwraca dość szczegółowe informacje o każdej usłudze, która w nazwie zawiera SQL: Czytaj dalej »

Powershell i SQL 05 – Backup i restore

2015-07-01

Jeśli chcesz zautomatyzować backup możesz korzystać z SQL Server Agenta, poleceń linii komend połączonych z sqlcmd i wielu innych ale między innymi skorzystać można z poleceń modułu sqlps. Zaczynamy więc od załadowania modułu:

Import-Module sqlps

Od tej pory masz do dyspozycji polecenie Backup-SQLDatabase. Oto przykład, w którym wykonujemy backup bazy danych AdventureWorks2014 na lokalnej domyślnej instancji SQL. Wykonywany jest pełny backup bazy do pliku:

Backup-SqlDatabase -ServerInstance localhost -Database "AdventureWorks2014" `
                   -BackupAction Database -BackupFile c:\temp\aw2014.bak

Ale niby dlaczego mamy korzystać z powershell, skoro jest tyle innych metod. Jeśli znasz już trochę powershella, to wiesz jak łatwo np utworzyć nazwę pliku pobierając datę, nazwę hosta itp. Oto przykład, w którym backup ma być wykonany do pliku, którego nazwa odpowiada dacie backupu:

$date = Get-Date -Format yyyyMMdd
$file = 'c:\temp\aw2014_'+$date+".bak"
Backup-SqlDatabase -ServerInstance localhost -Database "AdventureWorks2014" `
                   -BackupAction Database -BackupFile $file

Czytaj dalej »