Transaktioiden peruutus ja tietokannan elvytys häiriöstä

Samankaltaiset tiedostot
Tietokantarakenteet ja -algoritmit 3. harjoitus

Lokin ylläpito ja puskurinhallinta

Elvytys. R & G Chapter Tietokannan hallinta, kevät 2006, J. Li 1

Sivupalvelin- ja yhteislevyjärjestelmät

Transaktiopalvelimen rakenne, s. 43. Levyjaksot, sivut ja tiedostot, s. 46. Tietokantasivujen puskurointi, s. 53. Tietokannan tila, s. 57.

Tietokantarakenteet ja -algoritmit 6. harjoitus

T Transaktionhallinta tietokantajärjestelmissä

Looginen tietokanta ja transaktiot

Tietokantarakenteet ja -algoritmit Harjoitukset 1-12

Hajautettujen transaktioiden hallinta

Helsingin yliopisto/tktl Tietokannan hallinta, kevät Harri Laine 1 D B. Transaktionhallinta. Transaktionhallinta. Transaktionhallinta

Muita transaktioiden hallintamenetelmiä

R 2 [0] ei ole likainen luku, sillä avaimelle 0 on jo palautettu sen alkuperäinen arvo.

Lisätään avainarvo 6, joka mahtuu lehtitasolle:

D B. Transaktionhallinta

HELIA 1 (14) Outi Virkki Tiedonhallinta

[c] What is the difference between a modified page and a dirty page? Mitä eroa on päivitetyllä sivulla ja likaisella sivulla?

HAAGA-HELIA Heti-09 1 (14) ICT05: Tiedonhallinta ja Tietokannnat O.Virkki Transaktionkäsittely

5. Tapahtumien hallinta. Esim. pankkitilisovelluksen proseduuri tilisiirto(t1, t2, x), joka siirtää x mk tililtä t1 tilille t2:

Transaktioiden samanaikaisuuden hallinta

Lisätään avainarvo 1, joka mahtuu lehtitasolle:

Transaktioiden eristyvyys

Algoritmit 2. Luento 5 Ti Timo Männikkö

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

Algoritmit 2. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

D B. Tiedostojen käsittely

Algoritmit 1. Luento 5 Ti Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

IIO30220 Database Management / Tietokannan hallinta TAPAHTUMIEN HALLINTA JOUNI HUOTARI ( )

Algoritmi on periaatteellisella tasolla seuraava:

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Seminaari: Keskusmuistitietokannat. Keskusmuistitietokantojen samanaikaisuuden hallinta Ilkka Pullinen

Algoritmit 2. Luento 7 Ti Timo Männikkö

Tietokanta (database)

Helsingin yliopisto/tktl DO Tietokantojen perusteet, s 2000 Johdanto & yleistä Harri Laine 1. Tietokanta. Tiedosto

HELIA 1 (16) Outi Virkki Tietokantasuunnittelu

HELIA TIKO-05 SQL-TRANSAKTIOT 1 ( 12) ICT03D Tieto ja tiedon varastointi

Tietohakemisto ja Transaktionkäsittely

jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja

Algoritmit 2. Luento 12 To Timo Männikkö

Tietokannan eheysrajoitteet ja niiden määrittäminen SQL-kielellä

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

Samanaikaisuuden hallinta. Optiot transaktionaalisissa työnkuluissa

Algoritmit 2. Luento 10 To Timo Männikkö

Algoritmit 1. Luento 4 Ke Timo Männikkö

12. Javan toistorakenteet 12.1

4.3. Matemaattinen induktio

Tietokannan hallinta. Kevät 2004 Jan Lindström R&G Chapter 1

4 Tehokkuus ja algoritmien suunnittelu

11. Javan toistorakenteet 11.1

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

OPI-Maksut - Käyttötapaukset

12. Javan toistorakenteet 12.1

Algoritmit 2. Luento 9 Ti Timo Männikkö

Algoritmit 2. Luento 2 Ke Timo Männikkö

Tiedostorakenteet. R&G Chapter Tietokannan hallinta, kevät 2006, Jan 1

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

D B. Tietokannan hallinta - kurssin tavoite. Kurssilla opitaan periaatteet. Edellytyksenä osallistumiselle on Tietokantojen perusteiden hallinta

Algoritmit 2. Luento 2 To Timo Männikkö

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

T Testitapaukset TC-1

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

Algoritmit 2. Luento 6 Ke Timo Männikkö

D B. Tietokannan hallinta kertaus

Algoritmit 1. Luento 13 Ti Timo Männikkö

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

10. Painotetut graafit

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

Luku 8. Aluekyselyt. 8.1 Summataulukko

Algoritmit 1. Luento 3 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.

vaihtoehtoja TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 13. lokakuuta 2016 TIETOTEKNIIKAN LAITOS

HELIA 1 (15) Outi Virkki Tiedonhallinta

Tietorakenteet, laskuharjoitus 7, ratkaisuja

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

Transaktiot - kertausta

Algoritmit 2. Luento 10 To Timo Männikkö

jäsentäminen TIEA241 Automaatit ja kieliopit, syksy 2015 Antti-Juhani Kaijanaho 26. marraskuuta 2015 TIETOTEKNIIKAN LAITOS

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

Pinoautomaatit. TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 6. kesäkuuta 2013 TIETOTEKNIIKAN LAITOS. Pinoautomaatit.

HELIA 1 (14) Outi Virkki Tiedonhallinta

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

CS-A1150 Tietokannat CS-A1150 Tietokannat / 43

Algoritmit 2. Luento 14 Ke Timo Männikkö

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Transkriptio:

Transaktioiden peruutus ja tietokannan elvytys häiriöstä C. Mohan, D. Haderle, B. Lindsay, H. Pirahesh & P. Schwartz: ARIES: a transaction recovery method supporting fine-granularity locking and partial rollbacks using write-ahead logging. ACM Transactions on Database Systems 17:1 (1992), 94 162; kohdat 3 (overview of ARIES), 5.2 (total or partial rollbacks), 5.3 (transaction termination), 5.4 (checkpoints), 6 (restart processing) ja 9 (nested top actions). A. Silberschatz, H. F. Korth & S. Sudarshan: Database System Concepts. Fifth Edition. McGraw-Hill, 2006; sivut 683 684, luvun 17 (recovery system) kohta 17.1 (failure classification); sivut 703 711, kohdat 17.8.2 (transaction rollback), 17.8.3 (checkpoints), 17.8.4 (restart recovery), 17.8.5 (fuzzy checkpointing) ja kohdan 17.8.6 (ARIES) alakohdat 17.8.6.2 (recovery algorithm) ja 17.8.6.3 (other features). 121

