Technet Scripting Games 2010

És végre!!!! A régóta várt esemény újra itt van: Scripting Games a nemzetközi Technet oldalon! Anno ennek segítségével barátkoztam meg a VBscripttel. és még egy Scripto Bubble figurát (a képen látható) is nyertem a sorsoláson. Egy hónap múlva kezdődik, úgyhogy mindenki felszívhatja addig magát kedvenc scriptnyelvéből.

2010 Scripting Games

Kalandra fel!

sqlcmd mint SSMS light

Itt ülök az MVP summiton, és kiderült, hogy még itt is van olyan ember, aki nem tudja, hogy az sqlcmd nagyon sokoldalú. Valaki felvetette az igényt egy SSMS lightra, ahogy ő fogalmazott,

“egy Notepad, ami tud SQL lekérdezést futtatni”.

Megmutattam neki, hogy ez már létezik. Úgy hívják, hogy sqlcmd. Ez az osql utódja, a command-line interface SQL Serverhez. Ha még nem tudná valaki, CLI-mániám van, pedig Windows-on szocializálódtam. Szóval nézzük a varázslatot: Nyissunk egy parancssort (cmd.exe vagy powershell), és pötyögjünk:

Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Erik>sqlcmd -E -S .\mysql
1> :ed
'edit.com' is not recognized as an internal or external command,
operable program or batch file.
1> exit

C:\Users\Erik>SET SQLCMDEDITOR=notepad

C:\Users\Erik>sqlcmd -E -S .\mysql
1> :ed
1> select top 3 name, database_id, recovery_model_desc
2> from
3> sys.databases
4> GO
name
         database_id recovery_model_desc
------------------------------------------------------------------------------------------------------------------------
-------- ----------- ------------------------------------------------------------
master
                   1 SIMPLE
tempdb
                   2 SIMPLE
model
                   3 FULL

(21 rows affected)
1> :ed
1> select top 3 cast(name as varchar(30)) name, database_id, recovery_model_desc
2> from
3> sys.databases
4> GO
name                           database_id recovery_model_desc
------------------------------ ----------- ------------------------------------------------------------
master                                   1 SIMPLE
tempdb                                   2 SIMPLE
model                                    3 FULL

(3 rows affected)
1> 

Mi történt? Létrehoztam egy kapcsolatot az SQL Serverhez (igen, mysql az instancename, mert én használom), majd megpróbáltam szerkeszteni egyet az :ed paranccsal, de hibát kaptam, mivel az edit.com nem volt elérhető a gépemen. Erre kiléptem, beállítottam a SQLCMDEDITOR környezeti változóban a Notepad nevű szövegszerkesztőt, majd megint nekiugrottam. Ami sajnos így nem látszik, az az, hogy a 13. sornál kinyílt a notepad egy üres fájllal. Belegépeltem a 14-16. sort, majd bezártam a notepadot, és elmentettem a fájlt, amikor kérdezte, hogy mi legyen. Erre a fájl tartalma megjelent a sqlcmd-ben. utánaírtam, hogy GO, aztán lefutott. Mivel az adatbázisnév sysname, ami 128 karakter hosszú, ezért rondán nézett ki a kimenet, úgyhogy megint azt mondtam, hogy :ed. Erre megjelent az előzőleg végrehajtott batch a notepadban, és átírtam a megfelelő 1 sort, hogy ne legyen beláthatatlanul hosszú az output. Bezár-ment, enter, ott az eredmény.

Konklúzió: ez az egyik legnagyobb találmány.

Command-line SQL… install vagy amit akartok

