UL/FRI/VSP-RI/PB1/Vaje/2006-01-04
Iz E-študij, proste zakladnice študentskega znanja
|
Vaje z dne 04.01.2006
Vodil: Matjaž Kukar |
Pogovor o snovi iz 8. poglavja, Obnavljanje podatkovne baze iz knjige Uvod v podatkovne baze, avtor Tomaž Mohorič
Kdaj je podatkovno bazo potrebno obnoviti?
Tipičen razlog je če pride do nekakšne podatkovne nesreče (s podatkovnim strežnikom se kaj narobe zgodi).
Transakcija je zaporedje operacij ki se morajo izvršiti v celoti, da podatkovna baza preide iz enega v drugo veljavno stanje.
Tipi podatkovnih nesreč:
- sistemska nesreča (računalnik crkne)
- diskovna nesreča
- transakcijska nesreča (zgodi se znotraj ene same transakcije, in se tiče samo podatkov te transakcije, transakcijo je treba razveljaviti)
- uporabniška nesreča (uporabnik sproži obdelavo podakov, ki spreminja bazo ob napačnem času - recimo izračun plač)
Kako se lotimo takih problemov?
Z uporabo dvojne podatkovne baze, vsa ažuriranja, ki se vršijo na podatkovni bazi, se vršijo na obeh koncih. Uporablja se tudi v primeru, če je ena baza nedostopna (uporablja se v banki).
Z zrcaljenjem diskov (na nivoju diskovnega kontrolerja), elegantno reši problem diskovne nesreče, problem pa je pri sistemski nesreči. V primeru diskovne nesreče prevzame delo drugi disk. Če pa imamo dva računalnika, potem rešitev reši problem tudi sistemske nesreče.
Loti se problema transakcijskih nesreč. Med transakcijo se pri na primer prepisu podatka naredi kopija (nova alokacija spomina) in se vanjo zapiše podatek iz transakcije. Po končani transakciji se prepiše na mesto originala.
Sistemske nesreče so dokaj redke, pri predpostavki, da se uporablja za podatkovni strežnik uporablja ne okenski operacijski sistem. V določenih časovnih intervalih (določeno s politiko varnostnega shranjevanja) se dela kopija podatkovne baze (na primer na trakovne nosilce). Če pride do nesreče, se obnovi podatkovno bazo iz kopije in s pomočjo dnevnika se restavrira podatkovno stanje do transakcija natančno.
Tipičen primer politike varnostnega shranjevanja:
- med tednom: ponoči - celotna podatkovna baza v dveh kopijah (ena kopija se zjutraj odnese na oddaljeno lokacijo, druga ostane za potrebe restavriranja), med 7-16 uro vsake 15 minut shranjevanje samo dnevnika
- sobota/nedelja - celotna podatkovna baza
- konec meseca - celotna podatkovna baza - mesecna kopija za arhiv, se hrani 12 mesecev
- na pol leta - celotna podatkovna baza - arhiv
Največja malomarnost, ki se pogosto zasledi pri številnih podjetjih, ki imajo urejeno politiko in sistem varnostnega shranjevanja je, da zanemarjajo poskusne restavracije.
Mimogrede, varnostno shranjevanje sploh ni poceni. Že sami trakovi, za realizacijo zgoraj omenjene politike varnostnega shranjevanja lahko stanejo celo bogastvo, da ne govorimo o dodatni infrastrukturi in kadru, ki je potrebno za realizacijo politike varnostnega shranjevanja. Je pa seveda v primerjavi s trajno izgubo podatkovne baze cena res majhna. Da ne bomo samo teorizirali naj omenim, da praktično vse podatkovne baze omogočajo shranjevanje preko tako imenovih vmesnikov API (Oracle - RMAN, MS SQL - SQL API, ...).
Te vmesnike izkoriščajo številni programi za varnostno shranjevanje: hp DataProtector, Atempo TimeNavigator, Veritas (Symantec) NetBackup, ...
Varnostne kopije se ločijo na online/offline ali tople in mrzle kopije. Gre za način shranjevanja, ko prvič bazo shranimo med njenim delovanjem in mora baza za dosego konsistentnosti med shranjevanjme izvajati posebno proceduro, ki omogoča konsistentnot (v trenutku zahteve po shranjevanju baza preide v poseben način, ko se transakcije zadržujejo), ob koncu shranjevanja se baza povrne v normalno delovanje, transakcije, ki se se nabrale v čakalnici pa so uveljavijo v bazo naknadno.
Drugi način (cold) pa je preprosto tak, da se bazo ugasne in shrani vse datoteke, ki predstavljajo podatke baze. Če je mogoče bazo ustaviti, kar je odvisno od namembnosti same podatkovne baza je ta način veliko bolj varen, predvsem pa je postopek povrnitve enostvejši in časovno manj zahteven. Slabost je da, se restavracija lahko naredi le v trenutek, ko je bila baza ugasnjena.
Toplo shranjevanje, ki vedno vključuje tudi shranjevanje dnevnika, omogoča restavracijo v poljubno časovno točko ali do ene transakcije natačno. Transakcije imajo lahko poleg časovnege atributa tudi ime, ki se lahko uporabi z namenom lažjega identificiranja pri restavraciji. Primer: pred blokovno obdelavo na bazi, damo prvi transakciji ime, po kateri jo potem v primeru restavraciji identificirami. Primer take restavracije na MS SQL bazi:
RESTORE LOG Users FROM DISK = 'D:\tina\atmpsqlv2\Users\tina.0003.00.0000000002.l'
WITH RECOVERY, STOPBEFOREMARK= 'IzracunPlace' # restvaracijo dnevnika opravimo do transakcije, katere ime je Izracun place
Prednost je:
- veliko nižja cena
- večja fleksibilnost (ekvivalentno obravnavamo vse tri nesreče)
Za dnevnik je treba skrbeti, da je na varnem, če se zgodi sistemska nesreča. Če se kopije podatkovne baze delajo enkrat dnevno/tedensko (odvisno od sprememb), potem dnevnik ni velik in je razmeroma majhen in je tako strukturo možno poceni restavrirati.
Transakcijski ukazi
Transakcijski program je samo program v nekem poljubnem programskem jeziku z nekaj dopolnitvami.
Ne zanima nas kako teče program ampak samo transakcijski ukazi, način komunikacije:
- začni (ukaz za začetek transakcijskega programa, transakciji se dodeli neka številka, process id)
- pomni (ukaz pomeni, da se je naša transakcija uspešno zaključila)
- pozabi (pomeni neuspešen zaključek)
- poišči preberi (X,x) (ekvivalnentno stavku x=X, x je spremenljivka v programu, X je naslov v podatkovni bazi, če lokacija ne obstaja, pride do napake)
- spremeni (X,x) (ekvivalentno X=x)
- dodaj (X,x) (na neko novo lokacijo doda vrednost)
- briši (X) (briše s te lokacije)
spremeni, dodaj, briši so ukazi za ažuriranje, Ažuriraj(X,x)
V dnevniku se bodo hranili podatki o začetku, koncu in ažuriranju transakcije.
Kako izgleda dnevnik
Dnevnik je na primer nekakšna teksovna datoteka, kjer je vsak zapis ena vrstica v tej datoteki.
- začni: <T, t, Začetek, ImePrograma, Parametri>
- pomni: <T, t, Pomni>
- pozabi: <T, t, Pozabi>
Odloženo ažuriranje:
- ažuriranje: <T, t, NovaVrednost, VrstaOperacije, (naslov, vrednost)>
Neposredno ažuriranje:
- ažuriranje:
- <T, t, StaraVrednost, VrstaOperacije, (naslov, vrednost)>
- <T, t, NovaVrednost, VrstaOperacije, (naslov, vrednost)>
- T = oznaka transakcije
- t = čas generiranja dnevniškega zapisa
- Začetek, NovaVrednost, Pomni, Pozabi so končni nizi (ni neka spremenljivka)
- VrstaOperacije = spremeni/dodaj/briši
- (naslov, vrednost) = na nekem naslovu se je zapisala neka nova vrednost, v primeru brisanja tega ni
Možnosti ažuriranja
Odloženo:
- Spremembe se beležijo samo v dnevnik in se ob uspešno zaključeni transakciji zapišejo v podatkovno bazo. V praksi se bolj uporablja.
Neposredno:
- Podatkovna baza se ažurira takoj pri spremembi, hrani se dnevnik.
- Poleg novih vrednosti zapisujemo še zapis stare vrednosti.
- Ima prednost, kadar je več transakcij, ki se uspešno zaključijo
Zgled 8.1
Zgled je iz knjige, 8. poglavje
Parametri:
- v1 = 1
- v2 = 4
- v3 = 10
Vrednosti v podatkovni bazi:
- P1 = 20
- P2 = 50
- P3 = 70
- P4 = 30
Program:
program Odštej(v1, v2, v3)
Začni // ponavadi se tega ukaza ne piše
za i = v1 do v2 izvedi
Poišči Preberi (Pi, x)
če Pi ne obstaja potem Pozabi
sicer
x = x - v3
Spremeni(Pi, x)
Pomni
Neposredno ažuriranje:
<T0, t0, Začetek, Odštej, (v1, 1), (v2, 4), (v3, 10)> <T0, t1, StaraVrednost, Spremeni, (P1, 20)> <T0, t2, NovaVrednost, Spremeni, (P1, 10)> <T0, t3, StaraVrednost, Spremeni, (P2, 50)> <T0, t4, NovaVrednost, Spremeni, (P2, 40)> <T0, t5, StaraVrednost, Spremeni, (P3, 70)> <T0, t6, NovaVrednost, Spremeni, (P3, 60)> <T1, t7, NovaVrednost, Spremeni, (P5, 50)> <T0, t8, StaraVrednost, Spremeni, (P4, 30)> <T0, t9, NovaVrednost, Spremeni, (P4, 20)> <T0, t10, Pomni>
Ležeča vrstica (pri t7 je ukaz neke druge transakcije in nima veze z našim programom, ampak na bazi se hkrati lahko izvaja več transakcij, zato se v dnevniku logi prepletajo
Odloženo ažuriranje:
Program pod neposrednim ažuriranjem samo brez odebeljenih vrstic (vrstic s staro vrednostjo).
V primeru, če moramo transakcijo razveljaviti, se sprehodimo po dnevniku navzgor in iščemo ukaze s staro vrednostjo in podatke obnovimo, na primer najprej v P3 vrednost 30 (pri t8) itd. Pri odloženem ažuriranju ni treba ničesar razveljaviti, saj ni bilo nič še zapisano.
V primeru, če se podatkovna baza sesuje, prepišemo kopijo baze in se sprehodimo po dnevniku navzdol in iščemo ukaze z novo vrednostjo in jih primerno dodamo/spremenimo/brišemo.
Taka naloga bo na izpitu, lahko je pa v obratno smer, da imamo podatkovno bazo in dnevnik ter da moramo restavrirati podatkovno bazo.
verzija2
- Transakcija
- Transakcijo definiramo kot zaporedje operacij, ki se morajo izvršiti v celoti, da lahko baza preide v naslednje veljavno stanje. Transakcija je ta skupek informacij.
- Obnavljanje s senčnimi stranmi
- Transakcijo izvajamo v neki senčni strani, ko je transakcija dokončana povezavo prevežemo iz starega stanja v novejše stanje (prevežemo v senčno stran).
- Obnavljanje z dnevnikom in kopijo
- Ker so sistemske nesreče relativno redke, ni nujno da bi PB imela takšno toleranco do napak, da bi delovala naprej takoj po nesreči. Zato se v določenih časovnih intervalih lahko dela kopija PB na nek počasnejši medij. Med temi intervali pa se vodi dnevnik sprememb podatkov. Če pride do nesreče se PB obnovi iz kopije, zadnje veljavno stanje pa se restavrira s pomočjo dnevnika.
- Transakcijski ukazi
Transakcija je zgolj nek program (programski jezik ni pomemben) z določenimi dodatki, ki komunicirajo s PB.
Transakcijski ukazi so:
- začni
- pove, naj se začne izvajati transakcijski program
- ob zagonu se transakciji priredi identifikacijska (ID) številka transakcije
- pomni
- pove, da se je transakcija uspešno zaključila
- pozabi
- pove, da se je transakcija neuspešno zaključila
- poišči preberi(X,x)
- ekvivalentno: x=X
- x je spremenljivka v programu
- X je naslov v podatkovni bazi
- spremeni(X,x)
- ekvivalentno: X=x
- Ažuriranje
- dodaj(X,x)
- doda vrednost na neko novo lokacijo
- briši(X)
- briše iz dane lokacije
- ažuriraj(X,x)
V dnevnik se pišejo: začetek, konec (uspel, neuspel), ukazi za ažuriranje
- Dnevnik
- dnevnik je predstavljen kot tekstovna datoteka, kjer je vsak zapis 1 vrstica v tej datoteki
Pri odloženem ažuriranju je način sledeč:
Dnevniški zapis ukaza začni:
< T, t, začetek, ime programa, parametri >
- T
- oznaka transakcije
- t
- čas generiranja dnevniškega zapisa
Dnevniški zapis ukazov za ažuriranje:
< T, t, NovaVrednost, VrstaOperacije,(naslov, vrednost) >
- vrsta operacije
-
- spremeni
- dodaj
- briši
pri brisanju ni podatka vrednost
pomni
<T,t,pomni>
pozabi
<T,t,pozabi>
Izgled dnevnika je odvisen od tega kako se ažurirajo podatki v PB.
Pri neposrednem (sprotnem) ažuriranju se k vsakem zapisu doda še stara vrednost.
Dnevniški zapis ukazov za ažuriranje:
< T, t, StaraVrednost, VrstaOperacije,(naslov, vrednost) > < T, t, NovaVrednost, VrstaOperacije,(naslov, vrednost) >
- Primer
Imamo transakcijski program, ko sledimo njegovemu izvajanju gledamo kakšen dnevnik nastane.
Parametri:
- V1 = 1
- V2 = 4
- V3 = 10
Vrednosti v PB:
- P[1] = 20
- P[2] = 50
- P[3] = 70
- P[4] = 30
Program:
program Odštej(v1,v2,v3)
Začni
za i = v1 do v2 izvedi
PoiščiPreberi(P[i],x)
če P[i] ne obstaja potem Pozabi
sicer
x = x - v3
Spremeni(P[i],x)
Pomni
Neposredno ažuriranje:
<T0,t0,Začetek,Odštej,(v1,1),(v2,4),(v3,10)> <T0,t1,StaraVrednost,Spremeni,(P1,20)> <T0,t2,NovaVrednost,Spremeni,(P1,10)> <T0,t3,StaraVrednost,Spremeni,(P2,50)> <T0,t4,NovaVrednost,Spremeni,(P2,40)> <T0,t5,StaraVrednost,Spremeni,(P3,70)> <T0,t6,NovaVrednost,Spremeni,(P3,60)> <T1,t7,NovaVrednost,Spremeni,(P5,50)> <T0,t8,StaraVrednost,Spremeni,(P4,30)> <T0,t9,NovaVrednost,Spremeni,(P3,20)> <T0,t10,Pomni>
Transakcije se lahko prepletajo, rdeča vrstica pripada neki drugi transakciji.
Odloženo ažuriranje:
<T0,t0,Začetek,Odštej,(v1,1),(v2,4),(v3,10)> <T0,t1,NovaVrednost,Spremeni,(P1,10)> <T0,t2,NovaVrednost,Spremeni,(P2,40)> <T0,t3,NovaVrednost,Spremeni,(P3,60)> <T1,t4,NovaVrednost,Spremeni,(P5,50)> <T0,t5,NovaVrednost,Spremeni,(P3,20)> <T0,t6,Pomni>
Ko pride program do ukaza pomni, gre PB nazaj do ukaza začetek in uveljavi vse spremembe do ukaza pomni (v tem primeru ukaze NovaVrednost pri transakciji T0).