Torna alla pagina di Basi di Dati - Complementi
:: Basi di Dati - Complementi ::
Esercizi: Ripresa a caldo
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.
Assumiamo che già conosciate il significato dei simboli dei record che compongono il file di log.
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
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:
Si percorre quindi il log in avanti, e per ogni begin o commit si aggiorna la tabella.
Se ho una begin:
Se ho una commit:
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:
RECORD | AZIONE |
... | ... |
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:
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:
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
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 |
RECORD | AZIONE |
I(T5,O6,A6) | delete O6 |
U(T3,O3,B3,A3) | O3 := B3 |
RECORD | AZIONE |
I(T1,O1,A1) | insert O1 := A1 |
U(T1,O4,B4,A4) | O4 := A4 |
D(T4,O5,B5) | delete O5 |
La ripresa a freddo viene messa in atto quando al guasto del sistema si aggiunge il guasto del dispositivo. Viene realizzata in tre fasi: