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
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 chybyhw 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
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
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
Příklad - algoritmus bankéře: V bance se jednoduchou operací převádí částka 100.-Kčz jednoho konta na druhé. program read(a,a) a:=a-100 write(a,a) output(a) read(b,b) b:=b+100 write(b,b) output(b) paměť a=500 a=400 b=500 b=600 porucha systému? databáze A=500, B=500 A=400, B=500 A=400, B=600 6
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
Ř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
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
Příklad: program paměť log databáze A=500, B=500 1. read(a,a) a=500 a:=a-100 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
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 databáze 1. read(a,a) A=500, B=500 write(la,a) a=500 output(la) La=500 a:=a-100 a=400 write(a,a) output(a) A=400 read(b,b) a=400, b=500 write(lb,b) output(lb) La=500, Lb=500 b=b+100 a=400, b=600 write(b,b) output(b) A=400, B=600 2. read(la,a) a=500 write(a,a) output(a) A=500 read(lb,b) a=500, b=500 write(b,b) output(b) A=500, B=500 12
13
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 databáze kopie změny... havárie aktual obnova log čas 14
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
Příklad: 16
Realizace v programu (v SŘBD podporujícím transakce)...... begin transaction begin work příkaz příkaz... transakce......... if ERROR then rollback if ERROR then rollbackwork else commit else commit work end transaction end work...... 17
Transakční analýza Příklad: algoritmus bankéře begintransaction 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ď begintransaction {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 : vybraná, opsáno ze Sklad, jen pro čtení název : opsáno ztabulky Sklad, jen pro čtení změna : =1 (příjem), bez editace datum : dnešní, možnost přepsat, kontrola na měsíc mnoz : >0 cenpri: >0 nebo NULL cizakaz : kontrola na existenci vzakázka nebo NULL cifak : kontrola na existenci ve Faktpnebo 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.mnoza 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ď begintransaction 2. zobraz seznam karet ze Sklad uživatel vybere kartu endtransaction 3. zapamatuj Sklad.karta, Sklad.cenj a Sklad.mnozdo 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.mnoza Sklad.cenj begintransaction 8. zapišnový záznam z Ppohyb do Pohyb 9. modifikuj záznam karty ve Sklad endtransaction 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 1. Pro všechen přijatý materiál na faktuře dodavatele proveď begintrans 2. zobraz seznam karet ze Sklad uživatel vybere kartu endtrans 3. zapamatuj Sklad.karta, Sklad.cenj a Sklad.mnozdo 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.mnoza Sklad.cenj 8. Konec cyklu pro jeden materiál begintrans 9. zapišnovézáznamy z PPohyb do Pohyb 10. modifikuj záznamy všech karet ze PSklad ve Sklad endtrans OK 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