Kämpat en hel del med PowerShell


Kämpat en hel del med PowerShell denna vecka. Kämpat = lärt mig en hel del. Är ju ingen hejare på skript, än mindre på powershell, men det går framåt!

Dels skript som sätter flera servrar i maintenance mode i SCOM, dels tar ur dessa ur maintenance mode och att förlänga maintenance mode om man varit tidsoptimist 😉 Kollegan hade redan fixat ett skript åt mig som satte det i maintenance mode, men det gick inte att ta ur maintenance mode som det var. Så jag hittade annat skript och lyckades ändra.

Men det var annat som jag kämpade mest med.

Laddade ner ett skript som ska synka inloggningar mellan olika SQL Servrar. Servrar som finns med i olika AG.

Skriptet funkade bra i labb, på en server i utv och en server i test. Inte i prod alls och inte på de andra servrarna i utv och test heller 😮

Eh, vad är det för fel? Bloggaren hade svarat på folks kommentarer. En hade samma felmeddelande som jag. Felet var att personen i frågan (likaså jag) hade flera AG på samma burkar. Hade han bara testat på en AG? Ja, han hade det inte flera AGi sin miljö och hade inte tid att testa då han var på resande fot.

Han hade dock lämnat tips på hur man kan kringgå felet, 2 olika alternativ.

Lösa det med ForEach eller parameter.

Jag började med ForEach, men fick samma resultat, oavsett hur jag gjorde.

Till slut började skriva ut värden

        echo "$AvailabilityGroupName";
        echo "$secondaryInstances";

och såg att skriptet listade alla replikor som fanns på den server man anslutit, oavsett om de var primära eller ej! Det gick bara på servernamnet eller listener.
Så det blev antal AG * antal replikor per inloggning!

Inte så konstigt att den inte mäktade med mängden logins som skulle kopieras över. Massa med dubbletter!

Gav upp det där med ForEach och gav mig på parameter efter lunch.
Började stycka upp skriptet och uppfinna hjulet på nytt!

Skapade en till parameter

$AG = 'AG name'

och fick mitt skript att funka. Gav mig på hans skript och kompletterade det med -AvailabilityGroup $AG:

$replicas = Get-DbaAgReplica -SqlInstance $AvailabilityGroupName -AvailabilityGroup $AG

Det funkade. Jag hade krånglat till det för mycket.

Ska sätta upp ett jobb med flera steg i CMS sen. Varje steg får gå till viss alias/listener samt viss AG. Lägger man det på CMS så behöver man installera och uppdatera dbatools på ett ställe bara och så slipper kontrollera om man är på primär eller sekundär replika när jobbet ska köras.