Hogy legyen valami kis SQL is a blogomon, megosztom veletek egyik aktuális kedvencemet. (Be kell valljam, hogy alapból nem értek jobban a SQL Serverhez egy átlag foltos tengerimalacnál, de mindig találok valami érdekeset benne, azt elolvasom, aztán akkor abból okos vagyok egy hétig vagy kettőig. De ezt ne mondjátok meg az MS-nek:) Mint visszatérő olvasóim tudják, élek-halok a parancssoros-begépelős-villogókurzoros üzemeltetésért, néha sehogysem értem, hogy hagytam ott a Linuxot fiatalkoromban (aztán mindig eszembe jut, hogy azért, mert X-et két nap alatt tudtam csinálni, hangot meg sohasem a RH7 alatt). És kérem, az SQL Serverben vannak dolgok, amik csak gépeléssel érhetőek el. SQL-t installállni lehet GUI-ból és CLI-ből is – na de editiont upgrade-elni, vagy automatikusan installálni csak parancssorból lehet. Mivel folyton 100 dolgot csinálok, nekem kényelmesebb egy cluster úgy installázni, hogy a fekete ablakba bepötyögöm (vagy copy-paste a BOL-ból):

Start /wait X:\servers\setup.exe /qn VS=<vsname> INSTALLVS=SQL_Engine INSTANCENAME=<instancename> ADDLOCAL=SQL_Engine,Client_Components PIDKEY=<pidkey value with no "-"> ADDNODE=<nodename1 ,NodeName2> GROUP=<diskgroup> IP=<ip ,Networkname> ADMINPASSWORD=<strongpassword> SAPWD=<strongpassord> INSTALLSQLDIR=<installationpath> INSTALLSQLDATADIR=<sharedrivepath> SQLACCOUNT=<domain \user> SQLPASSWORD=<domainuserpassword> AGTACCOUNT=<domain \user> AGTPASSWORD=<domainuserpassword> SQLBROWSERACCOUNT=<domain \user> SQLBROWSERPASSWORD=<domainuserpassword> SQLCLUSTERGROUP="MyDomain\MySQLDomainGroup" AGTCLUSTERGROUP="MyDomain\MyAGTDomainGroup" FTSCLUSTERGROUP="MyDomain\MyFTSDomainGroup" ERRORREPORTING=1, SQMREPORTING=1 SQLCOLLATION=SQL_Latin1_General_CP1_CI_AS

Aztán elmegyek ebédelni, és nem klikkelgetek húsz percet, mire eljutok az installhoz. De nem is ez a legjobb rész benne, hanem az, hogy a cluster install amúgy is szívás: install szerver+kliens az aktív node-ra, majd install kliens (+SSIS) a passzív node-(ok)ra. Minden hotfixnek is ugyanúgy le kell mennie az összes node-ra, mert a nem patchelt kliens cucc az egyik leggonoszabb veszélyforrás. Nem értjük, hogy miért nem működik, pedig jól összekattogtattuk. Ja, a kliens RTM, és rossz queryt futtat a háttérben…

Szóval a lényeg, hogy letolhatom az installt szinte-szinte automatában így scriptelve, megdöbbentően sok paramétert be lehet állítani, soha nem hittem volna, hogy ilyen agyrémek vannak, mint Management Studio shortcut rebuild meg effélék. Az edition upgrade viszont még nagyobb móka volt, konkrétan egy Evaluationt kellett Developerré növesztenem. Össze is raktam a cuki kis parancsot, bedobtam minden elvárt paramétert, aztán mindig elkezdett kérdezgetni, hogy akkir itt az interaktív rész, mondjam meg az instance nevét meg effélék. Némi gondolkodás után sem jöttem rá, hogy ezt most pebkac vagy anti-user-friendly megoldás: van két kapcsoló az installerhez: a /qb basic dialógus ablakokat és hibákat feldob, a /qn pedig semmit, még hibát se. Úgy hal meg, hogy a logba írja, miért tette. Na, én /qb-vel elindultam, és sorban megakadtam. Végül megpróbáltam /qn-nel, és tovább jutottam. Egész eddig:

SQL Server Setup has encountered the following problem: [Microsoft][SQL Native Client][SQL Server]The certificate cannot be dropped because one or more entities are either signed or encrypted using it.. To continue, correct the problem, and then run SQL Server Setup again.

