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
2014-10-13
Jak wykonać upgrade na serwerze pracującym w sesji mirroringu:
a. backup
b. usuń witness (aby nie dochodziło do automatycznego przełączenia w czasie przeprowadzanych prac)
c. zmiana trybu na High safety without automatic failover (synchronous)
d. failover wszystkich baz na jeden serwer (np. SQL-1)
e. upgrade na mirrorze (np. SQL-2)
f. po aktualizacji failover na zupgradowanego mirrora (czyli z SQL-1 na SQL-2)
g. upgrade na aktualnym mirrorze (czyli SQL-1)
h. odwrócenie kroków z (b) i (c).
Szczegóły:
http://msdn.microsoft.com/en-us/library/bb497962.aspx
Microsoft wspiera tu nawet upgrade z wersji np. 2008 do 2012 w ten sam sposób. Szczegółowy opis procedury:
http://msdn.microsoft.com/en-us/library/bb677181(v=sql.110).aspx
2014-10-09
Chcesz utworzyć nowy dysk w postaci pliku VHD np. aby podpiąć go w maszynie wirtualnej lub wykorzystać go do jakiś testów w swoim systemie operacyjnym.
1. Uruchom zarządzanie komputerem
2. Przejdź do Magazyn >> Zarządzanie dyskami
Czytaj dalej »
2014-10-09
Ten proxy określa, jakie konto zostanie użyte podczas wywołania procedury xp_cmdshell, jeżeli użytkownik nie jest w roli sysadmin (gdyby był w sysadmin zostanie użyte konto techniczne serwera). Credentiala definiujesz komendą:
EXEC sp_xp_cmdshell_proxy_account 'your windows account’,’password’
Jeśli brak jest tego credentiala, to otrzymasz błąd:
The xp_cmdshell proxy account information cannot be retrieved or is invalid. Verify that the '##xp_cmdshell_proxy_account##’ credential exists and contains valid information.
Komendy wykonywane poprzez xp_cmdshell wykorzystują ustawienia zdefiniowane w profilu użytkownika, więc jeżeli chcesz je zmienić (np. zmienić format daty podczas wykonywania polecenia dir), zaloguj się do systemu z wykorzystaniem tego konta użytkownika, dokonaj odpowiednich zmian (np. w panelu sterowania w ustawieniach regionalnych). Po ponownym wykonaniu polecenia xp_cmdshell komendy takie jak dir, będą pracowały zgodnie ze zdefiniowanymi ustawieniami lokalnymi.
2014-10-09
Znalazłem serwer witness. Niestety brak informacji, jakie inne serwery wykorzystują ten witness.
Co można zrobić? Sprawdź czy nie ma czegoś w:
select * from sys.endpoints
select * from sys.database_mirroring_endpoints
select * from sys.database_mirroring
select * from sys.dm_db_mirroring_connections
select * from sys.database_mirroring_witnesses
Ostatni widok powinien zawierać rekordy, po jednym na mirrorowaną bazę z informacjami o principalu i mirrorze.
Niestety mi się tu nic nie udało wypatrzeć. Ale skoro ktoś łączy się do witnessa, to musi do tego mieć uprawnienia. Poniższe zapytanie wyświetli te uprawnienia:
SELECT ep.endpoint_id, p.class_desc, p.permission_name, ep.name, sp.name
FROM sys.server_permissions p
INNER JOIN sys.endpoints ep ON p.major_id = ep.endpoint_id
INNER JOIN sys.server_principals sp ON p.grantee_principal_id = sp.principal_id
i w moim przypadku pozwoliło mi to skojarzyć, o które serwery chodzi!
select*fromsys.endpoints
select*fromsys.database_mirroring_endpoints
select*fromsys.database_mirroring
select*fromsys.dm_db_mirroring_connections
select*fromsys.database_mirroring_witnesses
2014-10-05
Dysk z logiem pełny. Logi pełne. Pliki loga posadowione już na dwóch dyskach. Trzeba zwolnić trochę miejsca
Zaczynasz od
select name, log_reuse_wait_desc from sys.databases
Druga kolumna zwraca informację o tym, co powoduje przepełnienie loga. W moim przypadku było dość standardowo LOG_BACKUP. Oznacza to, że w pierwszej kolejności należy zwolnić miejsce przez wykonanie bakupu loga. Jest to konieczne, gdy baza pracuje w recovery modelu full, a na systemach produkcyjnych tak jest najczęściej.
Po backupie loga, widać już, że w logu jest sporo wolnego miejsca:
USE db_name
dbcc SQLperf(logspace)
No to można shrinkować plik loga:
USE db_name
GO
DBCC SHRINKFILE (N’LogFileName’ , 10240)
GO
A tu niespodzianke. Log się nie skurczył a jeszcze pojawia się komunikat:
Cannot shrink log file <…> because the logical log file located at the end of the file is in use.
Porady na forach zazwyczaj zalecają przełączenie bazy w recovery model simple, co wyrzuci z loga niebackupowane transakcje i zupełnie przebuduje jego strukturę, a potem powrót do modelu full. Ale to raczej nie tędy droga. System jest produkcyjny i nie należy przełączać modelu na simple, a na dodatek w moim przypadku… baza pracowała w mirroringu.
Wczytaj się w komunikat. Shrinkować nie można, bo aktywna część loga jest na końcu pliku… Więc może przesuniemy ten „logical log file”. To proste. Wygeneruj po prostu kilka pustych „dummy” transakcji:
create table tabtodelete
(id int identity primary key,
x char(10))
GO
–100-krotny insert
insert tabtodelete values(’x’)
GO 100
drop table tabtodelete
I gotowe! Teraz shrink zadziałał od razu!
2014-09-29
Warto, aby instalacja aktualizacji SQL odbywała się bez udziału administratora, klikającego myszką „Next”, „Next”.
Pakiety KB można uruchamiać z linii komend przekazując do nich odpowiednie parametry. Sęk w tym, że te parametry zmieniają się z wersji na wersję.
I tak aktualizacja wszystkich instancji SQL w SQL 2008 załatwiasz komendą:
KB0123456789.exe /qs /Action=Patch /AllInstances
Ta sama czynność na SQL 2008 R2, 2012 i 2014 to polecenie:
KB0123456789.exe /qs /IAcceptSQLServerLicenseTerms /Action=Patch /AllInstances
Szczegóły:
http://technet.microsoft.com/en-us/library/dd638066(v=sql.120).aspx