2014-12-12
Dziwny przypadek. Na serwerze X jest zainstalowany SQL. Serwer działa wykorzystując domenowe konto serwisowe. Do serwera X z zainstalowanym SQL można się bez problemu dostać lokalnie, ale przy próbie połączenia zdalnego dostawało się komunikat:
TITLE: Connect to Server
Cannot connect to serverX.
The target principal name is incorrect. Cannot generate SSPI context. (Microsoft SQL Server, Error: 0)

Większość artykułów jakie znajdowałem w Internecie wskazywała na problem z SPN. Komenda:
setspn -L serverX
listuje wszystkie SPN związane z danym komputerem, a dokładniej z kontem tego komputera w AD (serverX$). W moim przypadku znajdowałem tu również:
C:\>setspn -L ServerXRegistered ServicePrincipalNames for CN=ServerX,OU=W2k12,OU=App,OU=Company,OU=Servers,OU=com,DC=domain:
MSSQLSvc/ServerX.domain.com:1433
MSSQLSvc/ServerX.domain.com
TERMSRV/ServerX
TERMSRV/ServerX.domain.com
WSMAN/ServerX.pl.domain.com
WSMAN/ServerX
RestrictedKrbHost/ServerX
HOST/ServerX
RestrictedKrbHost/ServerX.domain.com
HOST/ServerX.domain.com Czytaj dalej »
2014-12-10
Jeśli bawiłeś się z makrami zapisanymi w skoroszycie makr osobistych, to zostały one zapisane w personal.xlsb. Skoroszyt znajduje się w
c:\users\<username>\AppDataW\Microsoft\Excel\XLSTART
Excel domyślnie otwiera pliki, które tu się znajdują przy uruchomieniu programu. W moim przypadku wystarczyło usunąć ten plik z tego folderu (nie był mi potrzebny) i od tej pory Excel nie otwiera dodatkowego niepotrzebnego okna.
2014-11-20
Początek niby niewinny. Brak miejsca w bazie. Powinno wystarczyć powiększyć plik, albo zdać się na Autogrow. Okazało się jednak, że wykonanie jakiejkolwiek czynności na bazie się nie wykonuje, bo jest blokowane przez inne procesy. Nawet proste otwarcie okienka properties dla bazy danych kończyło się komunikatem o lockach.
Rzut oka w sp_who lub Activity Monitora (z filtrem na tą jedną wybraną bazę danych) i już widać niepokojący stan bazy. Dużo zablokowanych procesów, praktycznie nic się nie dzieje, wszystko stoi, a Head Blockerem jest systemowy proces mirroringu. Jakimś rozwiązaniem byłoby wyłączenie mirroringu i skonfigurowanie go na nowo. To jednak dość mocny krok, jak na proste zablokowanie się procesów…
Pomocna okazała się komenda:
ALTER DATABASE MyDB SET PARTNER SUSPEND
a po sprawdzeniu, że blokady minęły
ALTER DATABASE MyDB SET PARTNER RESUME
Okazało się, że w nocy coś było nie tak z siecią i mirroring napotkał pewne problemy, które dotknęły właśnie tą jedną bazę danych (inne działały poprawnie). Oto próbki komunikatów znalezionych w ERRORLOG:
Database mirroring connection error 4 'An error occurred while receiving data: ’64(failed to retrieve text for this error. Reason: 15105)’.’ for 'TCP://server_name.domainname:5022′.
Database mirroring is inactive for database 'MyDB’. This is an informational message only. No user action is required.
2014-11-10

W dniach 4-7 listopada uczestniczyłem w konferencji Pass Summit 2014. Największa konferencja dla ludzi SQL odbywała się w Seattle. Oto sesje, w których uczestniczyłem:
- SQL Server 2014: In-Memory Overview Kevin Farlee DBA-321-M
- Upgrading and Migrating SQL Server John Martin DBA-410-M
- Latches, Spinlocks, and Lock Free Data Structures Klaus Aschenbrenner DBA-405
- SQL Server 2014: ColumnStore Index Sunil Agarwal DBA-318-M
- Query Tuning Mastery: Manhandling Parallelism, 2014 Edition Adam Machanic AD-400
- Solving Complex Problems with Extended Events Jonathan Kehayias DBA-406
- Maintaining High Performance When Using Encryption Steve Jones DBA-312
- Tuples, Sets, and Members: Understanding the Basics of MDX Brian Larson BIA-311
- Troubleshooting AlwaysOn Availability Groups in SQL 2014 Trayce Jordan DBA-404-M
- Shortcuts to SSIS via C#.Net – EzAPI Paul Rizza BIA-316-M
- Enter the Dragon: Running SQL 2014 on Windows Server Core Mark Broadbent DBA-310
- Deep Dive into Power Query Formula Language Matt Masson, Theresa Palmer-Boroski BID-401-M
- High Performance Infrastructure for SQL Server 2014 Michael Frandsen DBA-403
Więcej:
http://www.sqlpass.org/summit/2014/Live.aspx
lub
https://www.sqlpass.org/
2014-10-22
Data Driven subscription skonfigurowane, ale nie działa…. Jak znaleźć punk zaczepienia?
Zajrzyj do logów (w katalogu SSRS podkatalog logs). Każdy plik to log z ostatniego uruchomienia SSRS. Poszukaj w nim:
library!WindowsService_48!dc8!10/21/2014-13:15:03:: i INFO: Schedule 8da1eeb1-1656-4e67-87de-e297814b3673 executed at 10/21/2014 13:15:03.
schedule!WindowsService_48!dc8!10/21/2014-13:15:03:: Creating Time based subscription notification for subscription: 64b6ea63-b6b8-4378-869e-a93d1d96f4c6
library!WindowsService_48!dc8!10/21/2014-13:15:03:: i INFO: Schedule 8da1eeb1-1656-4e67-87de-e297814b3673 execution completed at 10/21/2014 13:15:03.
library!WindowsService_48!dc8!10/21/2014-13:15:03:: i INFO: Handling data-driven subscription 64b6ea63-b6b8-4378-869e-a93d1d96f4c6 to report
/FOLDER_NAME/SUBFOLDER_NAME/REPORT_NAME, owner: USERNAME, delivery extension: Report Server Email.
library!WindowsService_48!dc8!10/21/2014-13:15:04:: i INFO: Initializing EnableExecutionLogging to 'True’ as specified in Server system properties.
library!WindowsService_48!1f4c!10/21/2014-13:15:05:: i INFO: Initializing EnableExecutionLogging to 'True’ as specified in Server system properties.
library!WindowsService_48!1f4c!10/21/2014-13:15:05:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.InvalidReportParameterException: ,
Microsoft.ReportingServices.Diagnostics.Utilities.InvalidReportParameterException: Default value or value provided for the report parameter 'CollectionID’ is
not a valid value.;
W tym przypadku widzimy, że collectionID ma niepoprawną wartość. Oznacza to, że tabela zasilająca data driven subscription przechowuje niepoprawne wartości lub wartości niepoprawnego typu. Popraw, aż w końcu w logu znajdziesz informację o poprawnym uruchomieniu subskrypcji: Czytaj dalej »
2014-10-14
Wykonujesz polecenie, a tu fiuuuu, wszystko przeleciało przez ekran. Wolałbyś żeby wyniki pokazywane były partiami, po jednym ekranie, a np. po naciśnięciu SPACE ładował się kolejny ekran. Zastosuj
Get-process | Out-Host -Paging
Po wyświetleniu pierwszego ekranu otrzymasz prompt:

