Powershell: Dodanie numeru wiersza po Sort-Object (ROW_NUMBER)

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

By Rafał Kraik in Power Shell

Upgrade SQL z bazami w mirroringu

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

By Rafał Kraik in SQL

Tworzenie dysku VHD w Windows 7+

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
disk1 Czytaj dalej »

##xp_cmdshell_proxy_account##

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.

By Rafał Kraik in SQL

Serwer witness – jakie serwery są principalem i mirrorem?

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

By Rafał Kraik in SQL

SQL: Shrink: Cannot shrink log file because the logical log file located at the end of the file is in use.

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!

 

By Rafał Kraik in SQL

Instalacja KB dla SQL z linii komend

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

By Rafał Kraik in SQL