Torna alla pagina di Basi di Dati - Complementi
:: Basi di Dati - Complementi ::
Esercizi: Ripresa a caldo
Cos'è
Una base di dati non è incorruttibile ed eterna, ma è soggetta a guasti di vario tipo e gravità. Il modello che si applica per la loro gestione è il cosiddetto fail-stop, che interrompe ogni transazione e provvede al ripristino del database fino a uno stato considerato sicuro. Se il guasto è riconducibile al sistema, ovvero viene perso solo il contenuto della memoria centrale e non di quelle di massa, avviene poi la cosiddetta ripresa a caldo, che rende di nuovo utilizzabile la base di dati.
Cosa fare
Assumiamo che già conosciate il significato dei simboli dei record che compongono il file di log.
Passo 1
Generalmente nell'esercizio viene fornita una porzione di un log, in particolare quella che termina con un guasto del sistema. Come prima cosa va ricercato il simbolo del checkpoint (CK()), ovvero quell'operazione attivata dal gestore dell'affidabilità che ha il compito di tener memoria delle transazioni attive. Se tra parentesi non sono indicate le transazioni attive, ma dei puntini di sospensione, bisogna ricavarsele ripercorrendo il log dall'inizio e considerando solo le operazioni di begin
Passo 2
Ora bisogna compilare un elenco delle transazioni da rifare (REDO) e da disfare (UNDO), riportandole in una tabella così strutturata:
RECORD
| UNDO
| REDO
|
...
| ...
| ...
|
Nella colonna Record andranno inserite solo quelle operazioni che indicano l'inizio (begin) o termine con successo (commit) di una transazione; gli abort non devono essere presi in considerazione.
Nella colonna UNDO e REDO devono essere riportate rispettivamente le transazioni da disfare e rifare, aggiornate per ogni record della prima colonna.
Per compilare la prima riga della tabella, si parte dal primo record di checkpoint partendo dal fondo e si riporta:
- campo RECORD: CK( insieme delle transazioni attive )
- campo UNDO: { insieme delle transazioni attive }
- campo REDO: {}
Si percorre quindi il log in avanti, e per ogni begin o commit si aggiorna la tabella.
Se ho una begin:
- campo RECORD: B( nome nuova transazione )
- campo UNDO: { transazioni già presenti + nome nuova transazione }
- campo REDO: { transazioni già presenti }
Se ho una commit:
- campo RECORD: C( nome transazione )
- campo UNDO: { transazioni già presenti - nome transazione }
- campo REDO: { transazioni già presenti + nome transazione }
Passo 3
Si termina l'esercizio riportando la sequenza delle operazioni da eseguire per ripristinare il sistema a prima del guasto (la ripresa a caldo vera e propria).
Si considera l'ultima riga della tabella realizzata al passo precedente e si distinguono due insiemi: quello delle transazioni nella colonna UNDO, e quelle nella colonna REDO. Per ognuno di essi verrà costruita una tabella che conterrà le istruzioni da eseguire per disfarne (o rifarne) le operazioni. Le due tabelle hanno la stessa struttura, ovvero:
Prima di vedere come riempire le tabelle, ricordiamo che le uniche operazioni da tenere in considerazione, e quindi riportare nella colonna Record, sono quelle di insert, update e delete.
Per compilare la tabella dell'UNDO si ripercorre il log all'indietro partendo dal fondo, e si considerano solo l'inseme delle transazioni che hanno operazioni da disfare. In particolare, se:
- campo RECORD = D(T, 0, B)
allora nel campo AZIONE andrà scritto = insert O := B
- campo RECORD = I(T, 0, A)
allora nel campo AZIONE andrà scritto = delete O
- campo RECORD = U(T, 0, B, A)
allora nel campo AZIONE andrà scritto = O := B
Notare che in questo caso di assegna all'oggetto il valore precedente (before, B).
Per compilare la tabella del REDO si percorre il log in avanti partendo dall'inizio, e si considerano solo l'inseme delle transazioni che hanno operazioni da risfare. In particolare, se:
- campo RECORD = D(T, 0, B)
allora nel campo AZIONE andrà scritto = delete O
- campo RECORD = I(T, 0, A)
allora nel campo AZIONE andrà scritto = insert O := A
- campo RECORD = U(T, 0, B, A)
allora nel campo AZIONE andrà scritto = O := A
Notare che in questo caso di assegna all'oggetto il valore successivo (after, A).
Esercizio svolto
Considerando il seguente log di un sistema di gestione di basi di dati, illustrare dettagliatamente i passi da compiere per effettuare la ripresa a caldo.
B(T1), B(T2), I(T1,O1,A1), D(T2,02,B2), B(T3), B(T4) U(T3,O3,B3,A3), C(T2), CK(...), U(T1,O4,B4,A4), A(T3), B(T5), D(T4,05,B5), C(T1), C(T4), I(T5,O6,A6), GUASTO
Soluzione
- Passo 1: individuare le transazioni attive al checkpoint
Considerando i seguenti record antecedenti il checkpoint: B(T1), B(T2), B(T3), B(T4), C(T2)
deduco che le transazioni attive sono: T1, T3 e T4
- Passo 2: compilare l'elenco delle transazioni da disfare e rifare
RECORD
| UNDO
| REDO
|
CK(T1,T3,T4)
| T1, T3, T4
|
|
B(T5)
| T1, T3, T4, T5
|
|
C(T1)
| T3, T4, T5
| T1
|
C(T4)
| T3, T5
| T1, T4
|
- Passo 3: ripristinare il sistema
Le transazioni da disfare sono T3 e T5, mentre quelle da rifare sono T1 e T4.
Riempio la tabella delle UNDO partendo dal fondo e considerando le operazioni di T3 e T5:
RECORD
| AZIONE
|
I(T5,O6,A6)
| delete O6
|
U(T3,O3,B3,A3)
| O3 := B3
|
Riempio infine la tabella delle REDO partendo dall'inizio e considerando le operazioni di T1 e T4:
RECORD
| AZIONE
|
I(T1,O1,A1)
| insert O1 := A1
|
U(T1,O4,B4,A4)
| O4 := A4
|
D(T4,O5,B5)
| delete O5
|
Nota sulla ripresa a freddo
La ripresa a freddo viene messa in atto quando al guasto del sistema si aggiunge il guasto del dispositivo. Viene realizzata in tre fasi:
- si accede al dump più recente, ovvero alla copia completa della base di dati memorizzata su qualche supporto stabile, e si ricopia la parte danneggiata del database
- si ripercorre il log in avanti ripetendo le operazioni residenti nella porzione deteriorata, quindi riportandosi nella situazione precedente al guasto
- si fa una ripresa a caldo
Torna alla pagina di Basi di Dati - Complementi