1 Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Marosvásárhely ABR 2( Adatbázisrendszerek 2) 4.Előadás: Indexek A rendszeribák kezelése
2 Indexek CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option]... index_col_name: col_name [(length)] [ASC | DESC] index_type: USING {BTREE | HASH | RTREE} index_option: KEY_BLOCK_SIZE [=] value | index_type | WITH PARSER parser_name
3 Indexek A CREATE INDEX az ALTER TABLE-hez van leképezve. Elsődleges kulcsot nem lehet ezzel az utasítással képezni, ezért használjuk az ALTER TABLE utasítást. A valóságban a CREATE TABLE utasításkor készítünk indexeket. Egy oszlop lista a következő formában (col1,col2,...) elkészít egy többszörös oszlop indexet. Index értékek úgy keletkeznek, hogy összerakjuk az értékeit az adott oszlopoknak. Indexeket úgy is készíthetünk, hogy csak az elejét használjuk az oszlop értékeknek, használva a col_name(length) szintaxist, hogy megadjuk az index prefix hosszát: Prefixet meg lehet adni CHAR, VARCHAR, BINARY és VARBINARY oszlopokra. BLOB és TEXT tipusú oszlopokat is lehet indexelni, de meg kell adni a prefix hosszúságot.
4 Prefix hosszúságok karakterekben vannak megadva nem bináris sztring típusok esetében és bájtokban bináris sztring típusoknál. Térinformatikai oszlopoknál prefix értéket nem lehet megadni. A következő utasítás az első10 karakerét használja a name oszlopnak: CREATE INDEX part_of_name ON customer (name(10)); Ha a nevek az első 10 karaterben általában különböznek, ez az index nem sokkal lassúbb, mintha az egész névre készítettük volna, viszont, kevesebb helyet foglal el a lemezen, azonkívül felgyorsíthatja az INSERT utasításokat is.
5 A rendszerhibák kezelése 1.A helyreállító beavatkozások példái és modelljei 2.Semmisségi (undo) naplózás 3.Helyrehozó naplózás (redo logging) 4.A semmisségi/helyrehozó (undo/redo) naplózás 5.Az eszközök meghibásodása elleni védekezés
6 Bevezető Az adatokat meg kell védeni a rendszerhibáktól. Célunk a helyreállíthatóság, azaz az adatok integritásának (épségének és összefüggéseinek) megőrzése a rendszerhibák előfordulásakor. Ennek elsődleges technikája a naplózás (log), amely valamilyen biztonságos módszerrel rögzíti az adatbázisban végrehajtott módosítások történetét. Helyreállítás: a naplót felhasználva rekonstruáljuk az adatbázis hiba előtti állapotát. Az ellenőrzőpont technikája kisebb hosszúságú naplórész elemzését ereményezi. Archiválás: a teljes adatbázis elvesztését is túlélje.
7 A helyreállítható beavatozások példái és modelljei A hibák fajtái 1.Hibás adatbevitel ha elütik a telefonszámot helyett , a telefonszám akár a miénk is lehetne, viszont a az adat formailag nem felel meg. A formai hibák kiküszöbölése lehetséges az SQL szabványokban: -Meg lehet adni, hogy egy telefonszám 10 számjegyből állhasson. -Triggerek segítségével megadhatjuk olyan összefüggések ellenőrzését és/vagy kijavítását, amelyeket az adatbázis tervezője megad annak az érdekében, hogy minél több formai hibát ki lehessen küszöbölni.
8 Készülékhibák és katasztrófális hibák A lemezegységek olyan helyi hibái, melyek egy vagy néhány bit megváltozását okozzák, a lemez szektoraihoz rendelt paritás- ellenőrzéssel megbízhatón felismerhetők. A katasztrofális hibák ellen: 1.RAID módszerek használata. RAID (Redundant Array of Inexpensive Disks vagy Redundant Array of Independent Disks) napjaink egyik fontos technológiája. A RAID technológia alapja az adatok elosztása vagy replikálása több fizikailag független merevlemezen, egy logikai lemezt hozva létre. Minden RAID szint alapjában véve vagy az adatbiztonság növelését vagy az adatátviteli sebesség növelését szolgálja. 2.Archiválás (mentés) az adatbázisról másolatot készítünk más eszközre: szalag, CD, DVD, flash memória stb. A mentést rendszeresen ell végezni vagy teljes vagy növekményes (csak a változások archiválása) mentést használva. A mentett adathordozót az adatbázistól biztonságos távolságra kell tárolni. 3.Elosztott on-line másolatok (replication). Ezek konzisztenciáját biztosító mechanizmusok is tárgyalásra kerülnek.
9 Rendszerhibák A lekérdező- és adatbázist-módosító eljárásokat tranzakcióknak nevezzük. Ezek lépések sorozatát hajtják végre, módosíthatják az adatbázist. Minden tranzakciónak állapota van (lokális változók értékei, a kódban a végrehajtás pillanatnyi helye). A redszerhibák azon problémák amelyek a tranzakció állapotának elvesztését okozzák. 1.áramkimaradás 2.szofverhibák Tranzakciók lépései a RAM memóriában, ez volatilis, nem mint a merevlemez. Szoftverhiba felülírhatja a memória azon részét, amelyikben a tranzakció működött.
10 A tranzakció Az adatbázis-műveletek végrehajtási egysége. Minden lekérdezés vagy adatbázis-módosítás egy tranzakció. Beágyazott SQL-interface-t használva a programozó készíti el, akkor egy tranzakcióban több SQL lekérdezés szerepel. Tipikusan az adatbázis-akciók végrehajtásával kezdődik, és egy COMMIT vagy ROLLBACK (“abort”) paranccsal fejeződik be. Tranzakció végrehajtása: atomosan kell végrehajtani, mindent-vagy- semmit módon és időben egy egységként kell működnie. A tranzakciók korrekt végrehajtásának biztosítása a tranzakciókezelő feladata: 1.Jelzéseket ad át a naplókezelőnek úgy, hogy a szükséges információ “naplóbejegyzés” formában a naplóban tárolható legyen. 2.Biztosítja, hogy a párhúzamosan végrehajtott tranzakciók ne zavarhassák egymás működését (ütemezés).
11 Lekédezés feldolgozó Tranzakció- kezelő Napló kezelő Puffer kezelő Helyreállítás kezelő Adat Napló
12 A tranzakciók korrekt végrehajtása Az adatbázis “elemekből” áll. Ezeknek értékük van és ezen értékeket tranzakciókkal lehet elérni (kiolvasni) vagy módosítani. 1.Relációk vagy OO megfelelője: az osztály. 2.Lemezblokkok vagy –lapok. 3.A relációk sorai vagy OO megfelelője: objektumok. Az adatbázis összes elemeinek pillanatnyi értékét az adatbázis-állapotának nevezzük. A kozisztens állapotok kielégítik az adatbázissémára vonatkozó összes megszorításokat, mint a kulcsokra és az elemek értékeire vonatkozó előírásokat. Ezen túl, a konzisztens állapotnak ki kell elégítenie az implicit megszorításokat is (biztosítása triggerekkel).
13 Kliens(ID, nev, cim, telefon, bank, bankszamla) Számla(szamlaszam, datum, összeg, AFA, KliensID) Minden KliensID értéknek meg kell jelennie a Kliens táblában ID értékeként. Az AFA értéke csak 19% lehet aktuálisan, de, ha változik a törvénykezés, akkor pl. 19 és 9. értékek közül választható. A tranzakciókra vonatkozó alapvető feltételezések: A korrektség alapelve: Ha a tranzakciót minden más tranzakciótól függetlenül és rendszerhiba nélkül végrehajtjuk és ha indulásakor az adatbázis konzisztens állapotban volt, akkor a tranzakció befejezése után ismét konzisztens állapotban lesz.
14 A tranzakciók alaptevékenységei Tranzakció és adatbázis kölcsönhatásának színhelyei: 1.Az adatbázis elemeit tartalmazó lemezblokkok területe 2.A pufferkezelő által használt virtuális vagy valós memóriaterület 3.A tranzakció memóriaterülete. Ahhoz, hogy a tranzakció egy adatbáziselemet beolvasson, azt előbb memóriapuffer(ek)be kell behozni, ha még nincs ott. Ezt követően tudja a puffer(ek) tartalmát a tranzakció saját memóriaterületére beolvasni. Az adatbáziselem új értékének a kiírása fordított sorrendben történik. Az új értéket a tranzakció alakítja ki saját memóriaterületén, majd ez az új érték másolódik át a megfelelő puffer(ek)be. A pufferek tartalmát vagy azonnal lemezre lehet írni, vagy nem; a döntés a pufferkezelő joga.
15 Jelölések a naplózási algoritmusokhoz 1.INPUT(X): Az X adatbáziselemet tartalmazó lemezblokk másolása a memóriapufferbe. 2.READ(X, t): Az X adatbáziselem bemásolása a tranzakció t lokális változójába. Ha az X adatbáziselemet tartalmazó blokk nincs a memóriapufferben, akkor előbb végrehajtódik az INPUT(X). Ezután kapja meg a t lokális változó az X értékét. 3.WRITE(X, t): A t lokális változó tartalma az X adatbáziselem memóriapufferbeli tartalmába másolódik. Ha az X adatbáziselemet tartalmazó blokk nincs a memóriapufferben, akkor előbb végrehajtódik az INPUT(X) 4.OUTPUT(X): Az X adatbáziselemet tartalmazó puffer kimásolása a lemezre
16 Az adatbáziselem nem nagyobb egy blokknál Példa: az adatbázis két, A és B eleme tartalmának az adatbázis minden konzisztens állapotában meg kell egyeznie. A T tranzakció lépései:A:=A*2; B:=B*2; READ(A, t); t:=t*2; WRITE(A, t); READ(B, t); t:=t*2; WRITE(B, t);A=B=8
17 TevékenységtMem AMem BLemez ALemez B READ(A, t)8888 t:=t* WRITE(A,t)16 88 READ(B, t) t:=t* WRITE(B,t)16 88 OUTPUT(A)16 8 OUTPUT(B)16
18 A semmisségi (undo) naplózás A napló naplóbejegyzések (log records) sorozata, melyek mindegyike arról tartalmaz valami információt, hogy mit tett egy tranzakció. Rendszerhiba esetén a napló segítségével rekonstruálható, hogy a tranzakció mit tett a hiba fellépéséig. A napló az archívmentéssel együtt felhasználható abban az esetben is, amikor eszközhiba keletkezik a naplót NEM tároló lemezen. A katasztrófák hatásának kijavítását követően a tranzak- ciókat meg kell ismételni. Egyes esetekben az adatbázis visszaállítása szükséges, mintha a tranzakció nem is lett volna. A semmisségi (undo) naplózás csak az utóbbi típusú helyreállításra alkalmas.
19 Naplóbejegyzések A napló, mint fájl kizárólag bővítésre van megnyitva. Tranzakció végrehajtásakor a naplókezelő minden fontos eseményt a naplóban kell rögzítsen. A naplóblokkokat az elsődleges memóriában hozza létre a rendszer és a pufferkezelő az adatbázis többi blokkjaihoz hasonlóan kezeli őket. : Ez a bejegyzés jelzi a T tranzakció kezdetét. : A T tranzakció rendben befejeződött, az adatbázis elemein már semmi további módosítást nem kíván végrehajtani. Kikényszerítése a lemezre írásnak FLUSH : A T tranzakció nem tudott sikeresen befeje- ződni. Ha a T abortál, az általa tett változtatások ne legyenek a lemezen.
20 A semmisségi naplózás szabályai Szükségünk van még a módosítási bejegyzésre (update record), mely a hármas: T tranzakció módosította az X adatbáziselemet, melynek módosítás előtti értéke v volt. A tranzakciókhoz kötött előírások a semmisségi naplózásnál: U 1 : Ha a T tranzakció módosítja az X adatbáziselemet, akkor a típusú naplóbejegyzést azt megelőzően kell lemez-re írni, mielőtt X új értékét a lemezre írná a rendszer. U 2 : Ha a tranzakció hibamentesen befejeződött, akkor a COMMIT naplóbejegyzést csak azt követően szabad lemezre írni, hogy a tranzakció által módosított összes adatbáziselem már lemezre íródott, de ezután viszont a lehető leggyorsabban. a) az adatbáziselemek módosítására vonatk. naplóbejegyzések kiírása b) Maguknak a módosított adatbáziselemeknek a kiírása. c) A COMMIT naplóbejegyzés kiírása.
21 LépTevékenystM-AM-BD-AD-BNapló 1) 2)READ(A,t)8888 3)t:=t* )WRITE(A,t) )READ(B,t) )t:=t* )WRITE(B,t) )FLUSH LOG 9)OUTPUT(A) )OUTPUT(B)16 11) 12)FLUSH LOG
22 Helyreállítás a semmisségi naplózás használatával A tranzakciók felosztása sikeresen befejezett és nem befejezett tranzakciókra. Ha található naplóbejegyzés, akkor rendben. Ha találtunk bejegyzést, de nincs, akkor a T nem komplett tranzakció, hatását semmissé kell tenni, a T által módosíttt adatbáziselemek értékét vissza kell állítani korábbi érékeikre. Szerencsére az U 1 szabály garantálja, hogy az X érték módosítása előtt ki kellett írja a naplóba a rendszer az bejezést. Helyreállítás során v értéket vissza kell írni az X adatáziselembe. A helyreállítás-kezelő a naplót a végéről kezdi átvizsgálni.
23 A helyreállítás-kezelő megjegyzi T-ket, amire talál vagy bejezést. Visszafelé haladva talál egy bejegyzést: 1.Ha ugyanerre a T tranzakcióra vonatkozó COMMIT bejegyzés már volt, akkor semmi teendő nincs 2.Minden más esetben T nem teljes vagy abortált tranzakció. A h-kezelő X értékét v-re kell állítsa. Miután a h-kezelő végrehajtotta a fenti változtatásokat, miden, korábban abortált, nem teljes T tranzakcióra vonatkozó naplóbejegy- zést ír a naplóba és kiváltja annak naplófájlba való kiírását is (FLUSH LOG). Ezután az adatbázis normális használata folytatódhat, új tranzakciók végehajtása kezdődhet.
24 LépTevékenystM-AM-BD-AD-BNapló 1) 2)READ(A,t)8888 3)t:=t* )WRITE(A,t) )READ(B,t) )t:=t* )WRITE(B,t) )FLUSH LOG 9)OUTPUT(A) )OUTPUT(B)16 11)?? 12)FLUSH LOG
után a hiba: a T tranzakció rendben van - 11 és 12 között, ha van T tranzakció rendben, 11 és 12 között, ha nincs WRITE(B,8) WRITE(A8) (FLUSH LOG) - ha 10 és 11 között, T befejezetlen, hatása semmivé tétele az előző pont szerint -8 és 10 között az előzőhöz hasonlóan T hatását semmissé kell tenni. Különbség az, hogy az A és/B módosítása még nem jelent meg a lemezen. Ettől függetlenül mindkét adatbáziselem korábbi értékét, 8- at állítja vissza a rendszer. -amennyiben a hiba a 8) lépésnél korábban jelentkezik, az se biztos, hogy a T-re vonatkozó naplóbejegyzések közül bármi is a lemezre került. Ha a naplóban nincs bejegyzés a módosításra vonatkozóan, nincs mit visszaállítani.
26 Az ellenőrzőpont-képzés Elvben a teljes napló átvizsgálása. Mivel egyszerre több tranzakció működik egyszerre, a előtti naplóbejegyzéseket nem törölhetjük, mivel egy részük vonatkozhat egy másik tranzakcióra, amelyik még aktív. Az egyszerű ellenőrzőpont képzése: 1.Új tranzakcióindítási kérések kiszolgálásának leállítása 2.A még aktív tranzakciók helyes ás teljes befejezésének vagy abortálásának és a COMMIT vagy ABORT bejegyzés naplóba írásának kivárása. 3.A napló lemezre kiírása (FLUSH). 4.A naplóbejegyzés képzése, naplóba írása és FLUSH 5.Tranzakcióindítási kérések kiszolgálása
27 Az ellenőrzőpont kiírását megelőzően végrehajtott tranzakciók mind befejeződtek. A helyreállítás során a naplót a végéről visszafelé csak a bejegyzésig kell elemezni. Amikor a bejegyzést megtaláljuk, tudjuk, hogy már láttuk az összes befejezetlen tanzakciót. Nem szükséges a bejegyzésnél korábbi naplórészt elemeznünk. Töröletjük, vagy felülírhatjuk, ha a napló túl sok helyet foglal a lemezen.
28 Ellenőrzőpont-képzés a rendszer működése közben Hátrányos az egyszerű, mert a CKPT képzése időigényes. Működés közbeni módszer lépései: 1. naplóbejegyzés készítése és a naplóbejegyzés lemezre írása (FLUSH), T i aktív tranzakciók 2.Meg kell várni a T 1,…T k tranzaciók normális vagy abnormális befejezését, nem tiltva újabb tranzakciók indítását. 3.Ha T 1,…T k tranzakciók mindegyike befejeződött, akkor naplóbejegyzés elkészítése és a naplóbe- jegyzés lemezre írása (FLUSH)
29 Visszaállítás menetközbeni ellenőrző pontnál Ha naplóbejegyzéssel találkozunk, az összes, még be nem fejezett tranzakciókra vonatkozó naplóbejegyzést a legközelebbi bejegyzésig megtaláljuk. Ennél megállhatunk, a korábbit eldobhatjuk. Ha a bejegyzéssel találkozunk előbb, a katasztrófa az ellenőrzőpont-képzés közben fordult elő. A T 1,…T k tranzakciók nem fejeződtek be. Ekkor a be nem fejeződött tranzakciók közül a legkorábban kezdődött tranzakció indulásáig kell a naplóban visszakeresni.
30
31 Bibliográfia Garcia-Molina H.-Ullman J.D.-Widom J. Adatbázisrendszerek megvalósítása, Panem-John Wiley & Sons pp