Windows - Kapcsolódó adatbázisok mentése, helyreállítása

Ha több adatbázisunk egymáshoz kapcsolódik, akkor előfordulhat, hogy a mentések során bizonyos tranzakciók csak az egyik adatbázisban érvényesültek, így inkonzisztencia léphet fel. Erre a problémára mutat megoldást cikkünk a tranzakciók jelölésével.
Ha két vagy több adatbázisunk van, amelyek logikailag azonosak, akkor szükségünk lehet arra, hogy speciális műveleteket végezzünk a biztos helyreállíthatóság érdekében.
Fontos, hogy szem előtt tartsuk a helyreállítás célját az egész adatbáziskészletnél. A legrosszabb esetben figyelembe kell vennünk, hogy mennyi ideig tarthat az összes adatbázis helyreállítása. Ahhoz, hogy meggátoljuk a túlságosan nagymértékű visszaállítást nagyszámú adatbázis esetén, szükséges, hogy ne osszunk meg médiaeszközt a mentés ideje alatt, és elegendő hardvereszköz szükséges, hogy párhuzamosan vissza tudjuk állítani az adatbázisokat.
Három potenciálisan függő adatbázis-környezet:
  • Eszközhibát észlelünk, amely kihat egy vagy több adatbázisra, de a tranzakciós napló(k) nem sérültek. Azonnal szeretnénk helyreállítani.
  • Egy vagy több tranzakciós napló megsemmisült. Vissza kell állítanunk az adatbáziskészletet a napló mentés-konzisztens státusza érdekében.
  • Vissza kell állítanunk az egész adatbáziskészletet, egy kölcsönösen konzisztens státuszba néhány korábbi időpontra.
Valamennyi esetben a Teljes visszaállíthatósági modellt kell használnunk az adatbázisokhoz. (Full Recovery Modell)
Az első esetben nem szükséges, hogy bármilyen speciális helyreállítási lépést tegyünk. Ahhoz, hogy visszaállítsuk a sérült adatbázist, mentsük el a napló végét, állítsuk vissza a sérült fájlt vagy adatbázist, és görgessünk előre a tranzakciós naplómentés segítségével. A sértetlen adatbázisok nem igényelnek beavatkozást.
A másik két esetben speciális lépések szükségesek, hogy biztosítsuk a visszaállíthatóságot: tranzakciókat kell kijelölnünk az adatbázisban.
Kijelölt tranzakció alapok
Kijelölhetünk tranzakciókat a kapcsolódó adatbázisokon keresztül, és használhatjuk ezeket a jelölt tranzakciókat, hogy visszaállítsuk a kapcsolódó adatbázisokat ugyanazon tranzakció-konzisztens időpillanatra. Ezt úgy valósíthatjuk meg, ha elhelyezünk elosztott jelölőket valamennyi adatbázison, mielőtt mentenénk a log-ot akármelyik adatbázisban. Ez biztosítja, hogy valamennyi naplómentés rendelkezik egy jelölővel, amely minden adatbázisban megjelenik. Szinkronizált mentés nem szükséges. Ehelyett a jelölők elhelyezése lehetővé teszi a szinkronizációt a visszaállítás alatt. Használjuk a Full Recovery modellt, hogy biztosan valós legyen minden jelölő.
A kapcsolódó adatbázisok visszaállítása nem lehetséges egy bizonyos időpontra. Ez a visszaállítás csak egy jelölt tranzakcióig valósulhat meg.
Egy példa egy kapcsolódó adatbázis visszaállításra az, amikor egy banknak egy adatbázisa folyószámla-fiók adatokat és egy másik megtakarítás-fiók adatokat tartalmaz. A két adatbázis különálló szervereken található meg, és léteznek tranzakciók, amelyek átviszik a pénzt a két fiók között oda-vissza. Amikor az adatbázis mentésre kerül, miközben a pénzforgalom aktív, akkor, ha mindkét adatbázis azonos időben lesz mentve, jó esély van arra, hogy némely forgalom jóváhagyásra került az egyik és nem lett jóváhagyva a másik adatbázisban. A jelölt tranzakciók segítségével menth emellett etünk és később visszaállíthatjuk ezeket az adatbázisokat egy olyan pontra, amikor a tranzakciók állapota megegyezik mindkét visszaállított adatbázisnál.
Például ebben az esetben a mentési stratégiának a következőnek kell lennie:
  • Állítsuk be mindkét adatbázist Full recovery modellre.
  • Mentsük valamennyi adatbázist.
Az adatbázisok sorozatban vagy párhuzamosan menthetők.
  • Mielőtt mentenénk a tranzakciós naplót, futtassunk egy jelölt tranzakciót, amely áthidalja valamennyi adatbázist.
  • Mentsük a tranzakciónaplót minden adatbázisnál.
A mentés visszaállításához:
  • Állítsuk vissza valamennyi adatbázismentést.
  • Állítsuk vissza az összes naplómentést, megállva a jelölt tranzakciónál.
  • Állítsunk vissza minden adatbázist.
Tároló hiba esetén, ha vissza akarjuk állítani valamennyi adatbázist egy jelölt pontig, akkor meg kell határoznunk a legfrissebb jelölt tranzakciót, amely elérhető valamennyi tranzakciós naplóban. Ez az információ a logmarkhistory táblában tárolódik, amely az msdb adatbázisban van a szervereken.
Ha eldöntöttük, hogy melyik a jelölt tranzakció, amelyhez vissza szeretnénk térni:
  • Azonosítsuk a naplómentéseket minden kapcsolódó adatbázisnál, amelyik tartalmazza ezt a jelölést.
  • Hozzunk létre tranzakciós naplómentéseket a sértetlen adatbázisban, ha szükséges.
  • Oldjuk meg a hardver problémákat.
  • Állítsuk vissza/helyre valamennyi kapcsolódó adatbázist a céljelöléshez.
Jelölt tranzakciók létrehozása
A tranzakció jelölő csak olyan naplóban helyezhető el, amely jelölt tranzakcióval frissült. Emellett az egyedüli adatbázis, amely jelölést tartalmazhat, az, amelyiken a BEGIN TRAN... WITH MARK parancsot lefuttatták. A következő példa bemutatja, hogy hogyan helyezhetünk el jelölést több adatbázison:
BEGIN TRAN T1
UPDATE db1.dbo.table1 set column1 = 2
BEGIN TRAN M2 WITH MARK
UPDATE db2.dbo.table1 set column1 = 2
UPDATE server2.db21.dbo.table1 set column1 = 2
SELECT * from db3.dbo.table1
COMMIT TRAN M2
UPDATE db4.dbo.table1 set column1 = 2
COMMIT TRAN T1
Ebben a példában a jelölő neve M2, és elhelyezésre kerül a db1, db2 és db4 adatbázisok naplójában. A jelölő akkor kerül a naplóba, amikor a tranzakció commit naplórekord létrejön a COMMIT TRAN T1 utasítással. A db1 jelölésre kerül, még akkor is, ha a módosítás a tranzakció jelölése előtt történt. A db3 nem kerül jelölésre, mivel nem történt rajta módosítás, csak lekérdezés. Habár a db21 módosítása ebben a tranzakcióban történt, de mivel másik szerveren frissült, ezért nem lesz rá érvényes a jelölő, mivel a server2-n nem történt BEGIN TRAN... WITH MARK parancsfuttatás.
Amint a példa is mutatja, egy tranzakciós jelölő név automatikusan nem kerül más szerverre, amiként a tranzakció kiterjed a másik szerverre.