
Cikkünkhöz mellékeltük a szóban forgó szkriptet "SQL.vbs" néven. Használatba vétele előtt mindenképpen szükséges a cikkben foglaltak megértése. Megtalálható továbbá egy "Start.bat" állomány, amely futtatja a szkriptet.
Természetesen azon SQL szerver verziók, melyek tartalmazzák a beépített biztonsági mentés szolgáltatást, ennél lényegesen jobban konfigurálhatóan, professzionálisabban dolgoznak, de sok alkalmazási környezetben egy szkript is megfelel a célnak. Ha nincs szó túl nagy adatbázisokról és 24 órás feltétel nélküli rendelkezésre állásról, akkor akár a profi SQL verziók esetében is alkalmazható. Kezelése könnyebb, mint a beépített változatnak, minimális a konfigurálási és karbantartási igénye.
A mentés készítése előtt állítsuk le az SQL szervert. Erre azért van szükség, hogy a fájlmásolása alatt ne történhessen írás az adatbázisba és azért, mert a kizárólagos módban megnyitott fájlokhoz másként nem férhetünk hozzá. A kiszolgáló leállítása azonban felvet némi problémát. Addig rendben is van, hogy az MSSQLSERVER nevű szolgáltatást kell leállítani, de az SQL verziójától és helyi beállításoktól függően lehetnek egyéb szolgáltatások, melyek működése az MSSQLSERVER-től függ. Első lépésben meg kell határoznunk, hogy melyek ezek. Indítsuk el a Vezérlőpult > Felügyeleti eszközök > Szolgáltatások (Control Panel > Administrative Tools > Services) konzolt és keressük meg a listában az MSSQLSERVER-t. Kattintsunk rá a jobboldali egérgombbal és válasszuk a "Tulajdonságok" ("Properties") menüt. A megjelenő ablakban lépjünk a "Függőségek" ("Dependencies") oldalra. Rövid várakozás után megjelenik két függőségi lista a felsőben az látható, hogy az MSSQLSERVER melyik szolgáltatásoktól függ. Az alsóban pedig az, hogy melyik szolgáltatások függnek az MSSQLSERVER-től. Az első lista ebben az esetben üres lesz, de másodikban már jó eséllyel találunk bejegyzést (pl.: SQLSERVERAGENT). Ekkor először a listában szereplőket kell leállítani és csak utána az MSSQLSERVER-t. A jobb érthetőség kedvéért az alábbiakban feltételezzük, hogy az SQLSERVERAGENT-el való függőségi viszony áll fenn. Nézzük akkor a szkriptünket:
Definiálunk egy "Delay" nevű változót. Értékül egy számot adunk neki, ennyi ideig vár alkalmanként a szkript mielőtt folytatná a működését. Erre azért van szükség, mert több szolgáltatást is le akarunk állítani. A leállítás időt (néhány másodperc) vesz igénybe, de a szkript nem tud róla, hogy valójában megtörtént-e a leállás. Folytatódik a futtatás és már állítaná is le a következő szolgáltatást, de ekkor hiba keletkezik, mert az előző még nem végzett. A problémát tehát egy várakozási paranccsal oldjuk meg és a "Delay" tárolja a várakozási időt.
A rendszerbe telepített szolgáltatások listáját a Windows Management Instrumentation (WMI) segítségével kérjük le. A "Win32_Service" osztályt kell használnunk, kérjük le minden példányát - ennyi szolgáltatásunk van. "impersonationLevel=impersonate" a biztonsági szintünk meghatározása: a szkriptet futtató felhasználó jogaival történik a rendszerobjektumok elérése. Ennek okán rendszergazdai jogosultságra van szükség.
Set ServiceSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_Service")
Az osztály által visszaadott objektumok - a szolgáltatások listáját - egy FOR ciklussal ellenőrizzük végig. Elsőként az "SQLSERVERAGENT" nevű szolgáltatást kell leállítani. Keressük meg és hívjuk meg a "StopService" metódusát. Közben a pillanatnyi állapot közlésére jelenítsünk meg üzeneteket a képernyőn. A metódus meghívása után iktatjuk be az első várakozási parancsot (wscript.sleep).
for each Service in ServiceSet
if Service.Name = "SQLSERVERAGENT" then
wscript.echo "SQLSERVERAGENT szolgáltatás leállítása"
error=Service.StopService
wscript.sleep (delay)
Onnan tudjuk, hogy minden rendben lezajlott, hogy a leállítást végző metódus visszatérési értéke nulla. Ettől eltérő esetben valamilyen hiba keletkezett, írassuk ki a képernyőre a kódját egy rövid szöveg kíséretében. Majd zárjuk a feltételeket és a ciklust, elvileg az SQLSERVERAGENT szolgáltatás leállt. Végén szúrjunk be egy üres sort az eddig megjelent üzenetek után.
if error <> 0 then
WScript.echo "SQLSERVERAGENT: A szolgáltatás leállítása közben hiba keletkezett. Kódja:" & error
else
Wscript.echo ".... Kész"
end if
end if
next
Wscript.echo
Következzék a központi MSSQLSERVER szolgáltatás leállítása. Nincs különbség az előzőhöz képest, ugyanazokat az elveket alkalmazzuk:
Set ServiceSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_Service")
for each Service in ServiceSet
if Service.Name = "MSSQLSERVER" then
wscript.echo "MSSQLSERVER szolgáltatás leállítása"
error=Service.StopService
wscript.sleep (delay)
if error <> 0 then
WScript.echo "MSSQLSERVER: A szolgáltatás leállítása közben hiba keletkezett. Kódja:" & error
else
wscript.echo ".... Kész"
end if
end if
next
Wscript.echo
Most már teljesen megállt az SQL 2000 Server. A tálcán található ikon pirossal jelzi is számunkra, biztosak lehetünk benne, hogy az adatbázisokban nem történik változtatás, nem tud senki írni bele és indexelés sem zajlik. Következhet az adatbázist alkotó fájlok másolása. Általában egy adatbázist két fájl alkot az egyik .mdf, a másik .ldf kiterjesztéssel szerepel. Pontos helyük alkalmazási környezetenként változó, attól függ, hogy a rendszergazda vagy a programozó hol helyezte el. A háttértárakon található állományokhoz való hozzáférést a File System Object (FSO) osztály végzi a Windows Scripting Host-ban. Fájlmásoláshoz egyszerűen létre kell hoznunk egy új példányát és meghívni a "CopyFile" metódust.
Wscript.echo "Fájlok másolása"
Set Shell = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Példának két állomány másolását mutatjuk meg, de további sorok beírásával tetszés szerint bővíthető. Paraméterként a parancssori COPY-hoz hasonlóan "forrás", "cél" formában kell megadni a fájlneveket.
FSO.CopyFile "c:\database\raktar.mdf", "c:\backup\raktar.mdf"
FSO.CopyFile "c:\database\raktar.ldf", "c:\backup\raktar.ldf"
Wscript.echo ".... Kész"
Wscript.echo
Utolsó lépés az SQL szerver elindítása. A folyamat nagyon hasonlít az indításhoz, lényegi különbsége, hogy a "StartService" metódust kell meghívni. Ugyanúgy kezelendő az általa visszaadott hibakód is. Fontos megemlíteni, hogy míg a leállításnál két szolgáltatást is meg kellett adnunk, az indításnál elegendő az SQLSERVERAGENT-t elindítani, ugyanis az MSSQLSERVER ennek hatására automatikusan elindul.
Set ServiceSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_Service")
for each Service in ServiceSet
if Service.Name = "SQLSERVERAGENT" then
wscript.echo "SQLSERVERAGENT szolgáltatás indítása"
error=Service.StartService
wscript.sleep (delay)
if error <> 0 then
WScript.echo "SQLSERVERAGENT: A szolgáltatás indítása közben hiba keletkezett. Kódja:" & error
else
Wscript.echo ".... Kész"
end if
end if
next
A szkript futtatását a parancssori CSCRIPT.EXE programmal javasoljuk, mert a sok, egyenként megjelenített üzenet a grafikus felületen nehezebben áttekinthető.
Felmerülhet egy olyan kérdés látva a fájlmásolást, hogy mi van, ha már létezik a cél állomány, például már futott korábban a szkript? Mivel ezt az eshetőséget nem kezeljük le, így az FSO alapértelmezett beállítása az érvényes és ez a feltétel nélküli felülírás.
Javasoljuk a szkriptet a feladatütemező segítségével futtatni, olyan időpontban, amikor valószínűsíthető a forgalom hiány (pl. hajnalban). Vegyük figyelembe, hogy amíg áll az SQL szolgáltatás, nem működik az adatbázis kezelés.