At is mondta persze, hogy A certificate with the name ‘##MS_AgentSigningCertificate##’ already exists or it has already been added to this database. Néztem, mint Rozi a filmszínházban. Irány a gugli (vagy a bing, összevissza használom őket, általában pontosan az egyik keres kedvem szerint), és íme, a megoldás egy fórumban: le kell futtatni egy kis scriptet, és újra megpróbálni:

use msdb

BEGIN TRANSACTION

declare @sp sysname
declare @exec_str nvarchar(1024)
declare ms_crs_sps cursor global for select object_name(crypts.major_id) from sys.crypt_properties crypts, sys.certificates certs where crypts.thumbprint = certs.thumbprint and crypts.class = 1 and certs.name = '##MS_AgentSigningCertificate##'

open ms_crs_sps

fetch next from ms_crs_sps into @sp

while @@fetch_status = 0

begin
 if exists(select * from sys.objects where name = @sp) 
 begin 
  print 'Dropping signature from: ' + @sp set @exec_str =   N'drop signature from ' + quotename(@sp) + N' by certificate [##MS_AgentSigningCertificate##]'
  Execute(@exec_str)
  if (@@error <> 0)
  begin
   declare @err_str nvarchar(1024)
   set @err_str = 'Cannot drop signature from ' + quotename(@sp) + '. Terminating.'
   close ms_crs_sps
   deallocate ms_crs_sps
   ROLLBACK TRANSACTION
   RAISERROR(@err_str, 20, 127) WITH LOG
   return
  end
 end
fetch next from ms_crs_sps into @sp
end

close ms_crs_sps
deallocate ms_crs_sps
COMMIT TRANSACTION
go

A homlokomra csaptam: hogy ez hogy nem jutott eszembe magamtól! És ezután már le is futott az edition upgrade. Mndenféle emberi beavatkozás nélkül. Kocka…

Virtuális gépek klónozása – és Powershell

Időnként rámtör a vágy, hogy legyen 4-5 virtuálistesztgépem valami érdekes teszthez (legutóbb pl. SQL 2005 cluster költöztetése domainek között – amúgy not supported, de kíváncsi voltam, hogy hogy megy – nehezen). Ebben az unalmas rész a négy gép elkészítése úgy, hogy azok esetleg később is használhatóak legyenek (=nem nagyon gányolva).

Mivel a céges körülményeim megkövetelnek bizonyos fokú platformfüggetlenséget, VMWare Servert használok, így Linux és Windows alól is hozzáférek a gépeimhez (ha valaki tervezi, hogy lelöveti azt az embert, aki kitalálta, h webes kliense legyen a VMWare Server 2-nek, szóljon, beszállok egy ötössel). A VMWare pedig szereti átfedéssel megosztani a memóriát a gépek között, ha lehet, tehát amikor csak lehet, egyféle oprendszer azonos szintre patchelt változatát használom, tényleg működik. Innen pedig már adja magát a telepítés menete:

  1. Feltelepítem az operációs rendszert, felpatchelem, aktiválom, ha kell.
  2. Felteszem a VMWare Toolst.
  3. Engedélyezem az RDP-t.
  4. Feldobom a Sysinternals Suite-ot.
  5. Lekapcsolom a gépet.
  6. Lemásolom a virtuális gép könyvtárát
  7. Átnevezem a fájlokat, átírom a konfigokat
  8. Behúzom az új gépeket a VMWare-be, és konfigurálom őket. Két dolgot szoktam mindig megtenni: letörlöm a hozott hálókártyát, és újat adok hozzá, illetve lefuttatom a Sysinternals NewSID.exe nevű programját. Ezzel a klónozás kockázatait minimalizáltam, és nekem kényelmesebb, mint a sysprep.

Ez utóbbi kiválóan megy párhuzamosan is, két domaint és egy clustert kevesebb, mint másfél óra alatt készre konfiguráltam. Amit utálok, az a fájlok átnevezgetése, mert én 2 GB-os fájlokra szoktam felvágni a virtuális diszket, hogy legyen reális esélyem lemásolni később, meg az átnevezések mellett egyes fájlokba bele is kell túrni. Mivel alapvetően lusta vagyok, írtam egy PowerShell scriptet, ami 4 soros, és elintézi ezt a részt, az a lényeg, hogy a könyvtár neve passzoljon az új gép nevéhez.