Transaktion keskeytys ja peruutus, s. 123. Käänteisoperaatioiden suoritus, s. 126. Transaktion osittaisperuutus, s. 130. Järjestelmähäiriöt, s. 132. Päivitettyjen sivujen taulu, s. 134. Tarkistuspisteet, s. 136. Sumea tarkistuspiste, s. 140. ARIES-elvytysalgoritmi, s. 143. Elvytyksen analyysivaihe, s. 144. Elvytyksen toistovaihe, s. 151. Elvytyksen peruutusvaihe, s. 160. Rakennemuutosten käsittely, s. 171. 122

Transaktion keskeytys ja peruutus Normaalin transaktionkäsittelyn aikana yksittäinen transaktio voi keskeytyä (1) transaktiota tuottavan palvelinprosessin säikeen kaaduttua tai (2) sovellusprosessin pyydettyä itse transaktion keskeytystä SQLlauseella rollback tai (3) kun järjestelmä joutuu keskeyttämään transaktion lukkiumatilanteessa tai kun sovellusprosessi (tai yhteys siihen) näyttää kaatuneen. Tapauksissa (1) ja (3) järjestelmän prosessien valvontaprosessi suorittaa transaktion peruutuksen vaatimat toimenpiteet tai käynnistää uuden säikeen transaktion peruutusvaiheen suorittamista varten. Tapauksessa (2) peruutuksen vaatimat toimenpiteet sisältyvät rollbacklauseen suoritukseen transaktiota tuottavassa palvelinprosessin säikeessä. Kaikissa tapauksissa transaktion peruutus voidaan toteuttaa lokin sekä transaktionhallinnan ylläpitämien keskusmuistitietorakenteiden (aktiivisten transaktioiden taulun) avulla. 123

SQL:n rollback-lauseen suoritus etenevässä transaktiossa T : Rollback(T ) { abort(t ); r := get-log-record(undo-next-lsn(t )); while (r n : T,B ) { if (r = n : T,I, p,i,x,v,n ) undo-insert(n,t, p,i,x,n ) else if (r = n : T,D, p,i,x,v,n ) undo-delete(n,t, p,x,v,n ) else if (r = n : T,S[P],n ) Undo-Next-LSN(T ) := n ; r := get-log-record(undo-next-lsn(t )); } commit(t ). }. 124

Transaktion T keskeytysoperaation A toteutus: Abort(T ) { state(t ) := backward-rolling ; log(n, T,A ); }. Kutsu get-log-record(n) palauttaa LSN-arvolla n varustetun lokikirjauksen. Kutsu undo-insert(n,t, p,i,x,n ) suorittaa operaation I 1 [x,v]. Kutsu undo-delete(n,t, p,x,v,n ) suorittaa operaation D 1 [x,v]. Kutsut undo-insert ja undo-delete asettavat transaktiotaulussa Undo- Next-LSN(T ):n arvoksi n :n. 125

Käänteisoperaatioiden suoritus Peruuntuvan tai osittaisperuutusta suorittavan transaktion T käänteisoperaatiot suoritetaan käyttäen argumentteina T :n vastaavien etenemisoperaatioiden lokikirjauksia. Operaation o[ x] käänteisoperaation o 1 [ x] suoritusta yritetään ensin fyysisesti, so. suoraan sille sivulle, jolle o aikoinaan suoritettiin. Tämän sivun tunniste löytyy o:n lokikirjauksesta. Mikäli fyysinen peruutus ei ole mahdollista, turvaudutaan loogiseen peruutukseen: käänteisoperaation suorituksen aluksi tietokantarakenteesta etsitään operaation kohteen nykyinen sijaintisivu. 126

Käänteisoperaation I 1 [x,v] suorituksessa monikon (x,v) nykyinen sijaintisivu q haetaan esiin ja kirjoitussalvataan kutsulla find-page-for-delete(q, x), joka myös suorittaa tarpeelliset rakennemuutokset sen varmistamiseksi, ettei sivu jää monikon poistosta liian vajaaksi. Käänteisoperaation D 1 [x,v] suorituksessa avaimen x peittävä tietosivusivu q haetaan esiin ja kirjoitussalvataan kutsulla find-page-for-insert(q, x, v), joka myös suorittaa tarpeelliset rakennemuutokset sen varmistamiseksi, että sivulla on tilaa monikolle. 127

Transaktion T tietosivulle p tietuepaikkaan i suorittaman etenemisoperaation I[x,v] käänteisoperaation I 1 [x,v] suoritus, kun operaation I[x,v] lokikirjauksen LSN = n ja Undo-Next-LSN = n : Undo-insert(n,T, p,i,x,n ) { wl(p); if (Page-LSN(p) n ja lisäksi joko p ei ole tietosivu tai p ei sisällä monikkoa (x,v) tai alivuotaisi sen poistosta) { ul(p); find-page-for-delete(q, x); p := q; } poista monikko (x,v) sivulta p sen sijaintipaikasta j; log(m, T,I 1, p, j,n ); Page-LSN(p) := m; ul(p); Undo-Next-LSN(T ) := n ; }. 128

Transaktion T tietosivulle p suorittaman etenemisoperaation D[x,v] käänteisoperaation D 1 [x,v] suoritus, kun operaation D[x,v] lokikirjauksen LSN = n ja Undo-Next-LSN = n : Undo-delete(n,T, p,x,v,n ) { wl(p); if (Page-LSN(p) n ja lisäksi joko p ei ole tietosivu tai p ei peitä avainta x tai siinä ei ole tilaa monikolle (x,v)) { ul(p); find-page-for-insert(q, x, v); p := q; } lisää monikko (x,v) sivulle p vapaaseen tietuepaikkaan j; log(m, T,D 1, p, j,x,v,n ); Page-LSN(p) := m; ul(p); Undo-Next-LSN(T ) := n ; }. 129

Transaktion osittaisperuutus Peruutuspisteen P asetus transaktiossa T (operaation S[P] toteutus): Set-savepoint(T,P) { log(n, T,S[P],n ), missä n = Undo-Next-LSN(T ); Undo-Next-LSN(T ) := n; }. Osittaisperuutuksen aloitus transaktiossa T (operaation A[P] toteutus): Abort-to-savepoint(T, P): log(n, T, A[P] ). }. Osittaisperuutuksen päättäminen: Complete-rollback-to-savepoint(T,P) { log(n, T,C[P] ); }. 130

