HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Biztonsági másolat készítés SQL 2000 adatbázisokról - szkriptből


Példaprogram letöltése

2665 bájt

Nem minden SQL szerver verzió támogatja a biztonsági másolat készítést, ezért hiánypótlásul közlünk egy szkriptet, melyben megvalósítunk egy alapszintű adatbázis mentést. Működése során leállítja az SQL szervert és a hozzá tartozó kiegészítő szolgáltatásokat, elvégzi az adatokat tartalmazó fájlok mentését, majd ismét elindítja az adatbázis kezelőt.

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.
delay=10000
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ő.
cscript sql.vbs
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.

Könyv
Ez a cikk megtalálható ebben a könyvben: Windows Software Offline 2002 évkönyv 326. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |