====== IN-POS 3. Databáze ====== ===== Zadání ===== * Kódování dat, kompresní kódování dat, organizace souborů dat. * Indexování a hašování, bitmapové indexy, dynamické hašování. * Vyhodnocení dotazů, transformační pravidla, statistiky a odhady. * Optimalizace dotazů a schématu. * Zabezpečení báze dat, přístupová práva. * Transakce, řízení souběžných transakcí, systémy obnovy transakcí po výpadku. * PV062, PA152, PA150 ===== Vypracování ===== FIXME: doladit, doplnit, zpřehlednit ==== Kódování dat ==== **Kódování** = Proces nahrazování symbolů (resp. jejich posloupností) zprávy symboly (resp. jejich posloupností) nabývajících znaků cílové (kódovací) abecedy. Množství získané informace odpovídá velikosti odstraněné neurčitosti získáním informace. i(A) = - log P(A) Pro log_2 je jednotkou **bit**. Neurčitost zdroje zprávy je rovna množství informace v ní obsažení. (Neurčitost je přijetím zprávy odstraněna.) H(X) = sum{i=1}{s}{p_i log_2 p_i} * Každý stav s pravděpodobností svého výskytu přispívá do neurčitosti svojí neurčitostí. * Vztah nabývá maxima pro p_1 = ... = p_s, kde p_i = 1/s. * **Abeceda** = konečná množina znaků (prvků abecedy, písmen,...) * **Kódové slovo** = slovo (posloupnost znaků) v kódové abecedě * **Kódování** = funkce K : A -> A^{+}_C * **Kód** = kódem daného kódování se rozumí obor hodnot zobrazení K === Klasifikace kódů === * Kód s kódovými slovy **pevné** délky. * Kód s kódovými slovy **proměnlivé** délky. * prefixový, sufixový kód * **stupeň** (rate) kódu = průměrný počet bitů použitých pro kódování zdrojových znaků v tomto kódu. * **optimální kód** má stupeň minimálně převyšující množství informace obsažené v symbole zdrojových zpráv. * **Nesingulární kód** = jeho kódovací funkce je prostá * **Jednoznačně dekódovatelný kód** = Všechny možné řetězce jsou jednoznačně dekódovatelné * prefixové, sufixové a blokové kódy jsou jednoznačně dekódovatelné * **Prefixový kód** = Bezprostředně jednoznačně dekódovatelný kód. * Fanovo kódování * kódová slova znaků mají délky úměrné množství informace, které znaky nesou. Př.: * A = 1 , C = 01 , G = 000 a T =001 * např. řetětzec 8 symbolů  ACATGAAC je kódovaný  14 bity: 10110010001101 * tj. v průměru 14/8 = 1.75 b/symbol == Eliasovy kódy == Kódování celých čísel u kterých není předem známá horní hranice. - Zapíšeme číslo dvojkově. - Odečteme 1 od počtu bitů zapsaných v kroku 1 a na začátek připojíme takový počet nul. - Prefix 0 při dekódování určuje délku binární reprezentace. Př.: * n=38, hat{B}(38)= 00110_2 |B(38)|=6 * => C_1(38) = 00000100110 Přeuspořádání C1. * Bity nul se rozptýlý do kódového slova a na konec se přidá 1. Př.: * C_2(5) = 00011 Vyjádření délky kódového slova pomocí C2. * Bity nul se rozptýlý do kódového slova a na konec se přidá 1. Př.: * C_3(50) (50_{10} = 110010_2) * |B(50)| = 6 bitů * C_1(6) = 00110 * C_2(6) = 01001 * C_3(50) = 0100110010 === Kompresní kódování dat === Cílem: * minimalizace stupně kódu * při schopnosti on-line dekódování slov bez vkládání separátorů Prefixový q-ární kód s délkami kódových slov d1,d2,...,dm existuje právě tehdy, když je splněna Kraftova nerovnost: sum{i=1}{m}{q^{{-d}_{i}}} <= 1 Kraftova nerovnost platí pro libovolné jednoznačně dekódovatelné kódování. == Komprese == * **Neztrátová komprese (Lossless Compression)** * dekompresí se získají originální data * Cílem je zobrazení informace do bitového prostoru co nejméně převyšujícího množství informace obsažené v originálních datech. * Typicky komprese textů. * **Ztrátová komprese (Lossy Compression)** * Zefektivnění procesu a výsledku komprese za cenu snížení požadavků na přesnost rekonstrukce. * Informace nevýznamná pro následující zpracování se odstraňuje definitivně. * Typicky komprese obrázků, zvuku,... * Kompresní a dekompresní (rekonstrukční) algoritmus. * **Komprese** = Kódování zprávy délky P(X) [b] na zprávu délky L(X) [b] * cílem je dosažení L(X) << O(X) * ideálně L(X) -> H(X) (neurčitost zprávy; méně bity nelze zakódovat beztrátově) * **Kompresní poměr** = L(X)/O(X) * **Kompresní faktor** = O(X)/L(X) * **Kompresní zisk** = (O(X)-L(X))/O(X) * **Redundance zprávy** = R(X) = O(X) - H(X) * **Redundance komprimované zprávy** = R'(X) = L(X) - H(X) * **Statická komprese** * Neměnná procedura, model. * **Adaptivní komprese** * Procedura komprese se dynamicky mění. * **Fyzická komprese** * Ignoruje se význam komprimovaných dat. * **Logická komprese** * Pro dosažení lepších výsledků se zohledňuje/využívá význam komprimovaných dat. * Převážně ztrátová komprese. == Kompresní metody == * **Základní metody** * Brailovo písmo * Baudotův kód: 5bit kód, číslicová/písmenová změna * RLE (Run Length Encoding): náhrada opakujících se sousedních symbolů čítačem opakování a specifikací opakovaného symbolu * Kódování podle Bentleyho (Move-to-Front Coding): Dynamicky se tvořící abeceda * lokální adaptivita * **Statistické metody** * Metoda na vytvoření prefixového kódu proměnné délky pro známou množinu znaků a četností. * Reprezentace binárním stromem na základě dělení posloupnosti na poloviny dle četností. * Metoda na vytvoření kódu s minimální redundancí. * Tvorba stromu opačným směrem než Shannon-Fannova metoda. (Od spoda nahoru.) Nekóduje jednotlivé symboly zprávy, ale používá jedno kódové slovo pro zakódování celé zprávy. * Kódem celé zprávy je číslo z intervalu <0,1) * **Slovníkové metody**: Vytváří se slovník dříve přečtených řetězců výstupem jsou indexy do slovníku. * Jako slovník se používá jistá zpracovaná část zdrojového textu, vybíraná klouzajícím oknem, kódují se v něm obsažené řetězce proměnné délky. * Výstupem je trojice: * ukazatel počátku vzoru ve slovníku * délka vzoru * kódové slovo příštího symbolu za kódovým textem * Používá se samostatný dynamicky vytvářený slovník. * Výstupem je dvojice: * index vzoru ve slovníku * kódové slovo příštího symbolu za kódovým textem * Používá se samostatný dynamicky vytvářený slovník. * Potenciální elementy slovníku jsou v kódové knize přednastaveny. * Výstupem je jediný údaj -- index vzoru ve slovníku. ==== Organizace souborů dat ==== === Databáze === * **databáze** = kolekce vzájemně explicitně souvisejících dat * spravovaná **systémem řízení báze dat** * **pole/položka/atribut** základní prvek dat * s každým atributem souvisí **datový typ** určující obor možných **hodnot** a **operací** nad nimi. * **záznam** = strukturovaná kolekce polí * **soubor** = pojmenovaná kolekce příbuzných záznamů === Systém souborů === * **soubor** = pojmenovaná kolekce záznamů * přístup k souboru jako celku řeší **adresářová služba** systému souborů * přístup k datům souboru řeší **organizace souborů** * fyzický soubor * existuje ve vnější paměti * manipuluje s ním OS * zaznamenán v adresáři souborů * pojmenování vnějším jménem * logický soubor * souborová struktura z pohledu procesu * pojmenování jedinečným vnitřním jménem souboru * svázán s fyzickým souborem službou OS * **Systém souborů (File System)** = Sestava služeb pro manipulaci se soubory. * umožnit uživatelům/procesům manipulaci s daty na vnějších pamětech * zajišťovat validnost dat, eliminovat ztrátu dat * souběžná činnost více uživatelů/aplikací * podpora různých zařízení pomocí definovaného API == Statické x dynamické soubory == * návrh **statických** (neměnných souborů) je snadno dosažitelný * návrh **dynamický struktur** je obtížnější * dochází k doplňování, modifikaci a odstraňování záznamů * příklady: * B-strom * dynamický haš soubor * založený na rozšiřitelném hašování nebo lineárním hašování == Záznamy pevné x proměnné délky == * implicitní (fixní) délka záznamu * neuvádějí se oddělovače záznamů * variabilní délka záznamu se vyjadřuje: * explicitně (např. na začátku záznamu) * oddělovačem na konci záznamu * ukazatelem na záznam uloženým v jiném souboru (indexu) Položky: * fixní struktura * bez oddělovačů * variabilní * explicitně * oddělovačem Důvod volitelných délek: * obsah proměnné délky * seznam hodnot * volitelné položky Samostatně manipulovatelná/adresovatelná datová jednotka na vnější paměti. * neblokovaný záznam * blok obsahuje právě jeden logický záznam * blokovaný záznam * blok obsahuje celistvý počet logických záznamů * přerostlé záznamy * záznamy jsou zapisované do bloků nezávisle na hranice * **homogenní soubor** * hodnoty položek jsou primitivní typy * všechny záznamy jsou jednoho typu * je deklarovatelný formou S(A1:D1,...,An:Dn), kde Ax je jméno atributu a Dx je doména hodnot * **nehomogenní soubor** * hodnoty položek jeho záznamů nejsou primitivní typy nebo záznamy nejsou jednoho typu === Schéma organizace souborů === * **Logické schéma** * logická paměť se člení na logické stránky (sekvenční/hierarchické uspořádání) * logická paměť obsahuje primární soubory i sekundární (pomocné) soubory (indexy, rejstříky) * **Fyzické schéma** * Zobrazení logických stránek do fyzických stránek konkrétního použitého typu vnější paměti. * **Implementační schéma** * Zajišťuje alokaci fyzických stránek v použitém zařízení. {{:mgr-szz:in-pos:schema-souboru.png?300|}} ==Přístup k souborům== * sekvenční * aplikovatelné na pásce disku * přímý přístup * aplikovatelné na disku * určení místa pomocí indexu, nebo hašování ==Formy organizace souborů== * hromada * sekvenční soubor * indexovaný sekvenční soubor * indexovaný soubor * hašovaný soubor (soubor s přímým přístupem) ==Zamykání souborů== * **povinné**: zamčený soubor je nepřístupný * **poradní**: proces si může zjistit stav zámku a rozhodnout se ==Popis dat== * **implicitní**: aplikace/uživatel data zná * **metadata**: uvedená v hlavičce souboru * častá standardizace pro třídu aplikací ==Adresář== Kolekce dat obsahující informace o souborech uchovávaných na disku (jméno, typ, adresa, délka, maximální délka, čas posledního přístupu...) * Sám je souborem. **Struktury:** Jediný adresář v celém systému. * ➖ neřeší problém unikátnosti pojmenování souboru. * ➖ neřeší se problém seskupování souborů * ➕ Separace adresářů a uživatelů. (cesta user/soubor) * ➕ Uživatelé mohou stejně pojmenovat různé soubory. * ➕ efektivní hledání * ➖ neřeší se problém seskupování souborů * ➖ nelze sdílet * ➕ efektivní hledání hodnoty v uzlu * ➕ řeší nezávislé pojmenování i seskupování * **pracovní adresář** = dynamicky určovaný výchozí bod v adresáři * **absolutní** x **relativní** cesta * **aliasing** = jeden objekt má více různých jmen * **File System Mounting** = Připojení nového souborového systému do stávající adresářové struktury (bod přidání = **mount point**). == Řízení přístupu == * volitelné řízení přístupu (vlastní určuje KDO a CO kdo může) * UNIX rwx/ugo * Access control lists * Capability Tickets * povinné řízení (práva k souborům prosazována bezpečnostní politikou) ==== Indexování a hašování ==== * procházení přímo záznamů je při operacích velice pomalé -- indexy mají řádově menší velikost než samotné záznamy a jejich prohledávání je výrazně rychlejší * díky menší velikosti je možné indexy držet v operační paměti bez nutnosti přístupu na disk * často stačí pro vyřešení některých dotazů zpřístupnit pouze malou část záznamů -- na základě indexů je možné efektivně provádět filtrování * forma indexu: { vyhledávací klíč ; ukazatel na záznam } __typy indexů:__ * **řádné, lineární indexy**: * v tabulce uspořádané dvojice { vyhledávací klíč ; ukazatel na záznam } podle hodnoty vyhl. klíče * **hašované indexy** * využití hašovací funkce vyhledávacího klíče * **stromové indexy** * využití grafové struktury strom * **indexové bitové mapy** * pozice bitů v bitovém vektoru určují lokality záznamů * vhodné pro atributy s malým množstvím různých hodnot (uchováváme bitovou mapu pro každou hodnotu) Indexy mohou být víceúrovňové -- "index do indexu" -- nejnižší úroveň může být přímo primární soubor, výše jsou řídké indexy === Řádné indexy === Obvykle pokud se mluví o indexech, jsou myšleny řádné. **Primární x sekundární** * **primární index** * podle jeho klíče je uspořádán primární soubor se záznamy * může být hustý nebo řídký * sekundární index * určený pro dotazy založené na jiném vyhledávacím klíči než na primárním * musí být hustý **Hustý x řídký** * **hustý** * indexový záznam pro každou hodnotu vyhledávacího klíče. * Typicky bývá uspořádán podle hodnoty klíče {{:home:prog:husty.jpg?500|}} * **řídký** * indexový záznam pouze pro některé hodnoty vyhledávacího klíče * použitelné pouze v případě, kdy je soubor podle tohoto klíče uspořádán {{:home:prog:ridky.jpg?500|}} **Uložený soubor se záznamy:** ^ ID (2B) ^ Jméno (20B) ^ Rok narození (2B) ^ Místo narození (16B) ^ Telefon (4B) ^ Bydliště (16B) ^ | 1 | Bílá Alena | 1972 | Ostrava | xxxxxxxx | Brno | | 2 | Novák Jan | 1952 | Praha | 123456789| Kladno | | 3 | Novotný Tomáš | 1987 | Brno | 565656565| Vyškov | | 4 | Procházka Petr | 1964 | Brno | 100001011| Řestoky | **Hustý index pro atribut jméno:** ^ Jméno ^ ID ^ |Bílá Alena|1| |Novák Jan|2| |Novotný Tomáš|3| |Procházka Petr|4| Pokud chceme vyhledat místo narození Tomáše Novotného, pak je při sekvenčním prohledávání nutné načíst 2 · (2 B + 20 B + 2 B + 16 B + 4 B + 16 B) + 2 B + 20 B + 2 B + 16 B = 160 B. Při použití hustého indexu stačí načíst 3 · (20 B + 2 B) + 2 B + 20 B + 2 B + 16 B = 106 B. Pokud je index uložen v operační paměti, pak v obou případech stačí pouze jeden přístup na disk, avšak v prvním případě bude třeba číst výrazně více dat. **Řídký index pro atribut jméno:** ^ Jméno ^ ID ^ |Bílá Alena|1| |Novotný Tomáš|3| Pokud je požadavek na vyhledání například Jana Nováka, nalezne se poslední záznam v uspořádání před ním (Alena Bílá) a dál se postupuje sekvenčně. **Sekundární index pro atribut místo narození:** ^ Místo narození ^ ID ^ |Brno|3,4| |Ostrava|1| |Praha|2| === Hašování === **hašovací funkce (obecně)** = Funkce, která mapuje libovolně velký vstup na výstup fixní délky a není prostá. **hašovací funkce (ve smyslu organizace souborů)** = Funkce řešící přístup k záznamům souboru s konstantní složitostí. **kolize** = situace, kdy je pro více záznamů spočítána stejná adresa * při nalezení kolize umisťujeme nový prvek: * ve stejné paměti (**otevřené adresování**) * lineární, kvadratické adresování * řetězení kolizí * násobné hašování * v jiné paměťové oblasti (**closed addressing**) * umístění do **kapes** Požadované vlastnosti hašovací funkce: * je deterministická * je rychlá * vypočítává se z hodnot všech nebo alespoň většiny bitů klíče * pokrývá cílový prostor rovnoměrně * drobná změna ve vstupu vede k výrazné změně ve výstupu * prostá = //perfektní hašování// == Statické hašování == * používá se u souborů, které procházejí jen minimem změn * případné změny mohou negativně ovlivnit efektivitu hašování * pokud se sejde na stejné adrese více záznamů než je kapacita bucketu, vyhledávání v rámci těchto záznamů má lineární složitost == Dynamické hašování == * k výpočtu adresy se používá pouze prvních //i// bitů z výstupu hašovací funkce; toto //i// se dynamicky mění -- pokud je potřeba více adres, tak se zvyšuje, naopak při malém počtu se //i// zmenšuje * používá se u souborů s proměnným počtem záznamů * buckety jsou naplněné rovnoměrně -- pokud jsou plné, tak se štěpí, pokud jsou prázdné, tak se spojují {{:home:prog:rozhas.jpg|}} * hašovací funkce rozmisťuje záznamy do kapes (kapsa = záznamy s jistou podmnožinou klíčů, vymezuje je hašovací funkce) * jako index v adresáři kapes se používá dynamicky určovaný prefix výsledku hašovací funkce **//h//(//k//)** * délku indexu vymezuje globální hloubka adresy kapsy * štěpení * globální hloubka > lokální hloubka -- na blok ukazuje více ukazatelů, jednoduše se rozdělí na dva * globální hloubka = lokální hloubka -- musí vzniknout nová kapsa a také se zdvojnásobí rozměr adresáře kapes * řeší nedostatky rozšiřitelného hašování za cenu vyšší režie dané manipulací s **přetokovými kapsami** * počet kapes udržuje tak, aby byly naplněny z např. 80 % * rozdíl oproti rozšiřitelnému hašování: **nemusí se vytvářet ani udržovat adresář kapes**, přesto počet kapes roste **lineárně**. ==== Dotazy ==== === Vyhodnocení dotazu === Postup zpracování a optimalizace dotazu: - Převod dotazu na **syntaktický strom** pomocí parseru. - Převod na **logický plán** ve formě výrazů relační algebry. - Aplikací transformačních pravidel (viz níže) vznikne **vylepšený logický plán** - Odhad ceny provedení na základě různých statistik (počet záznamů, velikost záznamů, počet unikátních hodnot, ...). - **logický plán dotazu s velikostmi** - v PostgreSQL lze zobrazit příkazem EXPLAIN - Transformace na **fyzický plán** určující pořadí operací. - Výběr nejlevnějšího **fyzické plánu** (velikost výsledků, počet V/V operací). - Vyhodnocení vybraného **fyzického plánu**. === Transformační pravidla === = Transformační vztahy relační algebry zachovávající výsledek. Mohou ale zefektivnit samotné vyhodnocování. * Přirozené spojení + kartézský součin a sjednocení + průnik * Protože jsou všechny atributy zachovány, není pořadí důležité. * Selekce * Konjunkci podmínek lze nahradit dvěma následnými selekcemi, nebo průnikem dvou selekcí. * Disjunkci podmínek lze nahradit sjednocením dvou selekcí. * Relace jsou multimnožiny! * Kombinace selekce a přirozeného spojení * Pokud selekce závisí jen na atributech jednoho z členů, pořadí operací neovlivní výsledek. * Vhodné transformace * selekce co nejdříve; nejblíže relacím * projekce co nejdříve; nejblíže relacím * eliminace společných podvýrazů * eliminace duplicit === Statistiky a odhady === * odhad velikosti výsledku operace * počet záznamů * velikost záznamů * počet unikátních hodnot * Pro dobrý odhad jsou nutné aktuální hodnoty. => Aktualizace statistik ve vhodných intervalech (aktuálnost x zátěž). * odhad počtu V/V operací * cena všech operací (odhad ceny operace = počet čtení a zápisů z disku) * vstup se čte ze vstupu * výstup zůstává v operační paměti * operace CPU * komunikace po síti * Open: inicializace operace * příprava před vracením řádků výsledku * GetNext: vrácení dalšího řádku výsledku * Close: ukončení operace * uvolnění dočasné paměti * ➕ výsledek nemusí být vygenerován „naráz“ * ➕ výsledek nezabírá paměť * ➕ výsledek nemusí být ukládán * ➕ operace lze řetězit (pipelining) === Optimalizace dotazů a schématu === == Ladění dotazu == * Lokální změna = přepsání dotazu * První přístup ke zrychlení dotazu * Ovlivní pouze daný dotaz * Globální změna * Vytvoření indexu * Změna schématu * Rozdělení transakcí * Techniky přepsání dotazu * Rušení nadbytečných DISTINCT * (Korelované) poddotazy * Dočasné tabulky * Používání HAVING * Používání pohledů (VIEW) * Použití indexů * Uložené pohledy (materializedviews) * Vytvoření indexu * ➕ Zrychlí SELECT * ➖ Zpomalí INSERT, UPDATE, DELETE * Index se musí aktualizovat == Optimalizace schématu == * Funkční závislost (A -> B) * = Hodnoty atributu B zjistíme, pokud známe hodnoty atributů A * Normální formy * Normalizace = převod do BCNF (3NF) Všechny atributy jsou atomické. Všechny atributy závisí na celém klíči. Všechny atributy závisí přímo na klíči. * Není tranzitivní závislost. Pro všechny funkční závislosti A->B platí jedno z následujících: * A->B je triviální funkční závislost (B je podmnožinou A) * A je superklíčem schématu **super klíč** = množina atributů jednoznačně určující každý záznam **kandidátský klíč** = super klíč bez nadbytečných atributů **primární klíč** = právě jeden vybraný kandidátský klíč ==== Zabezpečení báze dat ==== === Přístupová práva === * Analogie se souborovým systémem, ale jemnější. * Specifická práva pro: * tabulky * pohledy * sekvence * schéma * databáze * procedury * Pohledy (views) * základní nástroj pro řízení přístupu * Subjektem jsou obvykle uživatelé a skupiny * Často nazýváno jako authorization id nebo role * Subjekt „ostatní“ je označován jako PUBLIC * Povolení přístupu pro PUBLIC znamená povolení přístupu komukoli. * Uložené procedury * kontext provádění: * vlastník * volající * "určený uživatel" ==== Transakce ==== Transakce je posloupnost operací (DML příkazů), které převedou datové schéma z jednoho konzistentního stavu do druhého (zpřístupňuje a aktualizuje data). Platí o ní, že je ACID: * //**A**tomic (atomičnost)// – transakce se celá provede nebo se celá zruší * //**C**onsistency (konzistence)// – po dokončení transakce je databáze konzistentní * //**I**solation (izolovanost)// – různé transakce o sobě vzájemně nevědí * //**D**urability (trvanlivost)// – po ukončení transakce jsou data trvale uložena Více transakcí může být spouštěno současně, může však dojít k uváznutí (deadlocku). Chronologické pořadí provádění instrukcí souběžných transakcí je předem určeno pomocí plánu. Každá transakce může nabývat těchto stavů: aktivní, částečně potvrzená, chybující, zrušená a potvrzená. Pokud byla transakce zrušena, je možné ji znovu spustit (nedošlo-li k logické chybě) nebo zamítnout. === Řízení souběžných transakcí === Plánovače * sériový plán: transakce jdou po sobě * serializovatelný plán: ekvivalentní sériovému * Plánovače: * **optimistické** (předpokládají málo konfliktů a nechávají věci plynout, při selhání transakce vracejí, ruší) * **pesimistické** (předpokládají hodně konfliktů, předchází jim silnou serializací) Souběžné zpracování (zajišťuje izolovanost) * zámky: * exkluzivní -- jen jedna transakce čte a píše, * sdílený (shared) -- více čtení, žádný write * (v ideálním případě se rovná idální serializaci) * zámky zpravuje správce zámků a transakce s mím mluví protokolem * Dvoufázový transakční protokol na bázi zamykání (růstová fáze - zamykání, couvací fáze - uvolňování po provedení transakce) * Grafový (stromový) protokol řízení souběhu transakcí (jednofázový, zná pořadí přístupu transakcí k datům) * oba pesimistické plánovače * správa zámků představuje netriviální režii. * Časová razítka -- jiné řešení transakce mají čas, kdy vznikly. Nejstarší jde nejdřív. Pesimistické plánování * Protokol řízení souběhu transakcí na bázi validace (optimistický plánovač). Na konci transakce se zvaliduje, zda došlo ke konfliktu, pokud ano, jedna transakce se abortuje. === Systémy obnovy transakcí po výpadku === * Klasifikace výpadků * výpadek transakce * logická chyba (např. data nenalezena) * systémová chyba (např. deadlock) * zhroucení systému * porucha disku Pro obnovu výpadku požadujeme, aby tranakce byly atomické, databáze konzistentní. Žurnálování (log, deník) * O prováděných tranakcích (a jejích operacích) si vedu záznam v žurnálu. * Při výpadku můžu použít žurnál k REDO, UNDO... * Místo žurnálování můžu použít redundanci (RAID) == Undo logging == * V případě výpadku se některé operace zruší (z nedokončených transakcí) * Pro každou akci vytvoř v žurnálu záznam obsahující starou hodnotu * Před změnou x na disku musí být na disku záznamy žurnálu týkající se x - Tzv. write ahead logging (WAL) * Před vytvořením záznamu v žurnálu musí být všechny zápisy transakce uloženy na disku. == Redo logging == * V případě výpadku se některé operace dokončí * Změny později provedené transakcí jsou ukládány Tj. při potvrzení (commit) -- Ušetření zápisů na disk * Při obnově jsou ignorovány nedokončené transakce * Vyžaduje uložení žurnálu před uložením změn v DB. == Check points == * pravidelné ukládání kontrolních stavů databáze pro případné pozdější obnovení * něco jako otisky DB , aby se při obnově nemusely dělat od začátku * také dálají redo, undo ==== Zdroje ==== * slidy PV062 (verze jaro 2015) * slidy PA150 (podzim 2016) * slidy pa152 (jaro 2019) * http://statnice.dqd.cz/home:prog:ap12 * http://statnice.dqd.cz/mgr-szz:in-bit:14-bit