SQL-lauseen rollback to savepoint P toteutus transaktiossa T : Rollback-to-savepoint(T,P) { abort-to-savepoint(t, P); r := get-log-record(undo-next-lsn(t )); while (r n : T,S[P],n ) { if (r = n : T,I, p,i,x,v,n ) undo-insert(n,t, p,i,x,n ) else if (r = n : T,D, p,i,x,v,n ) undo-delete(n,t, p,x,v,n ) else if (r = n : T,S[P ],n jollakin P P) Undo-Next-LSN(T ) := n ; r := get-log-record(undo-next-lsn(t )); } complete-rollback-to-savepoint(t, P); }. 131

Järjestelmähäiriöt Tietokantapalvelin voi romahtaa (crash) laitteiston tai virtalähteen toimintahäiriöstä tai tietokannan hallintajärjestelmässä tai käyttöjärjestelmässä esiintyvästä ohjelmistovirheestä. Järjestelmän romahtamiseen johtaville häiriöille on yhteistä, että keskusmuistin sisältö katoaa: palvelinprosessit ja järjestelmäprosessit kaatuvat ja tietokantapuskurin sisältö samoin kuin tietokannan hallinnassa tarvittavien keskusmuistirakenteiden sisältö menetetään. Järjestelmän romahtaminen ei kuitenkaan vikaannuta pysyvän muistin (levymuistin) sisältöä. 132

Järjestelmän romahtaminen voidaan hoitaa lokiperustaisella elvytyksellä: 1. Tietokannan levyversiosta ja levylle ehtineistä lokikirjauksista palautetaan tietokannan tila sellaiseksi kuin se oli silloin, kun lokin viimeinen levylle ehtinyt kirjaus tehtiin. 2. Häiriötilanteessa aktiivisena olleet etenevät transaktiot keskeytetään ja peruutetaan ja peruuntuvien transaktioiden peruutus saatetaan päätökseen. Seuraavassa tarkastelemme lokiperustaista elvytystä järjestelmän romahtamisesta. Oletamme, ettei levyhäiriöitä esiinny. Tämän mukaisesti oletamme jokaisen tietokantasivun säilyvän fyysisesti eheänä levylle viennissä. 133

Päivitettyjen sivujen taulu Puskurinhallitsimen ylläpitämissä keskusmuistitietorakenteissa on tieto siitä, mitkä sivut ovat puskurissa, mille prosesseille ne naulittu ja salvattu ja mitä sivuja on päivitetty. Kustakin kirjoitussalvattavasta sivusta p talletetaan päivitettyjen sivujen tauluun (modified-page table, dirty-page table) eli lyhyesti sivutauluun (page table) seuraavat tiedot: (1) sivun p tunniste sekä (2) arvo Rec-LSN (recovery LSN), joka ilmoittaa sen kohdan lokista, josta lähtien voi olla sivulle p kirjattuja päivityksiä, jotka eivät mahdollisesti vielä ole sivun p levyversiossa. Kun puskuroitua sivua p ensi kerran päivitetään sitten levyltä tuonnin (so. kun p:n puskurinohjauslohkon päivitysbitti ensi kerran asetetaan), niin asetetaan sivutaulussa p:n Rec-LSN:ksi kyseisen päivityksen lokikirjauksen LSN. 134

Levyltä puskuriin tuodulle ja ensi kertaa kirjoitussalvattavalle sivulle p perustetaan tietue (p,rec-lsn = n), missä n on lokin loppu eli seuraavaksi tuotettavan lokikirjauksen LSN. Kun sivu p on viety puskurista levylle, poistetaan p:n tiedot sivutaulusta. Sivutaulu toteutetaan tehokkaana keskusmuistitietorakenteena (hajautus sivun tunnisteella). 135

Tarkistuspisteet Älä pakota -käytäntöä sovellettaessa voi puskuriin kertyä paljon sivuja, joita ei niiden korkean käyttöasteen takia koskaan viedä levylle ja joihin kertyy monien sitoutuneiden transaktioiden päivityksiä. Näiden sivujen levyversiot saattavat siten pahasti vanhentua: levyversion Page-LSN on paljon pienempi kuin sivuun liittyvän tuoreimman lokikirjauksen LSN (= sivun puskuriversion Page-LSN). Päivitettyjen sivujen taulun sivujen Rec-LSN-arvot jäätyvät osoittamaan varhaisia kohtia lokissa. Niiden myötä jäätyy myös häiriöstä elvytyksen toistovaiheen aloituskohdan osoittava LSN-arvo Redo-LSN, joka on Rec-LSN-arvojen minimi (tai sitä aikaisempi). Toisto-operaatioihin kuluu silloin paljon aikaa. Elvytysprosessia voidaan nopeuttaa ottamalla silloin tällöin (tyypillisesti 5 10 minuutin välein) tarkistuspiste (checkpoint). 136

Täydellinen tarkistuspiste (complete checkpoint) voidaan ottaa seuraavalla kutsulla: Take-complete-checkpoint() { log(n, begin-complete-checkpoint ); for (jokainen päivitettyjen sivun taulun sivu p) { rl(p); flush-onto-disk(p); poista p:n tiedot päivitettyjen sivujen taulusta; ul(p); } log(n, end-complete-checkpoint ); flush-the-log(); tallenna Begin-Checkpoint-LSN = n tiettyyn paikkaan levylle; }. 137

Kutsu flush-onto-disk(p) vie sivun p levylle WAL-käytännön mukaisesti (siis lokin ensin) ja merkitsee p:n päivittämättömäksi. Kutsu flush-the-log() vie lokipuskurissa olevat, vielä levylle viemättömät lokikirjaukset levylle. Transaktionkäsittely voi jatkua normaalisti tarkistuspisteen ottamisen kanssa rinnan. Tästä syystä päivitettyjen sivujen joukko voi laajentua ennen kuin for-silmukassa päivitetyiksi havaitut sivut on kaikki saatu viedyksi levylle. Häiriöstä elvytyksen toistovaiheen aloituskohtana Redo-LSN voidaan käyttää viimeksi otetun, valmiiksi ehtineen tarkistuspisteen aloituskirjauksen LSN:ää. 138

