Undo log (Semmisségi naplózás)
Cél: Az konzisztens adatbázis állapot visszaállítása
Undo - Példa
Folytatva az előző példával, illetve előző megkötéssel (miszerint
A=B)
Bejegyzés tartalma
<T1, A, 5>
T1- Tranzakció azonosítójaA- Módosított mező5- módosítás előtti érték
Naplózás ideje
Naplóba írás után kell , hogy az új adat rákerüljön a lemezre
- Adatmódosításról a napló a változtatás előtt frissül
- ha elszálna, a régi érték saját magával felülírása nem okozhat gondot
- Sikeres tranzakciónak állapotát
<COMMIT>csak minden változtatás elvégzése után kerülhet be a naplóba- Különben lehetne hiányzó módosítás, amit nem tudnánk felderíteni
Ebből következik, hogy ha módosítás van bent, nem biztos, hogy még megtörtént, ha COMMIT van bennt, akkor minden hozzá tartozó bejegyzés már megtörtént.
Írás sorrendje
- A módosítások maguk, illetve azok bejegyzésük külön-külön kell végrehajtani
- Nem lehet csoportosítani őket!
- A bejegyzések lemezre írásának elrendelésére(kikényszerítésére) a
FLUSH LOGművelet kell- Ekkor a pufferkezelő minden még lemezre nem írt naplóblokkot kiírja a lemezre
Legend
t- VáltozóM-A-Aértéke a memóriábanM-B-Bértéke a memóriábanD-A-Aértéke a lemezenD-B-Bértéke a lemezen- Napló - napló, lol
| Lépés | Tevékenység | t |
M-A |
M-B |
D-A |
D-B |
Napló |
|---|---|---|---|---|---|---|---|
| 1 | <T, START> |
||||||
| 2 | READ(A,t) |
8 | 8 | 16 | 8 | 8 | |
| 3 | t:=t*2 |
16 | 16 | 16 | 8 | 8 | |
| 4 | WRITE(A,t) |
16 | 16 | 16 | 8 | 8 | <T,A,8> |
| 5 | READ(B,t) |
8 | 16 | 8 | 8 | 8 | |
| 6 | t:=t*2 |
16 | 16 | 8 | 8 | 8 | |
| 7 | WRITE(B,t) |
16 | 16 | 16 | 8 | 8 | <T,B,8> |
| 8 | FLUSH LOG |
16 | 16 | 16 | 8 | 8 | |
| 9 | OUTPUT(A) |
16 | 16 | 16 | 8 | 8 | |
| 10 | OUTPUT(B) |
16 | 16 | 16 | 8 | 8 | |
| 11 | <T, COMMIT> |
||||||
| 12 | FLUSH LOG |
What EA gave us
Gyors tippek
Ha hiba történik, és visszaállításra van szükség:
- Ha a tranzakciónak a
START, és vagyCOMMIT, vagyABORTbejegyzése naplóban van már(!), akkor rendebn van, nem kell helyreállítani - Ha
STARTvan, de nincs lezárva, akkor minden lépését meg kell ismételni visszafele, majd abortálni a tranzakciót
Ellenőrzőpont
CHECKPOINTparanccsal megtiltunk minden új tranzakció indítását, amíg minden más tranzakció le nem zárul- Ilyenkor
FLUSH LOG-al kiírunk mindent - Felvesszük a
<CKPT>-t a naplóba - Újabb
FLUSH LOG - Újra kezdhetőek tranzakciók
Éppen ezért elég csak a legutolsó
CHECKPOINT-ig elmenni helyreállításkor, mert előtte minden tranzakció már lezárult
Na de Kotlin, egy tranzakció órákig is tarthat Enterprise™️ rendszereken, nem érünk rá mindent megvárni...
Hát jah, de cseppet se félj, van erre is módszer (send help)
Ellenőrzőpont működés közben
Non-quiescent checkpointing
<START CKPT(T1,...,Tk)>- Ahol T1, ..., Tk az akkor még aktív tranzakciók nevei
FLUSH LOG- Ezután meg kell várni, hogy ezek befejeződnek (valahogy), de továbbra is indíthatóak újjabb tranzakciók
<END CKPT>- Miután az aktív tranzakciók mind lezárultak
Ellenőrzőpont helyreállítása
Így két eset fordulhat elő helyreállításkor:
- Keresünk, és
<START CKPT(...)>-t találunk- Tudjuk ebből, hogy melyek voltak aktívak, minden más OK volt
- Tehát állítsuk vissza T1, ... , Tk tranzakciókat, és jó lesz
- A legkorábban kezdődő T1 tranzakcióig viszont vissza kell menni, hogy undo-olhassuk
- Keresünk, és
<END CKPT>-t találunk- Előtte minden jó, kész vagyunk
Speciális(abb) eset:
<START CKPT(...)>előtt egy másik<START CKPT(...)>-ot találunk- Egyszerre csak egy checkpoint kezdeményezhető, akkor ez meg mi??!
- Fun, I know
- Ez csak azt jelenheti, hogy az előző checkpoint létrehozásakor egyszer már történt redszerhiba, ami vissza lett állítva
- (különben nem lennénk itt)
- Az ilyen bejegyzéseket figyelmen kívül kell hagyni
Pro tipp
- Egy
<END CKPT>-hez tartozó<START CKPT>előtt minden bejegyzés törölhető - Az ugynazon tranzakcióhoz tartozó naplóbejegyzéseket összeláncolva elég csak ezeken a láncokon iterálni helyreállításkor