10.gyak.
Feladatok
naplózásra és
helyreállításra Tankönyv 8.fejezetének feladatai
alapján
Feladatok: Molina-Ullman-Widom:
Adatbázisrendszerek
megvalósítása
a "zöld könyv" Tk. 8.fej. A
rendszerhibák
kezelése, naplózás
alapján. Segédanyagok: Kiss
Attila Adatbázisok-2 ->
naplo.ppt
Molina-Ullman
8.1 fejezete: A naplókezelő és a tranzakciókezelő 8.1.1.
Feladat
- A tranzakciók korrekt
végrehajtása, lásd naplo.ppt(3-11.oldal)
Tegyük fel, hogy az adatbázisra
vonatkozó konzisztenciamegszorítás: 0
<= A <= B.
Állapítsuk meg, hogy a következő
tranzakciók megőrzik-e az adatbázis
konzisztenciáját.
T1: A := A + B; B := A + B;
T2: B := A + B; A := A + B;
T3: A := B + 1; B := A + 1;
8.1.2. Feladat
- A tranzakciók alaptevékenységei,
hasonló
példa: naplo.ppt(43.oldal)
(Adjuk meg néhány, konkrét művelettel
megadott tranzakció esetén az
adatbáziselemek
memóriabeli és lemezen levő
értékét az
egyes műveletek után.) Az előző 8.1.1 feladat
T1: A := A + B; B := A + B; tranzakciójához a
számításokon kívül
tegyük hozzá a
beolvasó-kiíró
tevékenységeket is, és mutassuk be a
tranzakció lépésenkénti
hatását
a memóriában
és a lemezen tárolt adatokra. Tegyük
fel, hogy kezdetben A = 5
és B = 10.
Molina-Ullman
8.2. fejezete:
Undo naplózás és
helyreállítás (1-72.oldal) 8.2.1.
Feladat
- UNDO naplóbejegyzések, hasonló
példa: naplo.ppt(50-52.oldal)
-- EA alapján: UNDO naplózás
szabályai:
-- 1. naplóbejegyzések
kiírása
-- 2. módosított elemek
kiírása
(-> a gond, hogy túl sokszor kell lemezre
írni)
-- 3. COMMIT naplóbejegyzés
kiírása
Adjuk meg az előző 8.1.2 feladathoz a tranzakció UNDO
típusú naplóbejegyzéseit!
8.2.4.
Feladat
- Helyreállítás UNDO
naplóból, hasonló
példa: naplo.ppt(58-62.oldal)
-- Helyreállítás: A
Commit-tal nem rendelkező
tranzakciók műveleteit fordított
sorrendben
-- (hátulról
előre) megsemmisítjük, vissza
írjuk a
régi értéket az elembe.
-- A végén <ABORT T>-t
írunk a
naplóba és kiírjuk lemezre a
naplót FLUSH
LOG.
A következő naplóbejegyzés-sorozat a T
és U két tranzakcióra vonatkozik:
<START T>
<T, A, 10>
<START U>
<U, B, 20>
<T, C, 30>
<U, D, 40>
<COMMIT U>
<T, E, 50>
<COMMIT T>
--
Adjuk meg a helyreállítás-kezelő
tevékenységeit, ha az utolsó lemezre
került naplóbejegyzés:
a) <START U>
b) <COMMIT U>
c) <T, E, 50>
d) <COMMIT T>
8.2.7. Feladat
- UNDO naplózás
ellenőrzőponttal, hasonló
példa: naplo.ppt(63-72.oldal)
-- Ellenőrzőpont képzés
-- Egyszerű:
-- megvárni az aktív tranzakciók
befejeződését, addig újat nem engedni,
-- majd <CKPT> írása a
naplóba + FLUSH LOG
-- Működés közbeni:
-- <START CKPT(T1, T2 ... Tk)> a
naplóba majd FLUSH
LOG
-- megvárni az aktív
tranzakciók
befejeződését, közben indulhatnak
újak
-- majd <END CKPT> a naplóba + FLUSH
LOG
--
-- A helyreállításhoz elég
visszafelé a legutóbbi <END CKPT>
előtti <START
CKPT>-ig
-- visszamenni. Ha visszafelé haladva <START
CKPT(Ti)>
-vel találkozunk előbb, akkor
-- elég a legkorábbi <Start Ti>-ig
visszamenni.
(Vagy egy olyan <START CKPT>-ig,
-- amelyhez tartozó <END CKPT> is a
naplóban van,
mert ez biztosan megelőzi
-- a legkorábbi <Start Ti>-t.)
--
Tegyük fel, hogy a napló a következő
bejegyzéssorozatot tartalmazza:
<START S>
<S,A,60>
<COMMIT S>
<START T>
<T,A,10>
<START U>
<U,B,20>
<T,C,30>
<START V>
<U,D,40>
<V,F,70>
<COMMIT U>
<T,E,50>
<COMMIT T>
<V,B,80>
<COMMIT V>.
--
Tegyük fel továbbá, hogy a
működés
közbeni ellenőrzőpont-képzést
kezdjük
alkalmazni,
közvetlenül az alábbi
naplóbejegyzések
(memóriában való)
megjelenésétől
kezdve:
a) <S,A,60>.
b) <T,A,10>.
c) <U,B,20>.
d) <U,D,40>.
e) <T,E,50>.
--
Mindegyik fenti esetre adjuk meg, hogy:
i) Mikor íródik fel az <END
CKPT>
naplóbejegyzés, és
ii) Bármelyik lehetséges pillanatban, ha hiba
lép
fel, meddig kell a naplóban
visszafelé tekinteni
ahhoz, hogy minden befejezetlen
tranzakciókra
vonatkozó bejegyzést megtaláljunk.
P5. Feladatok
redo naplózásra
és
helyreállításra
Molina-Ullman
8.3. fejezete: Redo naplózás és
helyreállítás
8.3.1
Feladat
- REDO
naplóbejegyzések, hasonló
példa: naplo.ppt
(76.oldal)
-- EA alapján: REDO naplózás
szabályai:
-- 1. naplóbejegyzések
kiírása
-- 2. COMMIT naplóbejegyzés
kiírása
-- 3. módosított elemek
kiírása
(-> a gond, hogy túl sokáig nem szabad
lemezre
írni)
Adjuk meg a 8.1.1. feladatban szereplő T1: A := A + B; B := A + B;
tranzakcióhoz
tartozó számításokat
és
beolvasó-kiíró
tevékenységeket, mutassuk be a
tranzakció
lépésenkénti
hatását a memóriában
és a lemezen tárolt adatokra. Tegyük
fel, hogy
kezdetben A = 5
és B = 10. Adjuk meg tranzakció REDO
típusú naplóbejegyzéseit!
8.3.3. Feladat
- Helyreállítás REDO
naplóból, hasonló
példa: naplo.ppt
(80-82.oldal)
-- Helyreállítás: A
COMMIT-tal rendelkező
tranzakciók
műveleteit újból végrehajtani.
-- A be nem fejezett tranzakciókra <ABORT T>-t
írni
a naplóba, FLUSH LOG
A következő naplóbejegyzés-sorozat a T
és U két tranzakcióra vonatkozik:
<START T>
<T, A, 10>
<START U>
<U, B, 20>
<T, C, 30>
<U, D, 40>
<COMMIT U>
<T, E, 50>
<COMMIT T>
--
Adjuk meg a helyreállítás-kezelő
tevékenységeit, ha az utolsó lemezre
került naplóbejegyzés:
a) <START U>
b) <COMMIT U>
c) <T, E, 50>
d) <COMMIT T>
8.3.5. Feladat
- REDO naplózás
ellenőrzőponttal, hasonló
példa: naplo.ppt
(84-91.oldal)
-- Ellenőrzőpont képzés
(működés közbeni)
-- <START CKPT(T1, T2, ... Tk)> + FLUSH LOG
-- A START CKPT előtt befejeződött
tranzakciók
még lemezre nem írt
módosításainak
kiírása
-- <END CKPT> + FLUSH LOG
--
-- A helyreállításhoz elég
a
legutóbbi <END CKPT> előtti <START
CKPT(Ti)>
tranzakciói
-- közül a legkorábbinak a
kezdetéig ->
<START Ti>-ig visszamenni.
--
Tegyük fel, hogy a napló a következő
bejegyzéssorozatot tartalmazza:
<START S>
<S,A,60>
<COMMIT S>
<START T>
<T,A,10>
<START U>
<U,B,20>
<T,C,30>
<START V>
<U,D,40>
<V,F,70>
<COMMIT U>
<T,E,50>
<COMMIT T>
<V,B,80>
<COMMIT V>.
--
Tegyük fel továbbá, hogy a
működés
közbeni ellenőrzőpont-képzést
kezdjük
alkalmazni,
közvetlenül az alábbi
naplóbejegyzések
(memóriában való)
megjelenésétől
kezdve:
a) <S,A,60>.
b) <T,A,10>.
c) <U,B,20>.
d) <U,D,40>.
e) <T,E,50>.
--
Az a)–e)
helyzetek
mindegyikére válaszoljuk meg az alábbi
kérdéseket:
i) Mely pontokban fordulhat elő az <END CKPT>
felírása, és
ii) Minden lehetséges hibabekövetkezési
ponthoz
adjuk meg, hogy a naplóban meddig kell
visszatekintenünk ahhoz, hogy
megtaláljuk az
összes befejezetlen tranzakciót.
Vegyük figyelembe mindkét
lehetőséget,
azt is, hogy a hibát megelőzően az
<END
CKPT> felíródott a
naplóba és azt is, ha nem.
P6. Feladatok
undo/redo naplózásra
és
helyreállításra
Molina-Ullman
8.4. fejezete:
Undo/redo naplózás és
helyreállítás
8.4.1. Feladat
- UNDO/REDO
naplóbejegyzések, hasonló
példa: naplo.ppt
(92-95.oldal)
-- EA alapján: UNDO/REDO naplózás
szabályai:
-- először a naplózást írjuk
ki, csak
utána magát a
módosítást
-- (a COMMIT-ot kiírhatjuk a
módosítások
kiírása előtt is vagy utána is)
Adjuk meg a 8.1.1. feladatban szereplő T1: A := A + B; B := A + B;
tranzakcióhoz
tartozó számításokat
és
beolvasó-kiíró
tevékenységeket, mutassuk be a
tranzakció
lépésenkénti
hatását a memóriában
és a lemezen tárolt adatokra. Tegyük
fel, hogy
kezdetben A = 5
és B = 10. Adjuk meg az UNDO/REDO
típusú
naplóbejegyzéseket!
8.4.3.
Feladat
- Helyreállítás UNDO/REDO
naplóból, hasonló
példa: naplo.ppt
(96-101.oldal)
-- Helyreállítás:
-- A COMMIT-tal nem rendelkező tranzakciókat UNDO-zzuk, majd
a
naplóba <ABORT T>
-- A COMMIT-tal rendelkező tranzakciókat REDO-zzuk.
A következő UNDO/REDO
naplóbejegyzés-sorozat a T és U
két tranzakcióra vonatkozik:
<START T>
<T, A, 10, 11>
<START U>
<U, B, 20, 21>
<T, C, 30, 31>
<U, D, 40, 41>
<COMMIT U>
<T, E, 50, 51>
<COMMIT T>
--
Adjuk meg a helyreállítás-kezelő
tevékenységeit, ha az utolsó lemezre
került naplóbejegyzés:
a) <START U>
b) <COMMIT U>
c) <T, E, 50, 51>
d) <COMMIT T>
8.4.5. Feladat
- UNDO/REDO naplózás
ellenőrzőponttal, hasonló példa:
naplo.ppt
(102-107.oldal)
-- Ellenőrzőpont képzés
-- <START CKPT(T1, T2, ... Tk)> + FLUSH LOG
-- Az összes piszkos puffer lemezre
írása
-- <END CKPT> + FLUSH LOG
--
-- A helyreállításhoz elég
a
legutóbbi <END CKPT> előtti <START
CKPT(Ti)>
tranzakciói közül
-- a legkorábbinak a kezdetéig ->
<START Ti>-ig
visszamenni. Az UNDO műveleteket az iménti
-- bejegyzésig visszamenve kell végrehajtani, a
REDO
műveleteket azonban elég a
-- <START CKPT(Ti)>-től előrefelé haladva
(lásd
naplo.ppt 104-106 old.)
--
-- Ha visszafelé haladva <START CKPT(Ti)> -vel
találkozunk előbb azt figyelmen kívül
hagyjuk,
-- és keressük visszafelé a
legutóbbi <END
CKPT>-t.
--
Tegyük fel, hogy a napló a következő
bejegyzéssorozatot tartalmazza:
<START S>
<S,A,60,61>
<COMMIT S>
<START T>
<T,A,61,62>
<START U>
<U,B,20,21>
<T,C,30,31>
<START V>
<U,D,40,41>
<V,F,70,71>
<COMMIT U>
<T,E,50,51>
<COMMIT T>
<V,B,21,22>
<COMMIT V>.
--
Tegyük fel továbbá, hogy a
működés
közbeni ellenőrzőpont-képzést
kezdjük
alkalmazni,
közvetlenül az alábbi
bejegyzések
(memóriában való)
megjelenésétől
kezdve:
a) <S,A,60,61>.
b) <T,A,61,62>.
c) <U,B,20,21>.
d) <U,D,40,41>.
e) <T,E,50,51>.
--
A fenti a)-e) esetekre adjuk meg, hogy:
i) Mikor írható fel az <END
CKPT>
naplóbejegyzés, és
ii) Bármelyik lehetséges pillanatban, ha hiba
lép
fel, meddig kell a naplóban visszafelé tekinteni
ahhoz, hogy minden, be nem fejezett tranzakciókra
vonatkozó bejegyzést megtaláljunk.
Fontoljuk meg mindkét lehetőséget is, hogy a hiba
az
<END CKPT> naplóbejegyzés
felírása
előtt vagy az után jelentkezik.