Täydellisen tarkistuspisteen ottaminen voi olla työläs operaatio ja se voi hidastaa tuntuvasti normaalia transaktionkäsittelyä. Olkoon puskurialtaan koko 5 000 sivua á 8 KB. Oletetaan, että tarkistuspisteen ottohetkellä 50 % sivuista on päivitetty. On siis vietävä levylle 2 500 sivua. Pahimmassa tapauksessa puskurinhallitsin käy puskurialtaan läpi peräkkäisjärjestyksessä ja vie levylle jokaisen päivitetyksi merkityn sivun. Keskimääräisellä 15 ms:n hakuajalla tämä vie kaikkiaan 37,5 sekuntia. Tämä järjestelmän normaalia toimintaa hidastava operaatio toistuu joka viides tai kymmenes minuutti. Asiantilaa voidaan korjata hieman järjestämällä sivujen numerot ennen levylle vientiä, jolloin säästetään hakuvarren liikkeissä. Voitaisiin myös pitää yllä taustaprosessia, joka vie päivitettyjä sivuja levylle, jolloin varsinaista tarkistuspistettä otettaessa on vähemmän kirjoitettavaa. 139

Sumea tarkistuspiste Täydellistä tarkistuspistettä kevyempi menettely tehostaa elvytyksen toistovaihetta on epäsuora tarkistuspiste (indirect checkpoint) eli sumea tarkistuspiste (fuzzy checkpoint), jossa vain osa päivitetyistä sivuista viedään levylle. Minimaalisimmillaan sumeassa tarkistuspisteessä ei viedä yhtään sivua levylle, vaan ainoastaan kirjataan lokiin vedos päivitettyjen sivujen taulusta sekä (peruutusvaiheen helpottamiseksi) vedos myös transaktiotaulusta. 140

Sumeassa tarkistuspisteessä kirjataan lokiin begin-checkpoint. transaction-table{(t 1,s 1,n 1 ),...,(T k,s k,n k )}. page-table{(p 1,r 1 ),...,(p m,r m )}. end-checkpoint. Tässä s i on transaktion T i tila (forward-rolling/backward-rolling), n i on T i :n Undo-Next-LSN ja r j on päivitetyn sivun p j Rec-LSN. Sumeassa tarkistuspisteessä ei välttämättä pakoteta yhtään sivua levylle, ei edes lokitiedoston sivuja. Kun end-checkpoint-kirjaus aikanaan tulee viedyksi levylle, kirjoitetaan vastaavan begin-checkpoint-kirjauksen LSN tiettyyn paikkaan vakaassa muistissa. 141

Transaktiot voivat vapaasti tehdä päivityksiä ja tuottaa lokikirjauksia tarkistuspisteen tuottamien kirjausten väliin. Sivutaulu ja transaktiotaulu täytyy suojata lukusalvoin vedostettaessa niitä lokiin. Usein ja pitkään käytetty sivu voi pysyä puskurissa usean tarkistuspisteen yli, jolloin sen Rec-LSN jäädyttää toistovaiheen aloituskohdan Redo-LSN. Päivitettyjä sivuja on syytä viedä levylle taustaprosessia käyttäen. Päivitetty sivu, jota ei ole viety levylle sitten edellisen tarkistuspisteen, kannattaa määrätä levylle vietäväksi seuraavan tarkistuspisteen yhteydessä (ennen päivitettyjen sivujen taulun vedostusta). Joka tapauksessa on syytä varmistaa, että kussakin tarkistuspisteessä Redo-LSN-arvo edistyy. Tämä saadaan aikaan viemällä levylle muutama pienimmillä Rec- LSN-arvoilla varustettu päivitetty sivu. 142

ARIES-elvytysalgoritmi ARIES-algoritmi (Algorithm for Recovery and Isolation Exploiting Semantics) tietokantajärjestelmän häiriöstä elvyttämiseksi sisältää seuraavat vaiheet: 1. Analyysivaihe. 2. Toistovaihe. 3. Peruutusvaihe. 4. Tarkistuspisteen otto. ARIES-algoritmi edellyttää, että puskurinhallitsin noudattaa WALkäytäntöä sekä normaalin transaktionkäsittelyn että elvytyksen aikana. Muutoin ei puskurointikäytännölle aseteta rajoituksia. Likaisia sivuja on lupa varastaa puskurista ja päivitettyjä sivuja ei ole tarpeen pakottaa levylle transaktion sitoutumisen yhteydessä. ARIES sallii siis vapaimmat mahdolliset puskurointikäytännöt: varasta ja älä pakota. 143

Elvytyksen analyysivaihe Analyysivaiheessa (analysis pass) selvitetään lokista, mitkä transaktiot olivat aktiivisina ja mitkä sivut (mahdollisesti) olivat päivitettyinä puskurissa häiriöhetkellä. Vaiheen syötteenä on viimeisimmän valmiiksi ehtineen (sumean) tarkistuspisteen aloituskirjauksen LSN (Begin-Checkpoint-LSN). Vaiheen tulosteena on aktiivisten transaktioiden taulu, päivitettyjen sivujen taulu sekä arvo Redo-LSN, josta lähtien toistovaiheen pitää aloittaa lokin selaus. Analyysivaiheessa lokia selataan begin-checkpoint-kirjauksesta lokin loppuun. 144

Selauksessa käytetään kutsua get-next-log-record(n), joka palauttaa LSN-arvoa n seuraavalla LSN-arvolla varustetun lokikirjauksen. Transaktiotaulu ja sivutaulu alustetaan tarkistuspisteen lokikirjauksista. Kun selauksessa tavataan sivulle p kirjattu päivitys, missä p:tä ei löydy sivutaulusta, viedään p:n tunniste tauluun ja asetetaan sen Rec- LSN:ksi kyseisen lokikirjauksen LSN. Selauksen lopuksi asetetaan Redo-LSN:ksi minimi sivutaulun sivujen Rec-LSN-arvoista. Analyysivaiheessa ei lainkaan lueta eikä kirjoiteta tietokantasivuja, vaan ainoastaan luetaan lokia ja muodostetaan keskusmuistirakenteita (transaktiotaulu ja sivutaulu). Analyysivaiheen algoritmi (epätäydellisenä; rakennemuutosten lokikirjausten käsittely puuttuu): 145

