Tietokantarakenteet ja -algoritmit 3. harjoitus Malliratkaisut 1. Analyysivaiheen alussa alustetaan aktiivisten transaktioiden taulu (tyhjä) ja päivitettyjen sivujen taulu (samoin tyhjä) tarkistuspisteestä. Lokin eteenpäin selauksessa saadaan transaktiotaulun sisällöksi {(T 1, forward-rolling, LastLSN = 109), (T 2, backward-rolling, UndoNextLSN = 108)} ja päivitettyjen sivujen taulun sisällöksi {(p,reclsn = 107)}, mistä saadaan RedoLSN = 107. Merkitään: wl(p) = fix(p) & write-latch(p); ul(p) = unlatch(p) & unfix(p). Toistovaiheessa selataan lokia kirjauksesta RedoLSN = 107 eteenpäin. Päivityskirjausten kohdalla tehdään seuraavaa: 107: Koska 107 RecLSN(p), wl(p) ja tutkitaan PageLSN(p):tä. Koska PageLSN(p) = 108 107, operaation I[x,u] tulos on sivulla. ul(p). RecLSN(p) = 108 + 1 = 109. 108: Koska 108 < RecLSN(p), sivua p ei naulita eikä salvata. 109: Koska 109 RecLSN(p), wl(p) ja tutkitaan PageLSN(p):tä. Koska PageLSN(p) = 108 < 109, operaation I[y,v] tulosta ei ole sivulla. Lisätään monikko (y,v) sivulle p paikkaan j. PageLSN(p):ä 109. ul(p). 110: Koska 110 RecLSN(p), wl(p) ja tutkitaan PageLSN(p):tä. 1
Koska PageLSN(p) == 109 < 110, operaation W[z,w,w ] tulosta ei ole sivulla. Muutetaan sivulla p paikassa k oleva monikko (z,w) monikoksi (z,w ). PageLSN(p) = 110. ul(p). 112: Koska 112 RecLSN(p), wl(p) ja tutkitaan PageLSN(p):tä. Koska PageLSN(p) = 110 < 112, operaation W 1 [z, w, w ] tulosta ei ole sivulla. Palautetaan sivulla p paikassa k oleva monikko (z,w ) monikoksi (z,w). PageLSN(p) = 112. ul(p). Peruutusvaiheessa asetetaan transaktiotaulussa T1:n tilaksi backward-rolling ja UndoNextLSN:ä LastLSN = 109 ja kirjataan lokiin 113: < T 1, A > Transaktiotaulun UndoNextLSN:ien maksimi on max{109, 108} = 109. Ensimmäiseksi peruutetaan siis LSN:llä 109 kirjattu operaatio. wl(p). Poistetaan paikassa (p,j) oleva monikko (y,v). Kirjataan lokiin 114: < T 1, I 1, p, j, 107 > PageLSN(p) = 114. UndoNextLSN(T1) = 107. ul(p). Transaktiotaulun UndoNextLSN:ien maksimi on max{107, 108} = 108. Peruutetaan siis LSN:llä 108 kirjattu operaatio. wl(p). Poistetaan paikassa (p,k) oleva monikko (z,w). Kirjataan lokiin 115: < T 2, I 1, p, k, 106 > PageLSN(p) = 115. UndoNextLSN(T2) = 106. ul(p). Transaktiotaulun UndoNextLSN:ien maksimi on max{107, 106} = 107. wl(p). Poistetaan paikassa (p,i) oleva monikko (x,u). Kirjataan lokiin 116: < T 1, I 1, p, i, 105 > 2
PageLSN(p) = 116. UndoNextLSN(T1) = 105. ul(p). Transaktiotaulun UndoNextLSN:ien maksimi on max{105, 106} = 106. LSN:llä 106 varustettu kirjaus on T2:n aloituskirjaus. Poistetaan T2 transaktiotaulusta, kirjataan lokiin 117: < T 2, C > ja viedään loki levylle. Transaktiotaulun ainoa UndoNextLSN on 105. LSN:llä 105 varustettu kirjaus on T1:n aloituskirjaus. Poistetaan T1 transaktiotaulusta, kirjataan lokiin 118: < T 1, C > ja viedään loki levylle. Koska transaktiotaulu on tyhjä, peruutusvaihe on päättynyt. Lopuksi otetaan tarkistuspiste: 119: <begin-checkpoint> 120: <transaction-table, {}> 121: <page-table, {(p,reclsn = 109)}> 122: <end-checkpoint> 3
2. a) Sivu p on voitu viedä levylle (ja siis poistaa päivitettyjen sivujen taulusta) viimeisen tarkistuspisteen ottamisen jälkeen, ennen häiriötä. Rekonstruoidussa taulussa voi olla sivuja, jotka eivät taulussa enää olleet häiriötilanteessa, ja jonkin sivun RecLSN voi olla rekonstruoidussa taulussa häiriötilanteessa vallinnutta arvoa pienempi. b) Edellä tehtävässä 1 esiintyy juuri sellainen tilanne. 4
3. Toistovaihe saattaa tietokannan siihen tilaan, jossa se oli häiriöhetkellä. Näin ollen erikoisesti ne sivut, joilla oli (puskurissa) aktiivisten transaktioiden päivityksiä häiriötilanteessa, ovat toistovaiheen tuloksena puskurissa ja nämä puskurisivut täsmälleen ajan tasalla, so. sisältävät kaikki niille häiriötilanteeseen mennessä tehdyt ja lokin levyllä olevaan osaan ehtineet päivitykset. Siis peruutettavien päivitysten olemassaoloa ei tarvitse tutkia. 5
4. Fyysinen toisto onnistuu, koska toistovaiheessa operaatiot toistetaan yhdellä lokin eteenpäinselauksella täsmälleen samassa järjestyksessä kuin ne on alkujaan suoritettu. Lopputuloksena ovat fyysisestikin täsmälleen samansisältöiset sivut puskurissa (joskaan eivät välttämättä juuri entisissä puskurikehyksissä). Jos peruutusvaihe edeltää toistovaihetta, ei fyysinen toisto enää aina ole mahdollista. Oletetaan, että häiriön sattuessa lokin sisältönä on: 100: < T 1, B > 101: < T 1, D, p, i, x, u, 100 > 102: < T 2, B > 103: < T 2, I, p, j, y, v, 102 > 104: < T 2, C > Oletetaan, että tässä sivu p on täynnä T2:n lisäysoperaation jälkeen. T2 on siis kuluttanut T1:n poisto-operaation vapauttaman tilan sivulla p. Oletetaan vielä, että T1:n operaation tulos on ehtinyt levylle asti, mutta T2:n ei, ts. PageLSN(p) = 101 sivun p levyversiossa. Häiriöstä elvytyksessä peruutetaan ensin T1. Tämä onnistuu tällä kertaa fyysisesti: 105: < T 1, A > 106: < T 1, D 1, p, i, x, u, 100 > 107: < T 1, C > Sitten yritetään toistaa T2. Tämä ei onnistu enää sivulle p, joka on nyt täynnä tietueita. Täytyy varata uusi tyhjä sivu q ja suorittaa toisto sinne. Nyt täytyy lokiin tehdä kirjaus myös toisto-operaatiosta: 108: < T 2, I, q, k, y, v, 102 > 6
ja täytyy toistaa myös sitoutumiskirjaus: 109: < T 2, C > Tämä näyttää jo epäilyttävältä ei varmaan saada toimimaan kunnolla! 7
5. Kaikissa tapauksissa elvytys aloitetaan uudelleen alusta. a) Analyysivaiheessa ainoastaan luetaan lokia ja alustetaan keskusmuistitietorakenteita (aktiivisten transaktioiden taulu ja päivitettyjen sivujen taulu). Uuden häiriön sattuessa nämä analyysitiedot menetetään, joten pitää aloittaa alusta. b) Toistovaiheessa saatetaan tietokanta (puskurissa) siihen tilaan, jossa se oli häiriöhetkellä. Sivuja tuodaan levyltä ja edistetään niiden tilaa niillä päivityksillä, jotka eivät olleet ehtineet levylle asti. Vaiheen aikana puskurinhallitsin voi viedä näitä sivuja levyllekin. Uuden häiriön sattuessa samat sivut haetaan uudestaan puskuriin. Erona edelliskertaan voi olla, ettei jotain toistettavaa päivitystä tarvitsekaan toistaa puskurissa, koska sivun p levyversion PageLSN oli edistynyt. c) Peruutusvaiheessa kirjataan operaatioiden peruutuksista lokitietueita. Kun uuden häiriön satuttua on suoritettu analyysija toistovaihe, on peruuntuvien transaktioiden peruutuskirjauksia vastaavat käänteisoperaatiotkin toistettu, joten peruutusvaiheessa jatketaan vanhojen peruuntuvien transaktioiden peruutusta siitä, mihin viime kerralla jäätiin ja keskeytetään ja peruutetaan uuden häiriön sattuessa etenemisvaiheessaan olleet transaktiot. Peruutus ei siis koskaan peruunnu, vaan edistyy (mikä seikka sisältyy jo transaktiomalliimmekin). 8
6. Olkoon TT viimeisessä valmiiksi ehtineessä tarkistuspisteessä CP vedostettu aktiivisten transaktioiden taulu ja PT päivitettyjen sivujen taulu. Määrätään seuraavat LSNt: n 1 = min{t:n aloituskirjauksen LSN T on TT:n transaktio}. n 2 = min{reclsn(p) p on PT:n sivu}. n 3 = tarkistuspisteen CP begin-checkpoint-tietueen LSN. Lokista voidaan silloin hävittää kaikki tietueet, joiden LSN on pienempi kuin n = min{n 1, n 2, n 3 }. Itse asiassa n:ää voidaan tarkentaa analyysivaiheessa. 9