Elvytys R & G Chapter 18 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 1
Motivaatio Atomisuus: Transaktiot voivat päättyä peruutukseen ( Rollback ). Pysyvyys: Entä jos TKHJ kaatuu? (Syyt?) Halutut ominaisuudet kaatumistilanteessa: T1, T2 & T3 tulee olla pysyviä. T4 & T5 tulee peruuttaa (muutokset eivät näkyviä). crash! 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 2 T1 T2 T3 T4 T5
Häiriötilanteita Tietokonejärjestelmä romahtaa (system crash) laitteisto, ohjelmisto tai tietoliikennevirheen takia. Yleensä keskusmuistin (tietokantapuskurien) sisältöä menetetään. Yksittäisen transaktion suoritus keskeytyy ohjelman poikkeustilanteen (nollalla jako tms.) tai loogisen ohjelmavirheen takia. Käyttäjä voi myös keskeyttää kyselyn suorituksen väkivalloin. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 3
Häiriötilanteita 2 Transaktion suoritus keskeytetään hallitusti; esim. transaktion (proseduurin) koodissa suoritetaan jonkin ehdon seurauksena rollback pyyntö. Jos ei esimerkiksi ei löydy transaktion tarvitsemaa syötettä tai se on virheellinen. Samanaikaisuuden hallinnan alijärjestelmä joutuu keskeyttämään transaktion, jotta muut transaktiot voisivat edetä (lukkiutuma tai jokin lievempi suoritus järjestykseen liittyvä häiriö). 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 4
Häiriötilanteita 3 Levyvirhe on turmellut levyn sisältöä. (harvinaista) Ulkopuolinen häiriötekijä (operointivirhe,, sähkökatko) keskeyttää transaktion. (harvinaista) Yllä olevien kohdalla elvytys voi sisältää edellisen varmuuskopion (ajanhetkeltä t) käyttöönoton; Lokin avulla voidaan mahdollisesti suorittaa uudelleen (redo) hetken t ja häiriöajankohdan välillä suoritetut toiminnot Varmuuskopion ja lokin tulisi olla esim. nauhalla tallessa (levyvirhe ). 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 5
Oletukset Käytetään samanaikaisuudenhallintaa. Oletetaan käytössä olevan tiukka 2PL (strict 2PL). Päivityksissä uusi tieto korvaa vanhan tiedon. Mikä tällöin olisi helppo menetelmä atomisuuden ja pysyvyyden takaamiseksi? 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 6
Puskurisivujen hallinta Pakotetaan jokainen kirjoitus levylle? Huono vasteaika. Takaa pysyvyyden. Varastetaan puskurisivuja sitoutumattomilta? Jos ei, huono läpimenoaika. Entä atomisuuden takaaminen? Pakota Älä pakota Älä varasta Triviaali Varasta Haluttu 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 7
Lisää varastamisesta Varasta (Atomisuuden takaaminen?) Varastetaan puskurikehys F: Nykyinen sivu F:ssä (olkoon P) kirjoitetaan levylle; jollain transaktiolla lukko P:hen Mitä tehdään jos transaktio peruuntuu? Pitää muistaa tietoalkion vanha arvo ennen sivun varastamista (tarvitaan kirjoitetun sivun P muutosten perumiseen (undo)). 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 8
Lisää pakottamisesta Älä pakota (Pysyvyyden takaaminen?) Entä jos järjestelmä kaatuu ennen kuin muutoksia sisältävä sivu ehditään kirjoittamaan levylle? Kirjoitetaan mahdollisimman vähän sitoutumisen yhteydessä ja tarjotaan tapa uudelleen suorittaa muutokset (redo). 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 9
Perusidea: loki Tallennetaan REDO ja UNDO informaatio jokaisesta muutoksesta lokiin. Peräkkäistalletuksena kasarakenteeseen (talletus eri levylle kuin tietokanta). Mahdollisimman vähän tietoa muutoksesta, joten useita muutoksia mahtuu yhdelle sivulle. Loki: Järjestetty lista REDO/UNDO operaatioita Lokitietue sisältää: <XID, pageid, offset, length, old data, new data> Sekä muuta hallintotietoa. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 10
Loki Loki (log) on peräkkäistiedosto, jonne viedään tapahtuman aloituskirjauksia (start,t) muutoskirjauksia (write,t,x,v1,v2): tapahtuma T on muuttanut tietoalkion x vanhan arvon v1 (alkukuva, before image) uudeksi arvoksi v2 (jälkikuva, after image) sitoutumiskirjauksia (commit,t): tkhj on sitoutunut keskeytyskirjauksia (abort,t): tkhj on peruuttanut tarkistuspisteitä (checkpoint) [ lukukirjauksia (read,t,x) ei tarvita elvytyksessä] 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 11
Lokitietueet Lokitietueen kentät: päivitys tietueilla prevlsn transid type pageid length offset before image after image Compensation Log Records (CLRs) Peruutusoperaatioita varten 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 12
Write Ahead Logging (WAL)) Protokolla: 1. Päivityksen lokikirjaus pakotetaan levylle ennen kuin muutokseen liittyvä tietosivu kirjoitetaan levylle. 2. Kirjoitetaan kaikki transaktioon liittyvät lokikirjaukset levylle ennen transaktion sitoutumista. #1 takaa atomisuuden. #2 takaa pysyvyyden. Kuinka lokikirjauksia käytetään elvytyksessä? Tutkimme ARIES algoritmia. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 13
WAL & Loki Jokaisella lokitietueella yksikäsitteinen tunnistenumero eli Log Sequence Number (LSN). Jokaisella tietosivulla on sivutunniste eli pagelsn = Viimeisimmän sivuun muutoksia sisältävän lokitietueen LSN. Järjestelmä ylläpitää tietoa viimeisimmästä levylle kirjoitetusta lokitietueesta tunnuksessa flushedlsn. WAL: Ennen sivun kirjoitusta, pagelsn flushedlsn 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 14
Muita lokiin liittyviä tietorakenteita Transaktiotaulu: Jokaisella transaktiolla yksi rivi sisältäen transaktion tunnisteen XID, tilan (running/commited/aborted), ja lastlsn. Likaisten sivujen taulu: Jokaisella puskurisivulla yksi rivi, sisältäen reclsn sen lokitietueen LSN, joka ensimmäisenä aiheutti sivun muuttumisen likaiseksi. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 15
Transaktion normaali suoritus Joukko luku ja kirjoitusoperaatioita, joita seuraa peruutus tai sitoutumisoperaatio. Oletetaan että kirjoitus on atominen levylle. Käytössä tiukka 2PL (Strict 2PL). Varasta, älä pakota puskurinhallinta käyttäen Write Ahead Logging. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 16
Transaktion peruutus Oletetaan että transaktio suorittaa abort operaation. Käydään läpi lokia lopusta alkuun päin peruuttaen tehdyt muutokset. Haetaan transaktion lastlsn transaktiotaulusta. Lokitietueiden ketjua voidaan seurata taaksepäin käyttäen prevlsn kenttää. Ennen peruutuksen aloitusta, kirjoitetaan abort tietue lokiin. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 17
Peruutus, jatkoa. Peruutuksen tekemiseen tarvitaan lukko tietoalkioon (ei ongelma!) Ennen vanhan arvon palautusta kirjoita CLR: Jatketaan siis peruutuksessa lokikirjauksia!! CLR sisältää ylimääräisen kentän: undonextlsn Viite seuraavaan LSN:ään joka perutaan (eli käsittelyssä olevan tietueen prevlsn kentän arvo). CLRs ei koskaan peruta (saatetaan toistaa!) Peruutuksen loputtua kirjoitetaan end tietue. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 18
Transaktion sitoutuminen Kirjoitetaan commit tietue lokiin. Kaikki transaktion lokitietueen aina lastlsn:ään asti kirjoitetaan levylle. Takaa että flushedlsn lastlsn. Lokikirjaukset ovat synkronisia peräkäisiä levyoperaatioita. Useita lokitietueita/sivu. Commit() palaa. Kirjoitetaan end tietue lokiin. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 19
Tarkistuspiste (checkpoint) Tarkistuspisteessä viedään levylle asti kaikki puskureissa olevat tietokantasivujen päivitykset seuraavien häiriöiden yhteydessä tarvittavat elvytystoimenpiteet vähenevät Tarkistuspiste sisältää seuraavat toiminnot: 3. estetään väliaikaisesti transaktioiden suoritus 4. pakkokirjoitettaan kaikki transaktioiden päivittämät sivut puskurista levylle 5. kirjoitetaan lokiin tarkistuspistekirjaus ja pakkokirjoitettaan loki levylle 6. sallitaan transaktioiden jatkaa suoritustaan 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 20
Elvytyksen periaatteet Peruutetaan (undo) ne muutokset, joita keskeytyneet transaktiot ovat tehneet levyille. Suoritetaan uudelleen (redo) sellaisten sitoutuneiden transaktioiden suorittamat tietokantapäivitykset, joita ei häiriön sattuessa ollut ehditty kirjoittaa levylle (vaan vasta puskurissa olevaan sivuun). 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 21
Elvytysalgoritmi 1. luetaan lokia levyltä ja muodostetaan kaksi transaktiolistaa: Keskeneräiset = transaktiot, joille on lokissa aloituskirjaus (start), mutta ei sitoutumiskirjausta (commit) eikä viimeistä tarkistuspistettä edeltävää keskeytyskirjausta (abort) keskeytyskirjaus ennen tarkistuspistettä: muutosten peruutukset on merkitty puskuriin ja huomattu tarkistuspisteessä Sitoutuneet = transaktiot, joille on lokissa sitoutumiskirjaus viimeisen tarkistuspisteen jälkeen 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 22
Elvytysalgoritmi, peruutusvaihe 2. Perutaan keskeneräiset listan transaktioiden kirjoitus operaatiot selaamalla lokia lopusta alkuun päin: Jokaista löytyvää muutoskirjausta (write,t,x,vanha,uusi) kohti suoritetaan operaatio write(x, vanha) (palautetaan tietoalkion x alkukuva voimaan), jos LSN <= pagelsn. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 23
Elvytysalgoritmi, toistovaihe 1. Uusitaan sitoutuneet listan transaktioiden kirjoitus operaatiot selaamalla lokia alusta loppuun päin: jokaista löytyvää muutoskirjausta (write,t,x,vanha,uusi) kohti suoritetaan operaatio write(x, uusi) (saatetaan siis tietoalkion jälkikuva uudelleen voimaan), jos LSN > pagelsn 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 24
Perusteluita Ennen tarkistuspistettä suoritettua kirjoitusoperaatiota ei tarvitse uusia (esimerkissä rivi 5), sillä se on tarkistuspisteessä hoidettu levylle. Tarkistuspisteen jälkeen tehtyä kirjoitusoperaatiota, jonka tulos on ehtinyt levylle ennen häiriötilannetta, ei tarvitse uusia Myös perumiskirjoitus (undo) voi olla turha, sillä sellaisia kirjoituksia, joiden tulos ei ole ehtinyt levylle, ei tarvitse perua Uusimis /perumiskirjoituksen tarve selviää vertaamalla lokitietueen tunnusta (LSN) ja datasivun pagelsn kenttää: undo tarvitaan, jos LSN <= pagelsn redo tarvitaan, jos LSN > pagelsn 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 25
Esimerkki Jos pagelsn(x1) = 10, pagelsn(x2) = 7, niin vain write(x1, CCC ) tarvitaan 1: (start, T1) 2: (start, T2) 3: (write, T1, x1, AAA, BBB ) 4: (commit, T1) 5: (write, T2, X1, BBB, CCC ) 6: (checkpoint) 7: (write, T2, x2, 0000, 1111 ) 8: (start, T3) 9: (commit, T2) 10: (write, T3, x1, CCC, DDD ) 11: (write, T3, x2, 1111, 2222 ) Elvytysalijärjestelmä lukee lokia levyltä ja muodostaa listat L1 = <T3>, L2 = <T2> peruu transaktion T3 operaatiot suorittamalla: {write(x2, 1111 ) (11)} write(x1, CCC ) (10) suorittaa uudelleen transaktion T2 operaatiot {write(x1, CCC ) (5)} {write(x2, 1111 ) (7)} 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 26
Häiriö kesken elvytyksen? Häiriö voi sattua myös kesken elvytyksen Tällöin oleellista on, että elvytysprosessin peräkkäiset suoritukset tuottavat saman tuloksen Edellä kuvattu elvytys ei kirjaa lokiin mitään, joten siinä lähdetään uudelleen liikkeelle samasta lähtötilanteesta, pagelsn kentät sivuilla ovat voineet muuttua, jos sivu on viety levylle, mutta lopputulos on sama. Käytännössä kirjataan peruutusten yhteydessä lokiin yleensä myös kompensaatiomerkintöjä (CLR), joista näkee mitä peruutuksia on tehty. Näitä ei kuitenkaan tarvita elvytyksessä. Elvytyksestä on erilaisia muunnelmia riippuen siitä minkälaista puskurien levykirjoituspolitiikkaa käytetään. 16.02.06 Tietokannan hallinta, kevät 2006, J. Li 27