Analysis-pass() { r := get-next-log-record(begin-checkpoint-lsn); while (r on lokikirjaus) { if (r = n : transaction-table,{...} ) alusta transaktiotaulu; else if (r = n : page-table,{...} ) alusta sivutaulu; else if (r = n : T,B ) vie transaktiotauluun tietue (T, forward-rolling, Undo-Next-LSN = n); else if (r = n : T,(I D), p,... ) { Undo-Next-LSN(T ) := n; if (p ei sivutaulussa) vie (p,rec-lsn = n) sivutauluun; } else if (r = n : T,A ) state(t ) := backward-rolling else if (r = n : T,(I D) 1, p,...,n ) { Undo-Next-LSN(T ) := n ; if (p ei sivutaulussa) vie (p,rec-lsn = n) sivutauluun; } else if (r = n : T,C ) poista T transaktiotaulusta; else if (r = n : T,S[P],n ) Undo-Next-LSN(T ) := n; r := get-next-log-record(n); } return Redo-LSN = min{n (p, Rec-LSN= n) on sivutaulussa}; }. 146

Oletetaan, että häiriön sattuessa lokin sisältö levyllä on seuraava: 101: T 1,B 102: T 1,D, p 1,i 1,x 1,v 1,101 103: begin-checkpoint 104: transaction-table, { (T 1, forward-rolling, Undo-Next-LSN=102)} 105: page-table, {(p 1, Rec-LSN=102)} 106: end-checkpoint 107: T 1,I, p 1,i 1,x 1,v 1,102 108: T 2,B 109: T 1,C 110: T 2,D, p 1,i 1,x 1,v 1,108 111: T 3,B 112: T 3,I, p 2,i 2,x 2,v 2,111 113: T 2,I, p 1, j 1,x 3,v 3,110 114: T 2,A 115: T 2,I 1, p 1, j 1,110 147

Analyysivaiheessa lokia selataan tarkistuspisteen aloituskirjauksesta 103 lokin loppuun. Tarkistuspisteen lokikirjauksesta 104 alustetaan transaktiotaulun sisällöksi rivi (T 1, forward-rolling, Undo-Next-LSN=102). Tarkistuspisteen lokikirjauksesta 105 alustetaan sivutaulun sisällöksi rivi (p 1,Rec-LSN = 102). Kirjauksesta 107 (T 1 :n päivitys sivulle p 1 ) päivitetään transaktiotaulussa Undo-Next-LSN(T 1 ) = 107. Sivutaulua ei päivitetä, sillä sivu p 1 on jo siellä. Kirjauksesta 108 (T 2 :n aloituskirjaus) lisätään transaktiotauluun rivi (T 2, forward-rolling, Undo-Next-LSN=108). Kirjaus 109 (T 1 :n sitoutumiskirjaus) aiheuttaa transaktion T 1 tietojen poiston transaktiotaulusta. Taulun sisällöksi jää {(T 2, forward-rolling, Undo-Next-LSN=108)}. 148

Kirjauksesta 110 (T 2 :n päivitys sivulle p 1 ) päivitetään transaktiotaulussa Undo-Next-LSN(T 2 ) := 110. Sivutaulua ei päivitetä. Kirjauksesta 111 (T 3 :n aloituskirjaus) lisätään transaktiotauluun rivi (T 3, forward-rolling, Undo-Next-LSN=111). Kirjauksesta 112 (T 3 :n päivitys sivulle p 2 ) päivitetään transaktiotaulussa Undo-Next-LSN(T 3 ) := 112 ja lisätään sivutauluun rivi (p 2,Rec-LSN = 112). Kirjauksesta 113 (T 2 :n päivitys sivulle p 1 ) päivitetään transaktiotaulussa Undo-Next-LSN(T 2 ) := 113. Sivutaulua ei päivitetä. Kirjauksesta 114 (T 2 :n keskeytyskirjaus) muutetaan transaktiotaulussa T 2 :n tilaksi backward-rolling. Kirjauksesta 115 (T 2 :n päivityksen peruutus sivulle p 1 ) päivitetään transaktiotaulussa Undo-Next-LSN(T 2 ) := 110. Sivutaulua ei päivitetä. 149

Loki on nyt selattu loppuun. Transaktiotaulun sisältönä on: {(T 2,backward-rolling,Undo-Next-LSN = 110), (T 3,forward-rolling,Undo-Next-LSN = 112)}. Sivutaulun sisältönä on: {(p 1,Rec-LSN = 102),(p 2,Rec-LSN=112)}. Analyysivaiheen lopuksi asetetaan toistovaiheen aloituskohdaksi Redo-LSN := min{102, 112} = 102. 150

Elvytyksen toistovaihe Toistovaihe (redo pass) toistaa historian (repeats history), so. saattaa tietokannan samaan tilaan, jossa se oli häiriöhetkellä. Tarkemmin sanoen toistovaihe palauttaa fyysisen tietokannan (ja siis myös loogisen tietokannan) siihen tilaan, jossa tietokanta oli, kun tuorein ennen häiriötä levylle ehtinyt lokikirjaus tehtiin. Tietokannan tila rekonstruoidaan tietokannan levyversiosta ja lokista. Lokia selataan Redo-LSN:stä lähtien lokin loppuun ja toteutetaan ne lokiin kirjatut päivitykset, jotka eivät olleet ehtineet levylle asti ennen häiriötä. Myös aktiivisten transaktioiden päivitykset toistetaan, vaikka nämä transaktiot elvytyksen peruutusvaiheessa lopulta tulevatkin peruutetuiksi. 151

Aina kun lokiselauksessa tavataan transaktion T päivitysoperaation (etenemisoperaation tai käänteisoperaation) lokikirjaus n : T,o, p,i, x,n missä Rec-LSN(p) lokikirjauksen LSN n, naulitaan ja kirjoitussalvataan sivu p ja tutkitaan sen Page-LSN:ää. Jos Page-LSN(p) < n, tiedetään, ettei päivitystä ole sivulla p. Silloin toteutetaan operaatio o[ x] sivulle p paikkaan i ja asetetaan Page-LSN(p) := n. Lopuksi vapautetaan sivun p salpaus ja naulinta. 152

Mikäli sivun p päivityskirjauksen LSN n on pienempi kuin Rec- LSN(p), sivua p ei ole tarpeen naulita ollenkaan, vaan päivityskirjaus voidaan ohittaa. Aina kun sivu p joudutaan naulitsemaan ja salpaamaan ensi kerran toistovaiheen aikana (tutkittaessa päivityskirjausta, jonka LSN n Rec-LSN(p)), saatetaan myös ajan tasalle Rec-LSN(p). Tämä tapahtuu asettamalla sivutaulussa Rec-LSN(p) := max{rec-lsn(p), Page-LSN(p) + 1}, missä Page-LSN(p) on sivun levyversioon leimattu LSN ja LSN-arvo Page-LSN(p) + 1 esittää arvoa Page-LSN(p) lähinnä suurempaa LSN-arvoa. 153