No ale…. czasami możesz też dostać błąd:
out-lineoutput : Metoda lub operacja nie jest zaimplementowana.
At line:1 char:1
+ Get-process | Out-Host -Paging
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [out-lineoutput], NotImplementedException
+ FullyQualifiedErrorId : System.NotImplementedException,Microsoft.PowerShell.Commands.OutLineOutputCommand
Jak to Metoda lub operacja nie jest zaimplementowana. !!! Microsoft zapomniał i wypuścił taki produkt w świat!?
Nie… Jest to przykład parametru zależnego od hosta (gdzie przez host rozumiemyprogram uruchamiający polecenia powershell). Stronicowanie działa poprawnie w interfejsie znakowym, ale w ISE nie jest zaimplementowane. Tam masz się bawić suwaczkami i przewijać wynik… Na otarcie łez, pamiętaj, że w ISE możesz korzystać z Out-GridView:
Get-process | Out-GridView

2014-10-14
Polecenie Sort-Object układa obiekty przyjęte z poprzedniego polecenia w zadanej kolejności, np.
Get-Process | Sort -property CPU -Desc
sortuje procesy umieszczając na początku te, które najbardziej obciążyły procesor. Jednak co zrobić, aby zwracane pozycje miały dodatkowo numer wiersza (proces najbardziej obciążający CPU numer 1, kolejny numer 2 itd.)?
Rozwiązanie 1
$i=0
Get-Process | sort -Property cpu -Descending |
select id, processname, @{n=”Row number”;e={$i+=1; $i}}
Fajne, ale nie działa…. w/w polecenie zawsze wyświetli jedynki w kolumnie Row Number. Dlaczego? Wyrażenie e={$i+=1; $i} „nie widzi” zadeklarowanej wcześniej zmiennej $i, Dlatego zawsze $i na początku jest równe 0, potem jest zwiększane o 1 i zwracana jest jedynka. Dzieje się tak dla każdego procesu przechodzącego do polecenia Select.
Zmienną $i można jednak „awansować” na zmienną skryptu:
$script:i=0
Get-Process | sort -Property cpu -Descending |
select id, processname, @{n=”Row number”;e={$script:i+=1; $script:i}}
To działa! Zmienna $script:i jest poprawnie „widziana” przez skrypt i wszelkie wyrażenia w skrypcie. Ta zmienna jest globalna dla całego skryptu!
Rozwiązanie 2
Bazujemy tu o cmdlet Foreach-Object. Dla każdego obiektu zwiększamy wartość $rowNumber, a potem zwracamy wynik przez return $rowNumber,$_
$rowNumber=0
Get-Process | sort -Property cpu -Descending |
% { $rowNumber+=1; return $rowNumber,$_}
Niestety, to nie jest ładne rozwiązanie… zwracana liczba jest niezależna od zwracanego procesu, nawet na ekranie prezentuje się to brzydko…, ale:
Get-Process | sort -Property cpu -Descending |
% { $rowNumber+=1; $ret = $_ | Add-Member -NotePropertyName RowNumber -NotePropertyValue $rowNumber -PassThru; return $ret} |
select Id, Process, RowNumber
zadziała dobrze. Co tu się dzieje? W ForEach-Object do obiektu proces (reprezentowany przez $_) jest dodawana właściwość „RowNumber” o wartości „$rowNumber”. Ponieważ obiekt typu proces nie pozwala na dodawanie właściwości, dodajemy parametr PassThru. Parametr powoduje utworzenie nowego obiektu, który odziedziczył wszystkie właściwości z typu proces i dodał nową właściwość RowNumber.
Natchnienie do rozwiązania numer 2 pochodzi z http://technet.microsoft.com/en-us/library/hh849879.aspx