Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Βάσεις Δεδομένων ΙΙ Ενότητα 3: Ανάνηψης Βάσεων Δεδομένων Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Βάσεις Δεδομένων ΙΙ Τεχνικές Ανάνηψης
2 Επίπεδα αποθήκευσης Κυρίως μνήμη RAM, cache Ταχύτητα στην προσπέλαση Τα δεδομένα χάνονται σε περίπτωση αποτυχίας Δευτερεύουσα μνήμη Σκληρός Δίσκος, Ταινίες Πιο αργά, λόγω ηλεκτρομηχανικής κίνησης Πιο αξιόπιστα σε επίπεδο αστοχίας Υπόκεινται και αυτά σε αστοχίες όμως Στη συνέχεια, Siberschatz, Korth & Sudarsan
3 Επιπλέον επίπεδα αποθήκευσης Σταθερή αποθήκευση Π.χ., συστήματα RAID [k αντίγραφα του ιδίου αποθηκευτικού μέσου] Hard-copies
4 Αστοχίες του συστήματος Κακό πρόγραμμα (με λάθη, δηλ.) Αστοχία δοσοληψίας (αδιέξοδο, abort από τον χρήστη, κλπ) Αστοχία του συστήματος (πτώση ρεύματος, αδιέξοδο λειτουργικού συστήματος) Αστοχία υλικού (καταστροφή σκληρού δίσκου) Failure: αστοχία ή αποτυχία
5 Read & Write a b buffer buffer read(a,a ) write(b,b) A B Main Memory Οι διακεκομμένες αναπαριστούν λειτουργίες που μπορεί να καθυστερήσουν/ αγνοηθούν Dis k
6 Αστοχίες του συστήματος Κακό πρόγραμμα (με λάθη, δηλ.) Αστοχία δοσοληψίας (αδιέξοδο, abort από τον χρήστη, κλπ) Αστοχία του συστήματος (πτώση ρεύματος, αδιέξοδο λειτουργικού συστήματος) Αστοχία υλικού (καταστροφή σκληρού δίσκου) Failure: αστοχία ή αποτυχία
7 Επανάληψη: Τι πάει να πει read(a)? a είναι μια μεταβλητή του προγράμματος read(a) σημαίνει: Διάβασε από το δίσκο την αντίστοιχη με το a εγγραφή στη βάση, Φέρε την σε κάποιο buffer Αντίγραψέ την στην περιοχή μνήμης του προγράμματος
8 Επανάληψη... Hard Disk Buffer Program memory Το αντίστοιχο συμβαίνει και με τη write Όπως έχουμε πει, το a, εν γένει, δεν είναι εγγραφή, αλλά σελίδα στο δίσκο...
9 Εμείς θα ασχοληθούμε με... Αστοχίες δοσοληψίας (αδιέξοδο, abort από τον χρήστη, κλπ) Αστοχίες του συστήματος (πτώση ρεύματος, αδιέξοδο λειτουργικού συστήματος) Τα αποτελέσματα τροποποιούνται για να αντιμετωπίσουμε και αστοχίες υλικού...
10 Αυτό μεταφράζεται πρακτικά ως... Τα δεδομένα από την κυρίως μνήμη χάνονται οριστικά Τα δεδομένα που έχουν αποθηκευθεί στο σκληρό δίσκο είναι ασφαλή Η ΒΔ πιθανώς βρίσκεται σε ασυνεπή μορφή.
11 «ασυνεπή»? Κάτι μου θυμίζει... A: 150 B: 200 read(a); A := A - 50; write(a); --CRASH-- read(b); B := B + 50; write(b). A: 100 B: 200 A+B=350 A+B=300
12 Σε περίπτωση αποτυχίας... Σκοπός είναι να διατηρήσουμε τη συνέπεια του συστήματος. Πρέπει να επαναλάβουμε (REDO) όλες τις δοσοληψίες που έκαναν commit Πρέπει να αναιρέσουμε (UNDO) όσες παρενέργειες επέφεραν οι δοσοληψίες που δεν πρόλαβαν να κάνουν commit
13 Log (Ιστορικό) Log (Ιστορικό/Ίχνος/Ημερολόγιο): ένα αρχείο στο σκληρό δίσκο που καταγράφει όλη την ιστορία των ενεργειών που εκτελέστηκαν από το DBMS Ενέργειες: BOT/EOT (Begin/End Of Transaction) INS/UPD/DEL (δηλ, write) ένα record COMMIT/ABORT μια δοσοληψία UNDO/REDO μια ενέργεια εγγραφής (write)
14 Βασικές έννοιες για το Log Το log ως αρχείο είναι ένα σύνολο από εγγραφές (log records) Κάθε log record χαρακτηρίζεται μονοσήμαντα από ένα Log Sequence Number (LSN). Το σύστημα εκδίδει αυτόματα το max(lsn)+1 για κάθε νέο log record
15 Log Record τύπου Write LSN Transaction ID (TID) Σελίδα που κάνουμε update Offset στην εν λόγω σελίδα Μήκος σε bytes που αλλάζουμε Παλιά τιμή Νέα τιμή T1: UPDATE EMP SET ID = 30 WHERE ID = 3 Log Entry: LSN12,T1,PAGE32,0xFFF32,8,3,30
16 Δεν φτάνουν αυτά PrevLSN: To ακριβώς προηγούμενο LSN της ίδιας δοσοληψίας BOT (T1) LSN12,T1, PAGE32, LSN13,T1, PAGE32, BOT (T2) και τα ΕΟΤ/ΒΟΤ έχουν LSN EOT (T1) LSN16,T2, PAGE45,
17 Βασική Αρχή Write Ahead Log Προτού γράψεις οτιδήποτε στη ΒΔ, καταχώρησε την αντίστοιχη εγγραφή στο log Φυσικά υπάρχουν τεχνικές λεπτομέρειες...
18 Τι θα πει write? Hard Disk Πότε? Buffer Άμεσα Program memory Σε κάθε commit? Σε κάθε μια ενέργεια write (ασχέτως commit)? Σε τακτά χρονικά διαστήματα? Κάθε όποτε δεν έχει δουλειά το μηχάνημα?... Dirty page: σελίδα που έχει αλλαχθεί στον buffer, αλλά όχι στο σκληρό δίσκο
19 Δύο βασικοί τρόποι εγγραφής Steal: επιτρέπουμε μια σελίδα να γραφτεί στο δίσκο, χωρίς να έχει κάνει commit η δοσοληψία που την άλλαξε [No-steal, αν γράφω μόνο committed σελίδες] Force: επιβάλλουμε σε όλες τις σελίδες μιας δοσοληψίας να γραφτούν στο δίσκο, αμέσως μετά το commit [No-Force, αν κάποιες μπορεί και να μη γραφτούν]
20 Στην πράξη: Steal Γράφω μια μη commited σελίδα στο δίσκο, είτε γιατί γέμισαν οι buffers, είτε γιατί αν κάνει commit η δοσοληψία χωρίς να αλλάξει ξανά τη σελίδα κέρδισα σε χρόνο Κι αν αποτύχει η δοσοληψία? Τότε πρέπει να κάνω UNDO στην αλλαγή της σελίδας Dirty bit: κρατάω ένα bit που λέει αν η σελίδα είναι dirty ή όχι
21 Στην πράξη: No-Force Δεν γράφω μια commited σελίδα στο δίσκο, για να αποφύγω το κόστος εγγραφής (π.χ., λόγω φόρτου του συστήματος εκείνη τη στιγμή) Κι αν αποτύχει το σύστημα? Τότε πρέπει να κάνω REDO στην αλλαγή της σελίδας στο δίσκο
22 Write Ahead Log revisited Προτού γράψεις οτιδήποτε στη ΒΔ, καταχώρησε την αντίστοιχη εγγραφή στο log Για να γράψεις μια updated σελίδα από το buffer πίσω στο δίσκο, πρέπει στο log (στο δίσκο) να έχουν περαστεί οι παλιές τιμές για τα records της Για να κάνεις commit μια δοσοληψία πρέπει στο log (στο δίσκο) να έχουν γραφτεί όλες οι σχετικές log records
23 Με άλλα λόγια... ΠΡΙΝ γράψω μια σελίδα στη ΒΔ, γράφω όλα τα log records που την αφορούν στο δίσκο ΠΡΙΝ κάνω commit μια δοσοληψία, γράφω όλα τα log records που την αφορούν στο δίσκο Προσοχή: τα παραπάνω είναι περιορισμοί ορθότητας και όχι αλγόριθμος
24 Σχόλια Steal: και να πας να κλέψεις στη ΒΔ, ΔΕΝ μπορείς να κλέψεις στο log No-Force: και να μην εξαναγκάσεις τις εγγραφές της ΒΔ να γραφούν στο δίσκο, πρέπει να γραφούν όλες οι log records Μην ξεχνάτε ότι και το log περνά από buffering!
25 Και τι κέρδισα? Για να γράψεις μια updated σελίδα από το buffer πίσω στο δίσκο, πρέπει στο log (στο δίσκο) να έχουν περαστεί οι παλιές τιμές για τα records της Σε περίπτωση αποτυχίας της δοσοληψίας, μπορώ να κάνω UNDO Για να κάνεις commit μια δοσοληψία πρέπει στο log (στο δίσκο) να έχουν γραφτεί όλες οι σχετικές log records Σε περίπτωση αποτυχίας του συστήματος, μπορώ να κάνω REDO
26 Ανάνηψη με καθυστερημένη ενημέρωση Οι ενημερώσεις δεν γράφονται στη βάση μέχρι να γίνει commit η συναλλαγή Τ. T ξεκινά: Εγγραφή start στο log T κάνει commit: Εγγραφή commit στο log Όλες οι εγγραφές του log γράφονται στο δίσκο Υλοποιούνται οι πραγματικές ενημερώσεις στη ΒΔ T κάνει abort: Εγγραφή abort στο log Αγνοούνται όλες οι εγγραφές Log της T Ανάνηψη Συναλλαγές με Start και Commit στο Log ξαναγίνονται (redo) Οι άλλες αγνοούνται.
27 Ανάνηψη με άμεση ενημέρωση Οι ενημερώσεις γράφονται στη βάση όταν συμβαίνουν T ξεκινά: Εγγραφή start στο log T κάνει write: Εγγραφή update στο log Η ενημέρωση γράφεται στο Buffer και μετά στη ΒΔ T κάνει commit: Εγγραφή commit στο log T κάνει abort: Οι ενημερώσεις αναιρούνται (undo) με αντίστροφη σειρά Ανάνηψη Συναλλαγές με Start και Commit στο Log ξαναγίνονται (redo) Συναλλαγές με Start και ΌΧΙ Commit στο Log αναιρούνται (undo)
28 Checkpoints Σημεία ελέγχου Περιοδικά, το σύστημα κάνει τις εξής ενέργειες: Σταματά κάθε άλλη ενέργεια Καταγράφει το σύνολο των ενεργών δοσοληψιών Γράφει (flush) όλους τους buffers με log records, στο δίσκο Γράφει (flush) όλους τους buffers με records της ΒΔ, στο δίσκο Γράφει στο log μια εγγραφή CHK (checkpoint)
29 Οπότε το log θα δείχνει κάπως έτσι... BOT (T1) LSN12,T1, PAGE32, LSN13,T1, PAGE32, BOT (T2) EOT (T1) LSN16,T2, PAGE45, CHK {T2} {T2} είναι το σύνολο των ενεργών δοσοληψιών
30 Checkpoints Sharp checkpoint: το προαναφερθέν είδος checkpoint Fuzzy checkpoint: αντί να σταματήσει το σύστημα, γράφει μόνο ποιες είναι οι dirty pages και στέλνει την εγγραφή των σελίδων αυτών στο background. Δικαιούμαστε να ξαναπάρουμε checkpoint μόνο όταν η παρασκηνιακή διεργασία τελειώσει. Θεωρήστε sharp checkpoints
31 Ανάνηψη αν έχουμε WAL Έστω ότι το σύστημα αποτυγχάνει και πρέπει να το επαναφέρουμε (δηλ. να επαναφέρουμε τη ΒΔ σε συνεπή μορφή). Η διαδικασία αυτή ονομάζεται ανάνηψη (recovery) ή ανάκαμψη ή επαναφορά Αν έχουμε χρησιμοποιήσει WAL κατά την κανονική λειτουργία του συστήματος, η ανάνηψη έχει 3 φάσεις: 1. Ανάλυση 2. UNDO 3. REDO
32 Φάση Ανάλυσης Διαβάζουμε το log από το τελευταίο CHK ως το τέλος Ανακαλύπτουμε νικητές (winners), ήτοι, δοσοληψίες που πρόλαβαν και έκαναν commit μέσα σε αυτό το διάστημα ηττημένους (losers), ήτοι δοσοληψίες που είτε δεν πρόλαβαν να κάνουν commit, είτε οι χρήστες τους τις έκαναν abort Εντοπίζουμε τις dirty pages τη στιγμή της αποτυχίας (βλ. στη συνέχεια)
Winners & losers Time tc tf 33 T r a n s a c t i o n s T1 T2 T3 T4 Checkpoint (time tc) Source: An Introduction to Database Systems, C.J. Date, p. 381 T5 System failure (time tf)
34 Winners & losers Time tc tf T1 T2 T3 T4 δε μας αφορά winner loser Checkpoint (time tc) T5 System failure (time tf)
35 Φάση UNDO UNDO losers! Διαβάζουμε ανάποδα το log, από το τέλος προς την αρχή Κάθε πράξη που ανήκει σε δοσοληψία loser γίνεται UNDO Προσοχή: μπορεί μια loser να έχει ξεκινήσει πριν το checkpoint!
36 Φάση REDO REDO winners! Διαβάζουμε κανονικά το log, από το σημείο που κάναμε update την πιο παλιά buffer page ως το τέλος Κάθε πράξη που ανήκει σε δοσοληψία winner γίνεται REDO
37 Ανάνηψη αν έχουμε WAL CHK Αποτυχία LOG BOT παλαιότερης loser δοσοληψία UNDO Πιο παλιά dirty page ANALYSIS REDO
38 Εδώ τι θα κάναμε? Αποτυχία CHK BOT (T1) LSN12,T1, PAGE32, LSN13,T1, PAGE32, BOT (T2) EOT (T1) LSN16,T2, PAGE45,
39 Πώς εντοπίζω τις dirty pages? Έστω ότι σε κάθε σελίδα κρατάω ένα πεδίο pagelsn που καταγράφει το LSN της τελευταίας ενέργειας που έκανε update κάποιο record στη σελίδα Πώς μπορώ να βρω τις dirty pages όταν ανανήψει το σύστημα? Τι θα άλλαζε αν δεν κρατούσα αυτή την πληροφορία?
40 Ερωτήσεις κρίσεως... Πώς μπορώ να προφυλαχθώ από αποτυχίες του υλικού [με βάση όλα τα προηγούμενα]? Τι θα κέρδιζα/έχανα/άλλαζε αν πέρναγα τα updates στο δίσκο, μόνο στο commit [και όχι πιο πριν]? Τι θα κέρδιζα/έχανα/άλλαζε αν έκανα υποχρεωτικώς flush τις dirty pages στο commit?
41 Ερωτήσεις κρίσεως Τι θα γίνει αν κατά τη διάρκεια της ανάνηψης το σύστημα αποτύχει ξανά? Τι θα άλλαζε αν αντί για [παλιά τιμή,νέα τιμή] στο log record έγραφα [παλιά τιμή,διαφορά]? Έχει σημασία η σειρά των UNDO και REDO? Μέσα σε κάθε μια από αυτές τις φάσεις, έχει σημασία η σειρά?
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό. Οι όροι χρήσης των έργων τρίτων επεξηγούνται στη διαφάνεια «Επεξήγηση όρων χρήσης έργων τρίτων». Τα έργα για τα οποία έχει ζητηθεί άδεια αναφέρονται στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/από-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί.
Επεξήγηση όρων χρήσης έργων τρίτων διαθέσιμο με άδεια CC-BY διαθέσιμο με άδεια CC-BY-SA διαθέσιμο με άδεια CC-BY-ND διαθέσιμο με άδεια CC-BY-NC διαθέσιμο με άδεια CC-BY-NC-SA διαθέσιμο με άδεια CC-BY-NC-ND διαθέσιμο με άδεια CC0 Public Domain διαθέσιμο ως κοινό κτήμα χωρίς σήμανση Δεν επιτρέπεται η επαναχρησιμοποίηση του έργου, παρά μόνο εάν ζητηθεί εκ νέου άδεια από το δημιουργό. Επιτρέπεται η επαναχρησιμοποίηση του έργου και η δημιουργία παραγώγων αυτού με απλή αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού, και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η δημιουργία παραγώγων του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου και η δημιουργία παραγώγων του. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Συνήθως δεν επιτρέπεται η επαναχρησιμοποίηση του έργου.
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους.
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.