Menettely tehostaa nyt suoritettavana olevan elvytyksen toistovaihetta. Myöhempänä lokissa voi näet olla samalle sivulle kohdistuneita päivityksiä, joiden lokikirjausten LSN:t ovat sivun ajan tasalle saatettua Rec-LSN:ää pienempiä; näitä sivuja ei nyt tarvitse lainkaan naulita puskuriin. Menettely tehostaa myös myöhempien elvytyskertojen toistovaiheita, koska seuraavaksi otettavassa tarkistuspisteessä vedostettavaan sivutauluun saadaan päivitetyille sivuille ajantasaisemmat Rec-LSNt. Toistovaiheessa ei kirjoiteta mitään lokitietueita. Operaatiot näet toistetaan aina fyysisesti eli samoille sivuille ja samoihin tietuepaikkoihin kuin ne alkujaan suoritettiin; lokissa jo olevat kirjaukset kuvaavat täsmälleen myös operaatioiden toistoa. Toistovaiheen algoritmi (epätäydellisenä; rakennemuutosten lokikirjausten käsittely puuttuu): 154

Redo-pass() { r := get-log-record(redo-lsn); while (r on lokikirjaus) { if (r on muotoa n : T,o, p,i, x,n ) if (p on sivutaulussa ja Rec-LSN(p) n) { wl(p); if (p on päivittämätön) Rec-LSN(p) :=max{rec-lsn(p),page-lsn(p) + 1}; if (Page-LSN(p) < n) { if (r = n : T,I, p,i,x,v,n ) lisää (x,v) sivulle p paikkaan i; else if (r = n : T,D, p,i,x,v,n ) poista (x,v) sivulta p paikasta i; else if (r = n : T,I 1, p,i,n ) poista monikko sivulta p paikasta i; else if (r = n : T,D 1, p,i,x,v,n ) lisää (x,v) sivulle p paikkaan i; Page-LSN(p) := n; } ul(p); } r := get-next-log-record(n); } }. 155

Esimerkkitapauksessamme elvytyksen toistovaiheessa lokia selataan kirjauksesta Redo-LSN = 102 lähtien loppuun. Oletetaan, että sivun p 1 levyversiossa Page-LSN(p 1 ) = 102 ja että sivun p 2 levyversiossa Page-LSN(p 2 ) < 100. Kirjaus 102: Koska Rec-LSN(p 1 ) = 102 102, sivu p 1 joudutaan naulitsemaan ja kirjoitussalpaamaan. Tutkitaan sivun p 1 Page-LSN:ää. Havaitaan, että Page-LSN(p 1 ) = 102. Koska Page-LSN(p 1 ) = 102 102, niin operaation D[x 1,v 1 ] tulos on jo sivulla p 1. Asetetaan Rec-LSN(p 1 ) := max{102,102 + 1} = 103. Vapautetaan sivun p 1 salpaus ja naulinta. 156

Kirjaus 107: Koska Rec-LSN(p 1 ) = 103 107, sivu p 1 naulitaan ja kirjoitussalvataan. Koska Page-LSN(p 1 ) = 102 < 107, operaation I[x 1,v 1 ] tulos puuttuu sivulta p 1. Lisätään monikko (x 1,v 1 ) sivulle p 1 paikkaan i 1 ja asetetaan Page- LSN(p 1 ) := 107. Vapautetaan sivun p 1 salpaus ja naulinta. Kirjaus 110: Koska Rec-LSN(p 1 ) = 103 110, sivu p 1 naulitaan ja kirjoitussalvataan. Koska Page-LSN(p 1 ) = 107 < 110, niin operaation D[x 1,v 1 ] tulos puuttuu sivulta p 1. Poistetaan monikko (x 1,v 1 ) sivulta p 1 paikasta i 1 ja asetetaan Page- LSN(p 1 ) := 110. Vapautetaan sivun p 1 salpaus ja naulinta. 157

Kirjaus 112: Koska Rec-LSN(p 2 ) = 112 112, sivu p 2 naulitaan ja kirjoitussalvataan. Koska Page-LSN(p 2 ) < 100 < 112, niin operaation I[x 2,v 2 ] tulos puuttuu sivulta p 2. Lisätään monikko (x 2,v 2 ) sivulle p 2 paikkaan i 2 ja asetetaan Page- LSN(p 2 ) := 112. Vapautetaan sivun p 2 salpaus ja naulinta. Kirjaus 113: Koska Rec-LSN(p 1 ) = 103 113, sivu p 1 naulitaan ja kirjoitussalvataan. Koska Page-LSN(p 1 ) = 110 < 113, niin operaation I[x 3,v 3 ] tulos puuttuu sivulta p 1. Lisätään monikko (x 3,v 3 ) sivulle p 1 paikkaan j 1 ja asetetaan Page- LSN(p 1 ) := 113. Vapautetaan sivun p 1 salpaus ja naulinta. 158

Kirjaus 115: Koska Rec-LSN(p 1 ) = 103 115, sivu p 1 naulitaan ja kirjoitussalvataan. Koska Page-LSN(p 1 ) = 113 < 115, niin operaation I 1 [x 3,v 3 ] tulos puuttuu sivulta p 1. Poistetaan monikko sivulta p 1 paikasta j 1 ja asetetaan Page- LSN(p 1 ) := 115. Vapautetaan sivun p 1 salpaus ja naulinta. Toistovaihe on nyt päätöksessä. Sivulla p 2 on monikko (x 2,v 2 ) ja avaimilla x 1 ja x 3 varustetut monikot puuttuvat tietokannasta, kuten oli asianlaita häiriön sattuessa. 159

Elvytyksen peruutusvaihe Peruutusvaiheessa (undo pass) peruutetaan etenevät transaktiot ja saatetaan päätökseen peruuntuvien transaktioiden peruutus. Transaktiotaulun jokaiselle etenevälle transaktiolle T asetetaan tilaksi backward-rolling ja kirjataan lokiin T,A. Sitten selataan lokia lopusta alkuun päin käyden läpi transaktiotaulun transaktioiden etenemisvaiheiden vielä peruuttamatta olevien päivitysten lokikirjaukset kronologisen järjestyksen käänteisjärjestyksessä. Lokikirjauksista tutkitaan vuorollaan aina se, jonka LSN on sama kuin transaktiotaulun transaktioiden senhetkinen suurin Undo-Next- LSN-arvo. 160

Aina kun tavataan päivityskirjaus T,o, p,i, x,n, naulitaan ja kirjoitussalvataan sivu p ja suoritetaan käänteisoperaatio o 1 [ x] sille sivulle p, joka peittää kyseisen avaimen. Käänteisoperaatio suoritetaan samalla tavalla kuin normaalin transaktionkäsittelyn aikana yksittäisen peruuntuvan transaktion käänteisoperaatio. Ensin yritetään suorittaa käänteisoperaatio fyysisesti, mutta jos tämä ei onnistu, suoritetaan käänteisoperaatio loogisesti. Jos lokikirjauksessa mainittu sivu p, jolle etenemisvaiheen operaatio o[ x] aikoinaan suoritettiin, edelleen peittää monikon avainarvon ja käänteisoperaatio o 1 [ x] voidaan suorittaa sivulle p, niin p = p ja operaatio on fyysinen; muutoin p:n salpaus ja naulinta vapautetaan ja käänteisoperaatio suoritetaan loogisesti. 161

Käänteisoperaatiosta kirjataan lokiin m : T,o 1, p,i, x,n, missä x on argumenteista x operaation o käänteisoperaation toistossa tarvittava osa. Sivulla p asetetaan Page-LSN(p ) := m, sivun p salpaus ja naulinta vapautetaan ja transaktiotaulussa asetetaan Undo-Next-LSN(T ) := n. Seuraavaksi tutkitaan se lokitietue, jonka LSN on nyt transaktiotaulun suurin Undo-Next-LSN. Aina kun tavataan lokikirjaus T, B, kirjataan lokiin T,C, pakotetaan loki levylle ja poistetaan T :n tiedot transaktiotaulusta. Peruutusvaihe loppuu, kun transaktiotaulussa ei enää ole yhtään transaktiota. Peruutusvaiheessa suoritettavissa päivitysoperaatioissa noudatetaan luonnollisesti WAL-käytäntöä. 162

Peruutusvaiheen algoritmi: Undo-pass() { for (jokainen transaktiotaulun etenevä transaktio T ) abort(t ); while (transaktiotaulu on epätyhjä) { n := max{undo-next-lsn(t ) T on transaktiotaulussa}; r := get-log-record(n); if (r = n : T,B ) { log(m, T,C ); flush-the-log(); poista T transaktiotaulusta; } else if (r = n : T,I, p,i,x,v,n ) undo-insert(n,t, p,i,x,n ) else if (r = n : T,D, p,i,x,v,n ) undo-delete(n,t, p,x,v,n ) else if (r = n : T,S[P],n ) Undo-Next-LSN(T ) := n ; } }. 163

Esimerkkitapauksessamme elvytyksen peruutusvaihe suoritetaan seuraavasti. Ainoa etenevä transaktio T 3 muutetaan peruuntuvaksi asettamalla transaktiotaulussa sen tilaksi backward-rolling sekä kirjaamalla lokiin keskeytyskirjaus 116: T 3,A. Transaktiotaulun sisältönä on nyt: {(T 2,backward-rolling,Undo-Next-LSN = 110), (T 3,backward-rolling,Undo-Next-LSN = 112)}. Sitten selataan lokia lopusta alkuun päin lähtien kirjauksesta 112 = max{110,112} (transaktiotaulun Undo-Next-LSN:ien maksimi). Kirjaus 112 on T 3 :n sivulle p 2 kohdistuneen operaation I[x 2,v 2 ] kirjaus. Naulitaan ja kirjoitussalvataan sivu p 2. 164

Havaitaan, että avainarvolla x 2 varustettu monikko on edelleen sivulla p 2 ja siellä entisessä paikassaan i 2. Oletetaan, ettei sivu p 2 alivuoda monikon poistosta. Käänteisoperaatio I 1 [x 2,v 2 ] suoritetaan poistamalla monikko (x 2,v 2 ) paikasta (p 2,i 2 ). Kirjataan lokiin korvaava kirjaus 117: T 3,I 1, p 2,i 2,111, asetetaan Page-LSN(p 2 ) := 117, vapautetaan sivun p 2 salpaus ja naulinta ja asetetaan transaktiotaulussa Undo-Next-LSN(T 3 ) := 111. Transaktiotaulun Undo-Next-LSN:ien maksimi on nyt 111, joten seuraavaksi käsitellään lokikirjaus 111. 165

Kirjaus 111 on T 3 :n aloituskirjaus, joten T 3 :n peruutus on saatu päätökseen; kirjataan lokiin peruutuksen päättymiskirjaus 118: T 3,C ja pakotetaan loki levylle. Poistetaan T 3 :n tiedot transaktiotaulusta. Transaktiotaulun sisältönä on nyt {(T 2,backward-rolling,Undo-Next-LSN = 110)}. Seuraavaksi käsitellään siis lokikirjaus 110. Kirjaus 110 on T 2 :n sivulle p 1 kohdistuneen operaation D[x 1,v 1 ] kirjaus. Naulitaan ja kirjoitussalvataan sivu p 1. 166

Havaitaan, että sivu p 1 edelleen peittää avaimen x 1 ja että siellä on tilaa monikolle (x 1,v 1 ). Käänteisoperaatio D 1 [x 1,v 1 ] suoritetaan lisäämällä monikko (x 1,v 1 ) sivulle p 1 paikkaan i 1. Kirjataan lokiin korvaava kirjaus 119: T 2,D 1, p 1,i 1,x 1,v 1,108, asetetaan Page-LSN(p 1 ) := 119, vapautetaan sivun p 1 salpaus ja naulinta ja asetetaan transaktiotaulussa Undo-Next-LSN(T 2 ) := 108. Transaktiotaulun sisältönä on nyt {(T 2,backward-rolling,Undo-Next-LSN = 108)}. Seuraavaksi käsitellään siis lokikirjaus 108. 167

Kirjaus 108 on T 2 :n aloituskirjaus, joten T 2 :n peruutus on saatu päätökseen; kirjataan lokiin peruutuksen päättymiskirjaus 120: T 2,C ja pakotetaan loki levylle. Poistetaan T 2 :n tiedot transaktiotaulusta. Peruutusvaihe päättyy nyt, koska transaktiotaulu on tyhjä. Tietokannassa ei nyt enää ole avainarvolla x 2 varustettua monikkoa, ja avainarvolla x 1 varustettu monikko on (x 1,v 1 ). Looginen tietokanta on siis saatettu tilaan, jossa on ainoastaan sitoutuneen transaktion T 1 tekemät päivitykset. 168

