Rendszeradatbázisok mozgatása SQL 2008-ban

Az új verzió mindig jobb, szebb, gyorsabb, kényelmesebb, stb. És tényleg: most először kellett elmozgatnom SQL 2008 szerver rendszeradatbázisait, és király volt. Aki csinált ilyet 2005 vagy 2000 alatt, az tudja, hogy milyen szívás mindenféle hülye trace flaggel indítgatni a SQL-t, aztán rossz sorrendben attacsolni a modelt meg az msdb-t. Ehhez képest az SQL 2008-ban négyféle adatbázis van:

  • Resource: Ő már nem is az adatfájloknál, hanem a programbinárisoknál lakik, hozzá se lehet nyúlni (és nem is kell).
  • master: Változatlanul, a service startup paraméterét kell átírni.
  • tempdb: Változatlanul alter database és nem kell fájlt másolni.
  • a többi: (igen, model, msdb is többi) Alter database, szerver leáll, fájlmásolás, szerver start.

Annyira egyszerű volt, hogy lescripteltem az egészet, egy SQL, egy Powershell:

ALTER DATABASE model MODIFY FILE (NAME = modeldev, FILENAME = 'D:\mssql10\db_data\model.mdf')
ALTER DATABASE model MODIFY FILE (NAME = modellog, FILENAME = 'E:\mssql10\db_logs\modellog.ldf')
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'D:\mssql10\db_data\tempdb.mdf')
ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'E:\mssql10\db_logs\templog.ldf')
ALTER DATABASE msdb MODIFY FILE (NAME = MSDBData, FILENAME = 'D:\mssql10\db_data\MSDBData.mdf')
ALTER DATABASE msdb MODIFY FILE (NAME = MSDBLog, FILENAME = 'E:\mssql10\db_logs\MSDBLog.ldf')
# atirjuk a registryben a startup parametereket
Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.INSTANCENAME\MSSQLServer\Parameters' -name "SQLArg0" -value "-dD:\mssql10\db_data\master.mdf"
Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.INSTANCENAME\MSSQLServer\Parameters' -name "SQLArg2" -value "-eD:\mssql10\SrvLogs\ERRORLOG"
Set-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.INSTANCENAME\MSSQLServer\Parameters' -name "SQLArg1" -value "-lE:\mssql10\db_logs\mastlog.ldf"
# SQL stop - a force azert kell, h a dependens service-ek is megalljanak
Stop-Service 'MSSQL$INSTANCENAME' -Force
Start-Sleep 10
# kopi adatbazis fajlok
Move-Item 'D:\mssql10\db_data\MSSQL10.INSTANCENAME\MSSQL\DATA\*.mdf' 'D:\mssql10\db_data'
Move-Item 'D:\mssql10\db_data\MSSQL10.INSTANCENAME\MSSQL\DATA\*.ldf' 'E:\mssql10\db_logs'
#Start-Service - az agent elinditja a SQL-t magat is
Start-Service 'SQLAgent$INSTANCENAME'

És kész is vagyunk… Scriptelni jó.

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 :)

GetMsSqlDump!!!

Végre, körülbelül másfél hét után, elkészült életem (majdnem) főműve, egy kütyü, mellyel SQL-ből ki lehet nyerni a táblák tartalmát insert into utasítások képében. Tipikusan a “nem nagy dolog, de jólesik” kategória, ugyanis nem MSSQL-en felnőtt ismerőseimnek az az első kérdése, hogy hogyan lehet ilyen módon kinyerni az adatokat MSSQL-ből, és már nagyon untam, hogy mindig azt kellett mondanom, hogy “ööööö… sehogy”.
Másrészt a Powershell mindig is foglalkoztatott, és például erre a célra tökéletesen alkalmas eszköz volt, úgyhogy PS-ben írtam, röpke 300 sor, kommentekkel, de hibakezelés nélkül. Mindenesetre működik, úgyhogy 0.1-es verzióval, béta állapotban elérhetővé tettem az emberiség számára egyrészt itt a saját oldalamon, másrészt pedig a CodePlexen.
Egyelőre néhány sebből vérzik, de ezeket szeretném befoltozni, meg majd egy C#-os command-line exét is akarok csinálni belőle. Meg portolni Linuxra :)
A cucc teljesen angolul van, de a doksit majd lefordítom magyarra, lássátok a részrehajlást :)

PowerShell könyv mindenkinek (aki tud angolul)


Mivel világéletemben süti voltam a programozáshoz (akkor is, amikor azt csináltam), most elhatároztam, hogy megtanulok Powershellül, ami azért jó, mert egyrészt alapvetően dotnet, másrészt scriptnyelv, ami üzemeltetésben aranyat ér, hiszen látom a forrását, bármikor beletúrhatok, illetve újrahasznosíthatom, ha kell. Meg szeretnék végre megtanulni valamit az SQL-en kívül (bár még ez is tele van meglepetésekkel).
Tanfolyamra nem akartam menni, mert jobban szeretek könyvből tanulni (azon kevés emberek egyike vagyok, aki kérte a cégét, hogy ne kelljen tanfolyamra mennie, vetettem inkább 18 könyvet:), úgyhogy nekiálltam könyvet keresni. Némi piackutatás után (külön köszönet az amazon.com szorgos vásárlóinak, akik review-t is írnak) végül Bruce Payette könyvét választottam, melynek címe: Windows PowerShell In Action. Két dolog győzött meg: egyrészt a könyv tartalomjegyzéke – Bruce Ádámnál és Évánál, vagyis a PowerShell előtti idők történetétől kezdi, és végigmegy minden érdekes területen, tehát az, h süti vagyok jelenleg, nem okoz hátrányt. Másrészt Bruce a PowerShell egyik alkotója, és mint ilyen, elég sok apró finomságot tud a nyelvről, és ezt meg is osztja az olvasókkal.
Jelenleg a könyv negyedénél járok (sajnos közben egy time management könyvet is le kell olvasnom, mert abban béna vagyok), de már érzem, ahogy kezdenek erőtől duzzadni a PowerShell-izmaim. Egyelőre kicsit félelmetes, hogy fejből leírom azt, hogy gal|? {$_.Definition -like ‘*proc*’}, és még értem is. Tegnap be is röffentettem első élesüzemű PowerShell scriptemet – apró üröm az örömben, hogy csak én tudom debuggolni jelenleg :)
Szóval a könyv nagyon jó, ha valaki akar PowerShellt tanulni, csak ajánlani tudom, két záró gondolattal: Először is, a könyv borítóján szereplő idézet teljesen igaz:

“Bruce is a walking encyclopedia of every good, bad, solid, and wacky language idea that has been tried… This is a book that only Bruce could have written.”
—Jeffrey Snover, from the Foreword

Másodszor pedig ez a könyv olyan, mint a Books Online: csak ezért érdemes megtanulni angolul.