#Az aktuális alkönyvtár nevét kivesszük regexppel a teljes útvonalból, amit a $PWD változó tartalmaz – ez lesz az új gép neve
if ($PWD -match ‘\\(?[^\\]*)$’) { $newmachine = $matches.dirname}
# A régi gép neve a virtuális gép konfig fájljához passzol általában
$oldmachine = (gci *.vmx).Basename
# átnevezem a fájlokat
gci| Rename-Item -NewName {$_.Name -replace $oldmachine, $newmachine}
# majd search-and-replace abban a pár fájlban, ahol szükséges
gci “$($newname).vm*”|% {(gc $_) -replace $oldmachine, $newmachine | sc $_}
[/c#]

Igazából csak ezért a scriptért írtam az egész postot, mindenkit biztatok arra, hogy írjon scripteket. A jó üzemeltető scripteket ír, esetleg alkalmazásokat is, de valamit csak tud. Ha Windows, akkor meg PowerShell. Szeretném külön felhívni a figyelmet arra, hogy milyen botrányosan egyszerű a fájlokban kicserélgetni tartalmat, és azt is hozzáteszem, hogy ez kis fájlokra működik, amiket gond nélkül be lehet nyalni a memóriába.

Tessék scriptelni :)

Csináljunk Maintenance Plant az adatbázisainkhoz! Csináljunk?

Aki ott volt a Technet üzemeltetői konferencián vagy letöltötte az internetről valamely darabkáját az előadásomnak, az emlékezhet rá, hogy ajánlottam a maintenance planek használatát mentések készítéséhez. A maintenance planek SQL 2005-ben tulajdonképpen Integration Services csomagok, azok csinálják a mentést, DBCC CHECKDB-t, stb. A wizarddal pikk-pakk össze lehet rakni egyet, és már ülhetünk is nyugodtan a babérjainkon (azért ne felejtsük el beállítani, hogy a jobok elbukása esetén küldjön levelet).

Ez mind jól hangzik, de: én nem szeretem, ha az ember dolgozik a gép helyett, tehát az adatbázis létrehozást is automatizáltam – mivel sorban töltöm fel a szerveket, mindig van egy olyan, amelyikre az új adatbázisok kerülnek. Úgyhogy írtam egy scriptet, amelyik létrehozza a teszt és/vagy éles adatbázist, a hozzá tartozó userrel együtt, akinek beállít egy 20 karakteres random jelszót, és íme: a linuxos kollégáim meg tudják csinálni az új adatbázisokat, nem kell várniuk arra, hogy egy DBA megcsinálja, a DBA-nak meg nem kell izgulnia, hogy mit rontott el a sysadmin :) Ebből már csak egy dolog hiányzik: a karbantartás és a mentés. Úgyhogy nekiálltam automatikusan legyártani az Integration Services csomagokat. Hadd fogalmazzak finoman: az egyik legsötétebb zsákutca volt, ahol valaha jártam. Végül eljutottam oda, hogy valami irgalmatlan nagy gányolással meg lehet oldani, és még így is marad benne némi homály. És ez nekem betett.

Úgyhogy szemléletet váltottam: a Transact-SQL kiválóan alkalmas backupok készítésére, akár időbélyeggel is, és mióta feltalálták a powershellt, a régi backup fájlok törlése sem okoz gondot. A full backup előtt természetesen lefut egy DBCC CHECKDB, ez pont plusz egy sor a T-SQL scriptben, és örülhetek, hogy mindig jó mentést teszek el. Az összes egyé karbantartást is meg lehet oldani T-SQL-lel (sp_updatestats, index javítás/újraépítés), úgyhogy nagyon kicsit sajnálkozva, ugyanakkor örülve az automatizált környezetemnek jelentem: kidobtuk a maintenance planeket. Majd ha lehet egyszerűen generálni őket, visszanézek.

(ja, nemsokára felteszem a scripteket is :))