Elvytyksen viimeisenä vaiheena otetaan tarkistuspiste. Esimerkkitapauksessamme lokiin kirjataan 121: begin-checkpoint 122: transaction-table, {} 123: page-table, {(p 1, Rec-LSN=103),(p 2, Rec-LSN=112)} 124: end-checkpoint Tämän jälkeen voidaan ryhtyä ottamaan vastaan uusia transaktioita. 169

Yhteenvetona todetaan, että lokin sisältö elvytyksen päätteeksi on: 101: T 1,B 102: T 1,D, p 1,i 1,x 1,v 1,101 103: begin-checkpoint 104: transaction-table, { (T 1, forward-rolling, Undo-Next-LSN=102)} 105: page-table, {(p 1, Rec-LSN=102)} 106: end-checkpoint 107: T 1,I, p 1,i 1,x 1,v 1,102 108: T 2,B 109: T 1,C 110: T 2,D, p 1,i 1,x 1,v 1,108 111: T 3,B 112: T 3,I, p 2,i 2,x 2,v 2,111 113: T 2,I, p 1, j 1,x 3,v 3,110 114: T 2,A 115: T 2,I 1, p 1, j 1,110 h ä i r i ö 116: T 3,A 117: T 3,I 1, p 2,i 2,111 118: T 3,C 119: T 2,D 1, p 1,i 1,x 1,v 1,108 120: T 2,C 121: begin-checkpoint 122: transaction-table, {} 123: page-table, {(p 1, Rec-LSN=103),(p 2, Rec-LSN=112)} 124: end-checkpoint 170

Rakennemuutosten käsittely Tarkastellaan rakennemuutosta, joka on kirjattu lokiin ainoastaan toistokelpoisella kirjauksella n : S, p 1,..., p k,v 1,...,V l, missä S on rakennemuutoksen nimi, p 1,..., p k rakennemuutoksessa päivitettyjen sivujen tunnisteet ja V 1,...,V l rakennemuutoksen muut argumentit (esim. sivulta toiselle siirrettyjen tietueiden joukkoja). Tällainen on esimerkiksi uuden sivun varausta esittävä kirjaus n: allocate-page-for-heap, s, f, p,q tai B-puun sivun p lapsisivun q halkaisua esittävä kirjaus n: split, s, p,q,x,q,v, missä V sisältää täydeltä sivulta q uudelle sisarussivulle q siirretyt tietueet (puoli sivullista). 171

Häiriöstä elvytyksen analyysivaiheessa rakennemuutoksen lokikirjaus käsitellään seuraavasti (lisäys algoritmiin analysis-pass): else if (r = n : S, p 1,..., p k,v 1,...,V l ) for (jokainen i = 1,...,k) if (p i ei sivutaulussa) vie (p i,rec-lsn = n) sivutauluun; 172

Häiriöstä elvytyksen toistovaiheessa lokiin kirjatut rakennemuutokset toistetaan tarvittaessa kuten loogisen tietokannan päivityksetkin, kun havaitaan, ettei operaation tulosta ole levyllä. Rakennemuutoksen lokikirjauksen käsittely elvytyksen toistovaiheessa (lisäys algoritmiin redo-pass): else if (r on rakennemuutoskirjaus n : S, p 1,..., p k,v 1,...,V l ) { for (jokainen i = 1,...,k) if (p i on sivutaulussa ja Rec-LSN(p i ) n) { wl(p i ); if (p i on päivittämätön) Rec-LSN(p i ) := max{rec-lsn(p i ), Page-LSN(p i )+1}; if (Page-LSN(p i ) < n) { redo-s-on-page-i(p 1,..., p k,v 1,...,V l ); Page-LSN(p i ) := n; }; ul(p i ); } 173

Kutsu redo-s-on-page-i(p 1,..., p k,v 1,...,V l ) tuottaa rakennemuutoksen S tuloksen sivun p i osalta käyttäen argumentteinaan sivun p i senhetkistä sisältöä, sivutunnisteita p 1,..., p k ja argumentteja V 1,...,V l. Esimerkiksi lokikirjauksen n: allocate-page-for-heap, s, f, p,q tapauksessa kutsu redo-allocate-page-for-heap-on-page-1(s, f, p, q) asettaa sivutunnistetta q vastaavan bitin ykköseksi varauskuvaajasivulla s. 174

Kun jokainen rakennemuutos voidaan kirjata kokonaisuudessaan yhdellä lokitietueella, WAL-käytäntö takaa, ettei häiriöstä elvytyksen toistovaiheen jälkeen koskaan esiinny tarvetta peruuttaa kesken jääneitä rakennemuutoksia. Rakennemuutoksen lokikirjauksen riittää olla silloin ainoastaan toistokelpoinen. On syytä pyrkiä ratkaisuun, jossa rakennemuutokset täyttävät aina tämän ehdon. Ne sivut, joita rakennemuutos koskee, pidetään naulittuina ja kirjoitussalvattuina puskurissa rakennemuutoksen ajan. Kun rakennemuutos koskettaa vain pientä vakiomäärää sivuja, on näiden yhtäaikainen ja koko rakennemuutoksen ajan kestävä salpaus perusteltua. 175

Useita sivuja koskettava rakennemuutos, joka kirjattaisiin usealla lokitietueella ja jossa osa sivuista voitaisiin varastaa puskurista ennen rakennemuutoksen sitoutumista, sitä vastoin jouduttaisiin peruuttamaan, mikäli rakennemuutos ei ole ehtinyt sitoutua ennen häiriötä. Peruutus voisi tapahtua ainoastaan fyysisesti. Rakennemuutos on näet fyysinen operaatio. ARIES/KVL- ja ARIES/IM-menetelmissä (MOHAN 1996) B-puun useaa tasoa koskettava rakennemuutos (sivujen halkaisusarja tai yhdistämissarja) voi häiriötilanteessa jäädä keskeneräiseksi ja joudutaan elvytyksen peruutusvaiheessa peruuttamaan. Normaalin transaktionkäsittelyn kuluessa taataan erityisellä puusalvalla (tree latch), että rakennemuutoksia voi olla samanaikaisesti suorituksessa ainoastaan yksi. Tämä puolestaan takaa, että elvytyksen peruutusvaiheessa loogisesti peruutettavan monikkopäivityksen hakupolku on oikeellinen. 176