Databázové a informační systémy NÁVRH IMPLEMENTACE 2 KONZISTENCE DATABÁZE
1
KONZISTENCE DATABÁZE Jedním z velkých nebezpečí při provozu IS je porušení konzistence databáze.
Konzistence databáze je vzájemný soulad údajů v databázi. Konzistence databáze může být porušena • vlivem špatného návrhu struktury databáze ⇒ redundance ⇒ nekonzistence (řeší datová analýza) • chybnými funkcemi nad databází ⇒ chybné údaje (řeší funkční analýza) • během běhu aplikační úlohy vlivem systémové chyby HW nebo SW (řeší návrh implementace – transakční analýza) • během uložení na vnějším médiu (řeší návrh implementace – zálohování databáze a změn)
2
Transakce Transakční analýza řeší možná porušení konzistence dat během běhu aplikační úlohy Příčiny: poruchy diskové paměti výpadky napětí a s tím spojená ztráta informací v operační paměti chyby HW chyby programového vybavení – OS, SŘBD, IS Vznik: datové soubory se přenášejí mezi diskem a pamětí po blocích aplikační programy nad daty provádějí operace - čtou data z disku, někdy je modifikované zapisují zpět na disk, vše po blocích
3
Transakce
read (X,PX) načítá databázovou hodnotu X do lokální proměnné PX; není-li blok s hodnotou X právě umístěn v paměti, provede se operací input (X) přesun bloku z disku do vyrovnávací paměti; hodnota X se z vyrovnávací paměti přenese do PX. write (X,PX) hodnotu lokální proměnné PX zapíše do databázové položky X ve vyrovnávací paměti; pokud blok, ve kterém je X umístěna, není v operační paměti, provede se nejprve operací input (X) jeho přesun z disku do vyrovnávací paměti; pak se provede přenos hodnoty proměnné PX do X. 4
Transakce Obě operace nevyžadují zápis na disk příkazem output (X). Blok s daty je na disk zapsán teprve v jedné z následujících situací: • správce vyrovnávací paměti potřebuje v paměti místo pro jiný blok • program končí práci s datovým souborem příkazem close, pak správce zapíše všechny bloky tohoto souboru na disk • program dá příkaz k zápisu změn provedených z cache na disk (vynucený výstup) Operace output(X) nemusí bezprostředně následovat za write(X,PX), protože v bloku, kde se X nalézá, mohou být umístěny další položky, se kterými chce program pracovat. Když dojde k chybě mezi operací write a output, ztratí se nová informace uložená v cache, dosud nezapsaná na disk. Řešení: IS musí být schopen chybu detekovat a vrátit se do stavu před výskytem chyby - obnovit hodnoty dat, pro které ještě konzistence platila. 5
Transakce Příklad - algoritmus bankéře: V bance se jednoduchou operací převádí částka 100.- Kč z jednoho konta na druhé. program
paměť
databáze A=500, B=500
read(A,a)
a=500
a:=a-100
a=400
write(A,a) output(A)
A=400, B=500
read(B,b)
b=500
b:=b+100
b=600
write(B,b) porucha systému ? output(B)
A=400, B=600 6
Transakce • Za porušení konzistence zde považujeme stav, kdy součet A+B se změní. • Dojde-li k poruše před první operací output, není porušena konzistence, jen integrita. To se dá vyřešit zopakováním celé transakce, až je chyba systému odstraněna. • Dojde-li však k chybě mezi dvěma operacemi output, je porušena konzistence i integrita a přitom není možné celou operaci spustit znovu.
7
Transakce Řešení pomocí transakcí Transakcí nazýváme základní logickou jednotku zpracování, která pro zachování konzistence musí proběhnout buď celá, nebo se vrátit na začátek a později zopakovat. Transakce je tedy atomická, logicky nedělitelná operace.
• Metody zajištění transakcí mají společnou vlastnost: pracují s kopiemi dat tak dlouho, dokud není jasné, že transakce proběhla bezchybně celá, nebo že je nutné ji zopakovat. • Databázové transakce mohou být složeny z vysokého počtu operací. • Transakce se vždy týkají jen změn v databázi. 8
Transakce Metoda zpožděné aktualizace Výsledky transakce nezapisuje přímo do databázového souboru, ale do pomocného systémového souboru log. Pokud dojde při transakci k chybě, může se celá provádět znovu, protože původní data nebyla změněna. Přitom se obsah pomocného souboru začne vytvářet znovu, původní je ignorován. Skončí-li transakce úspěšně, obsah souboru log se překopíruje do skutečného datového souboru. Pokud by došlo k chybě při kopírování, může se spustit znovu tolikrát, dokud neskončí tato druhá etapa úspěšně. Operace, které je možno spouštět opakovaně, aniž by došlo k porušení konzistence dat, nazýváme operacemi typu redo.
Původní transakce, která nebyla znovuspustitelná, se rozdělila na dvě znovuspustitelné části. Ty se opakují, dokud neproběhnou obě až do konce. 9
Transakce Příklad: program
paměť
log
databáze A=500, B=500
1. read(A,a) a:=a-100
a=500 a=400
write(La,a) output(La)
La=400
read(B,b)
b=500
b:=b+100
b=600
write(Lb,b) output(Lb)
La=400, Lb=600
2. read(La,a) write(A,a) output(A)
A=400
read(Lb,b) write(B,b) output(B)
A=400, B=600
10
Transakce Metoda přímé aktualizace Provádí zápis do výsledného datového souboru přímo, avšak pro případ neúspěšného ukončení transakce si zaznamená do souboru log počáteční hodnoty před transakcí – objektů (záznamů, tabulek), které transakce modifikuje. Skončí-li transakce úspěšně, obsah pomocného souboru log se ignoruje. Dojde-li v průběhu transakce k chybě, překopírují se z pomocného souboru původní hodnoty zpět do datového souboru. Operace, která obnoví původní hodnoty dat v souboru se nazývá operací typu undo a musí mít stejnou vlastnost jako operace redo, tj. že ji lze opakovat tak dlouho, dokud nebude provedena bez poruchy, aniž by to mělo vliv na její výsledek. • Oběma takovým operacím říkáme idempotentní operace. • Obě metody používají systémový soubor log pro ukládání protokolu o průběhu transakcí, ty se dají využít i při obnově databáze ze záložní kopie.
11
Příklad: program
paměť
log
1. read(A,a)
databáze A=500, B=500
write(La,a) output(La)
a=500
a:=a-100
a=400
La=500
write(A,a) output(A) read(B,b) write(Lb,b)
A=400 a=400, b=500
output(Lb) b=b+100
La=500, Lb=500 a=400, b=600
write(B,b) output(B) 2. read(La,a)
A=400, B=600 a=500
write(A,a) output(A) read(Lb,b)
A=500 a=500, b=500
write(B,b) output(B)
12
A=500, B=500
Transakce
13
Transakce Využití souboru log pro obnovu databáze • pravidelné uchovávání kopií databáze • uchovávání souboru log • po havárii databáze provedení změn nad poslední kopií podle log kopie
havárie
kopie databáze změny ...
aktual
log obnova
čas
14
Transakce Metoda stínového stránkování k popisu uložení dat v databázi na disku dvě pomocné tabulky stránek. Bloky na disku označuje jako stránky a v tabulkách stránek jsou postupně diskové adresy bloků databáze. Před zahájením transakce mají obě pomocné tabulky stejný obsah - aktuální adresy obsazených stránek. Stínová tabulka zůstává stejná. Pokud se během transakce mění obsah některé stránky, nechá se na disku původní stránka beze změny a stránka s novým obsahem se zapíše na prázdné místo na disku. V aktuální tabulce stránek se změní odkaz na novou stránku, ve stínové tabulce odkazů zůstává odkaz na starou stránku. Skončí-li transakce bezchybně, platí aktuální tabulka a místo se starým obsahem stránky na disku se uvolní pro další použití. Skončí-li transakce poruchou, platí stínová stránka, která obsahuje odkazy na stránky před zahájením transakce. Uvolní se naopak stránky se změněnými hodnotami, transakce se může zopakovat. Problémem při tomto způsobu práce je evidence uvolněných stránek (garbage collection = sběr smetí) a uvolňování pro další použití. To zvyšuje složitost a režii celého systému. 15
Transakce Příklad:
16
Transakce Realizace v programu (v SŘBD podporujícím transakce) ... begin transaction příkaz ... transakce ... if ERROR then rollback else commit end transaction ...
... begin work příkaz ... ... if ERROR then rollback work else commit work end work ...
17
Transakční analýza Příklad: algoritmus bankéře begin transaction read(A,a) a:=a-100 write(A,a) read(B,b) b:=b+100 write(B,b) if ERROR then rollback else commit end transaction
18
Transakční analýza Příklad: 1.1. příjem do skladu – transakční analýza – základ, XXX 1. Pro všechen přijatý materiál na faktuře dodavatele proveď begin transaction {před prvním databázovým příkazem} 2. zobraz seznam karet ze Sklad uživatel vybere kartu 3. zapamatuj Sklad.karta, Sklad.cenj a Sklad.mnoz 4. zobraz formulář příjmu pro vybranou kartu, uživatel vyplní karta : název : změna : datum : mnoz : cenpri : cizakaz : cifak :
vybraná, opsáno ze Sklad, jen pro čtení opsáno z tabulky Sklad, jen pro čtení =1 (příjem), bez editace dnešní, možnost přepsat, kontrola na měsíc… >0 >0 nebo NULL kontrola na existenci v Zakázka nebo NULL kontrola na existenci ve Faktp nebo NULL
5. zapiš vyplněný formulář jako nový záznam do Pohyb 6. vypočti nové množství ve skladu, cenu jedn - zprůměrovanou 7. modifikuj v záznamu Sklad.karta hodnoty Sklad.mnoz a Sklad.cenj end transaction {po posledním databázovém příkazu} 8. Konec cyklu pro jeden materiál
19
Transakční analýza Příklad: 1.1. příjem do skladu – transakční analýza – po záznamech 1. Pro všechen přijatý materiál na faktuře dodavatele proveď begin transaction 2. zobraz seznam karet ze Sklad uživatel vybere kartu end transaction 3. zapamatuj Sklad.karta, Sklad.cenj a Sklad.mnoz do pole PSklad 4. zobraz formulář příjmu pro vybranou kartu, uživatel vyplní karta : vybraná, opsáno ze Sklad, jen pro čtení … mnoz : >0 cenpri : >0 nebo NULL 5. zapiš vyplněný formulář jako nový záznam do pole PPohyb 6. vypočti nové množství ve skladu, cenu jedn - zprůměrovanou 7. modifikuj v poli PSklad.karta hodnoty Sklad.mnoz a Sklad.cenj begin transaction 8. zapiš nový záznam z Ppohyb do Pohyb 9. modifikuj záznam karty ve Sklad end transaction 10. Konec cyklu pro jeden materiál 20
Transakční analýza Příklad: řešení bez přístupu uživatele uvnitř globální transakce
OK
1. Pro všechen přijatý materiál na faktuře dodavatele proveď begin trans 2. zobraz seznam karet ze Sklad uživatel vybere kartu end trans 3. zapamatuj Sklad.karta, Sklad.cenj a Sklad.mnoz do pole PSklad 4. zobraz formulář příjmu pro vybranou kartu, uživatel vyplní karta : vybraná, opsáno ze Sklad, jen pro čtení … mnoz : >0 cenpri : >0 nebo NULL 5. zapiš vyplněný formulář jako nový záznam do pole PPohyb 6. vypočti nové množství ve skladu, cenu jedn - zprůměrovanou 7. modifikuj v poli PSklad.karta hodnoty Sklad.mnoz a Sklad.cenj 8. Konec cyklu pro jeden materiál begin trans 9. zapiš nové záznamy z PPohyb do Pohyb 10. modifikuj záznamy všech karet ze PSklad ve Sklad end trans 21
KONZISTENCE DATABÁZE Malé SŘBD • nepodporují transakce • nemají prostředky pro obnovu aktuálního stavu báze pomocí log • konstrukce elementárních funkcí IS nutně jako znovuspustitelné, jsou nutné vhodné techniky programování - elementární funkce jako znovuspustitelné v dávce = opět transakční analýza, programové řešení jiné - při zpracování uvnitř souboru provádět nevratné změny na kopii souboru (aritmetika, třídění) - připravovat předem bezchybné dávky dat pro dávkový vstup a modifikaci - častější zápis na disk interaktivně, třeba vynucený • tyto postupy jsou náročnější na implementaci, zvětšují paměťové a časové nároky při běhu na IS, ale jsou bezpečné. 22
KONZISTENCE DATABÁZE Porušení konzistence dat ve vnější paměti • ke ztrátě informace může dojít také na disku • ochrana dat na vnějším médiu by měla být součástí každého IS • základní metodou ochrany diskových dat je důsledné a pravidelné kopírování obsahu disku • během ukládání nesmí být prováděny žádné transakce a uloženy musí být všechny informace, z nichž by bylo možno rekonstruovat databázi v případě poruchy (soubory log ap.). • zničená data ve vnější paměti se zrekonstruují obnovením dat ze staré kopie a automatickým provedením všech modifikací ze souboru log • větší SŘBD obsahují prostředky pro průběžný záznam modifikací databáze i pro obnovu databáze z její starší kopie; do IS se pomocí nich budují moduly pro zabezpečení ochrany dat.
23