©Silberschatz, Korth and Sudarshan1ΒΔ ΙΙ: Σύστημα επαναφοράς Σύστημα Επαναφοράς (Recovery System) Κατηγοριοποίηση αποτυχιών/βλαβών Δομή αποθήκευσης Επαναφορά και ατομικότητα Επαναφορά βασισμένη στο ιστορικό (ή ημερολόγιο, Log) του συστήματος Πηγή: Silberschatz et al., “Database System Concepts”, 4 th ed. (Chapter 17) Μετάφραση στα Ελληνικά: © Γιάννης Θεοδωρίδης,
©Silberschatz, Korth and Sudarshan2ΒΔ ΙΙ: Σύστημα επαναφοράς Κατηγοριοποίηση αποτυχιών Αποτυχία συναλλαγής : Λογικά λάθη: η συναλλαγή δε μπορεί να ολοκληρωθεί εξαιτίας λάθους κάποιας εσωτερικής συνθήκης. Λάθη συστήματος: το σύστημα της βάσης δεδομένων πρέπει να τερματίσει μια ενεργή συναλλαγή εξαιτίας μιας λανθασμένης συνθήκης (π.χ. αδιέξοδο). Κατάρρευση συστήματος (system crash): μια απώλεια ισχύος ή κάποια άλλη αποτυχία λογισμικού ή υλικού προκαλεί ένα system crash. Υπόθεση Fail-stop: τα περιεχόμενα της μόνιμης αποθήκευσης υποθέτουμε πως δε διαφθείρονται από ένα system crash. Τα συστήματα βάσεων δεδομένων έχουν πολυάριθμους ελέγχους ακεραιότητας για την αποτροπή φθοράς των δεδομένων του δίσκου. Αποτυχία του δίσκου: μια καταστροφή της κεφαλής ή παρόμοια αποτυχία του δίσκου καταστρέφει ολόκληρο ή ένα μέρος της αποθηκευμένης πληροφορίας στο δίσκο. Η καταστροφή υποθέτουμε πως μπορεί να εντοπιστεί: τα συστήματα δίσκων χρησιμοποιούν αθροίσματα ελέγχου (checksums) για να εντοπίσουν τις αποτυχίες.
©Silberschatz, Korth and Sudarshan3ΒΔ ΙΙ: Σύστημα επαναφοράς Αλγόριθμοι επαναφοράς Οι αλγόριθμοι επαναφοράς είναι τεχνικές που εγγυώνται τη συνέπεια της βάσης δεδομένων και την ατομικότητα και τη μονιμότητα μιας συναλλαγής παρά τις οποιεσδήποτε αποτυχίες. Οι αλγόριθμοι επαναφοράς έχουν δύο μέρη: 1. Δράσεις που αναπτύσσονται κατά τη διάρκεια της εκτέλεσης των συναλλαγών για να εγγυηθούν την ύπαρξη επαρκούς πληροφορίας για την επαναφορά από αποτυχίες. 2. Δράσεις που αναπτύσσονται μετά από μία αποτυχία για την επαναφορά των περιεχομένων της βάσης σε μια κατάσταση που εγγυάται την ατομικότητα, συνέπεια και μονιμότητα.
©Silberschatz, Korth and Sudarshan4ΒΔ ΙΙ: Σύστημα επαναφοράς Δομή αποθήκευσης Ασταθής (volatile) αποθήκευση: Δεν επιβιώνει μετά από system crashes. Παραδείγματα: κύρια μνήμη, μνήμη cache. Σταθερή (non-volatile) αποθήκευση: Επιβιώνει μετά από system crashes. Παραδείγματα: δίσκοι, ταινίες, μνήμη flash, μόνιμη (battery backed up) RAM. Ακλόνητη (stable) αποθήκευση: Μια “μυθική” μορφή αποθήκευσης που επιβιώνει μετά από όλες τις αποτυχίες. Προσεγγίζεται συντηρώντας πολλαπλά αντίγραφα σε διακριτά μόνιμα μέσα.
©Silberschatz, Korth and Sudarshan5ΒΔ ΙΙ: Σύστημα επαναφοράς Προσπέλαση δεδομένων (1) Τα φυσικά blocks είναι εκείνα τα blocks που βρίσκονται στο δίσκο. Τα Buffer blocks είναι εκείνα τα blocks που βρίσκονται προσωρινά στην κύρια μνήμη. Οι μετακινήσεις των blocks μεταξύ της κυρίας μνήμης και του δίσκου ξεκινούν μέσω των ακόλουθων δύο λειτουργιών: input(B): μεταφέρει το φυσικό block B στην κύρια μνήμη. output(B): μεταφέρει το buffer block B στο δίσκο και αντικαθιστά εκεί το κατάλληλο φυσικό block. Κάθε συναλλαγή T i έχει τη δική της ιδιωτική περιοχή λειτουργίας, στην οποία φυλάσσονται τοπικά αντίγραφα από όλα τα αντικείμενα δεδομένων που προσπελαύνονται και ενημερώνονται από αυτήν. Το τοπικό αντίγραφο του αντικειμένου Χ που ανήκει στην T i καλείται x i. Υποθέτουμε, για απλοποίηση, ότι κάθε αντικείμενο δεδομένων χωρά σε ένα απλό block και αποθηκεύεται μέσα σε αυτό.
©Silberschatz, Korth and Sudarshan6ΒΔ ΙΙ: Σύστημα επαναφοράς Προσπέλαση δεδομένων (2) Η συναλλαγή μεταφέρει αντικείμενα δεδομένων μεταξύ των buffer blocks του συστήματος και της ιδιωτικής περιοχής λειτουργίας της με χρήση των ακόλουθων λειτουργιών: read(X): αναθέτει την τιμή του αντικειμένου δεδομένων X στην τοπική μεταβλητή x i. write(X): αναθέτει την τιμή της τοπικής μεταβλητής x i στο αντικείμενο δεδομένων {X} στο buffer block. Και οι δυο αυτές εντολές μπορεί να επιβάλλουν την εισαγωγή μιας εντολής input(B X ) πριν την ανάθεση, εάν το block B X στο οποίο ανήκει το X δεν είναι ήδη στη μνήμη. Οι συναλλαγές Εκτελούν την read(X) όταν προσπελαύνουν το X για πρώτη φορά. Όλες οι επακόλουθες προσπελάσεις γίνονται στο τοπικό αντίγραφο. Μετά την τελευταία προσπέλαση, η συναλλαγή εκτελεί την write(X). Η output(B X ) δε χρειάζεται να ακολουθεί αμέσως την write(X). Το σύστημα μπορεί να εκτελέσει την output λειτουργία, όταν θεωρεί πως πρέπει.
©Silberschatz, Korth and Sudarshan7ΒΔ ΙΙ: Σύστημα επαναφοράς Παράδειγμα προσπέλασης δεδομένων x Y A B x1x1 y1y1 buffer Buffer Block A Buffer Block B input(A) output(B) read(X) write(Y) δίσκος χώρος λειτουργίας της T 1 χώρος λειτουργίας της T 2 μνήμη x2x2
©Silberschatz, Korth and Sudarshan8ΒΔ ΙΙ: Σύστημα επαναφοράς Επαναφορά και ατομικότητα (1) Η τροποποίηση της βάσης χωρίς εγγύηση ότι η συναλλαγή θα επικυρωθεί μπορεί να αφήσει τη βάση δεδομένων σε μια ασυνεπή κατάσταση. Θεωρήστε τη συναλλαγή T i που μεταφέρει $50 από το λογαριασμό A στο λογαριασμό B. Ο στόχος είναι είτε να πραγματοποιηθούν όλες οι τροποποιήσεις στη βάση που γίνονται από την T i ή καμιά από αυτές. Μπορεί να απαιτούνται πολλαπλές λειτουργίες εξόδου για την T i (για την εξαγωγή των A και B). Μια αποτυχία μπορεί να συμβεί αφού έχει γίνει μια από αυτές τις τροποποιήσεις, αλλά πριν γίνουν όλες.
©Silberschatz, Korth and Sudarshan9ΒΔ ΙΙ: Σύστημα επαναφοράς Επαναφορά και ατομικότητα (2) Για να εγγυηθούμε για την ατομικότητα παρά τις πιθανές αποτυχίες, εξάγουμε πρώτα πληροφορία που περιγράφει τις τροποποιήσεις στην ακλόνητη αποθήκευση χωρίς να τροποποιείται η ίδια η βάση. Μελετάμε την εξής προσέγγιση: Επαναφορά βασισμένη στο ιστορικό του συστήματος (Log) Υποθέτουμε (αρχικά) ότι οι συναλλαγές εκτελούνται σειριακά, δηλαδή η μία μετά την άλλη.
©Silberschatz, Korth and Sudarshan10ΒΔ ΙΙ: Σύστημα επαναφοράς Επαναφορά βασισμένη στο ιστορικό συστήματος (1) Ένα ιστορικό συστήματος (log) φυλάσσεται στην ακλόνητη αποθήκευση. Το ιστορικό συστήματος είναι μια ακολουθία από εγγραφές ιστορικού και συντηρεί μια καταγραφή των ενημερώσεων που έγιναν στη βάση. Όταν μια συναλλαγή T i ξεκινά, καταχωρεί τον εαυτό της στο ιστορικό γράφοντας μια εγγραφή ιστορικού. Πριν η T i εκτελέσει την λειτουργία write(X), προστίθεται μια εγγραφή στο ιστορικό, όπου V 1 είναι η τιμή του X πριν τη γραφή και V 2 είναι η τιμή που πρόκειται να γραφεί στο X. Η εγγραφή ιστορικού σημειώνει ότι ότι η T i έχει εκτελέσει μια γραφή στο αντικείμενο δεδομένων X j. Το X j είχε τιμή V 1 πριν τη γραφή και θα έχει τιμή V 2 μετά τη γραφή.
©Silberschatz, Korth and Sudarshan11ΒΔ ΙΙ: Σύστημα επαναφοράς Επαναφορά βασισμένη στο ιστορικό συστήματος (2) Όταν η T i ολοκληρώσει και την τελευταία της εντολή, γράφεται στο ιστορικό η εγγραφή. Υποθέτουμε για την ώρα ότι οι εγγραφές ιστορικού γράφονται απευθείας στην ακλόνητη αποθήκευση (δηλαδή δεν τοποθετούνται σε έναν buffer). Δυο προσεγγίσεις με χρήση ιστορικού: Ετεροχρονισμένη τροποποίηση της βάσης. Άμεση τροποποίηση της βάσης.
©Silberschatz, Korth and Sudarshan12ΒΔ ΙΙ: Σύστημα επαναφοράς Ετεροχρονισμένη τροποποίηση της βάσης (1) Το σχήμα ετεροχρονισμένης τροποποίησης μιας βάσης δεδομένων καταγράφει όλες τις τροποποιήσεις στο ιστορικό, αλλά καθυστερεί όλες τις γραφές στη βάση έως ότου η συναλλαγή επικυρωθεί μερικώς. Υποθέτει ότι οι συναλλαγές εκτελούνται σειριακά. Η συναλλαγή ξεκινά γράφοντας την εγγραφή στο ιστορικό. Μια λειτουργία write(X) προκαλεί την προσθήκη στο ιστορικό μιας εγγραφής, όπου V είναι η νέα τιμή για το X. Σημείωση: η παλιά τιμή δε χρειάζεται για αυτό το σχήμα. Η γραφή στο X δε γίνεται αυτή τη στιγμή, αλλά αναβάλλεται. Όταν η T i επικυρώνεται μερικώς, η εγγραφή γράφεται στο ιστορικό. Τέλος, οι εγγραφές του ιστορικού διαβάζονται και χρησιμοποιούνται για την πραγματική εκτέλεση των προηγούμενων γραφών που έχουν αναβληθεί.
©Silberschatz, Korth and Sudarshan13ΒΔ ΙΙ: Σύστημα επαναφοράς Ετεροχρονισμένη τροποποίηση της βάσης (2) Κατά τη διάρκεια της επαναφοράς μετά από ένα crash, μια συναλλαγή χρειάζεται να εκτελεστεί ξανά αν και μόνο αν και η και η υπάρχουν στο ιστορικό. Η εκ νέου εκτέλεση μιας συναλλαγής T i (redoT i ) θέτει την τιμή όλων των αντικειμένων δεδομένων που ενημερώνονται από τη συναλλαγή στις νέες τιμές. Αποτυχίες συστήματος μπορούν να συμβούν ενώ: Η συναλλαγή εκτελεί τις αρχικές ενημερώσεις, ή Εκτελείται η διαδικασία επαναφοράς. Παράδειγμα συναλλαγών T 0 and T 1 (η T 0 εκτελείται πριν T 1 ): T 0 : read (A)T 1 : read (C) A: - A - 50 C:-C- 100 Write (A) write (C) read (B) B:- B + 50 write (B)
©Silberschatz, Korth and Sudarshan14ΒΔ ΙΙ: Σύστημα επαναφοράς Ετεροχρονισμένη τροποποίηση της βάσης (3) Παρακάτω δείχνουμε το ιστορικό όπως εμφανίζεται σε τρεις χρονικές στιγμές. Εάν τη στιγμή της αποτυχίας το ιστορικό στην ακλόνητη αποθήκευση είναι όπως στην περίπτωση: (a) καμιά επανεκτέλεση δε χρειάζεται. (b) η redo(T 0 ) πρέπει να εκτελεστεί αφού η είναι παρούσα. (c) η redo(T 0 ) πρέπει να εκτελεστεί ακολουθούμενη από την redo(T 1 ) αφού οι και είναι παρούσες.
©Silberschatz, Korth and Sudarshan15ΒΔ ΙΙ: Σύστημα επαναφοράς Άμεση τροποποίηση της βάσης (1) Το σχήμα άμεσης τροποποίησης μιας βάσης δεδομένων επιτρέπει οι ενημερώσεις της βάσης από μια μη επικυρωμένη συναλλαγή να γίνονται αμέσως μόλις εκτελεστούν οι αντίστοιχες εντολές γραφής. Αφού μπορεί να χρειαστεί κάποια ακύρωση, τα ενημερωμένα ιστορικά πρέπει να έχουν και την παλιά τιμή και τη νέα τιμή. Η ενημέρωση της εγγραφής του ιστορικού πρέπει να γίνει πριν ενημερωθεί το αντικείμενο της βάσης δεδομένων. Υποθέτουμε ότι η εγγραφή του ιστορικού εξάγεται αμέσως στην ακλόνητη αποθήκευση. Η έξοδος ενημερωμένων blocks μπορεί να λάβει χώρα οποιαδήποτε στιγμή πριν ή μετά την επικύρωση μιας συναλλαγής. Η σειρά με την οποία εξάγονται τα blocks μπορεί να είναι διαφορετική από τη σειρά με την οποία γράφονται.
©Silberschatz, Korth and Sudarshan16ΒΔ ΙΙ: Σύστημα επαναφοράς Παράδειγμα άμεσης τροποποίησης της βάσης Ιστορικό Γραφή Έξοδος T o, B, 2000, 2050 A = 950 B = 2050 C = 600 B B, B C B A Σημείωση: το B X δηλώνει το block που περιέχει το X. x1x1
©Silberschatz, Korth and Sudarshan17ΒΔ ΙΙ: Σύστημα επαναφοράς Άμεση τροποποίηση της βάσης (2) Η διαδικασία επαναφοράς έχει δυο λειτουργίες αντί μίας: undo(T i ): επαναφέρει όλα τα αντικείμενα δεδομένων που ενημερώθηκαν από την T i στις παλιές τους τιμές, πηγαίνοντας προς τα πίσω από την τελευταία εγγραφή του ιστορικού για την T i redo(T i ): θέτει όλα τα αντικείμενα δεδομένων που ενημερώθηκαν από την T i στις νέες τιμές, πηγαίνοντας προς τα εμπρός από την πρώτη εγγραφή του ιστορικού για την T i. Και οι δυο λειτουργίες πρέπει να είναι μοναδιαίες (idempotent), δηλαδή, ακόμα και αν η λειτουργία εκτελείται πολλές φορές, το αποτέλεσμα είναι το ίδιο σαν να εκτελούνταν μια φορά. Απαραίτητο, αφού οι λειτουργίες μπορεί να εκτελεστούν εκ νέου κατά τη διάρκεια της επαναφοράς. Κατά την επαναφορά μετά από μια αποτυχία: Η συναλλαγή T i χρειάζεται να ακυρωθεί, εάν το ιστορικό περιέχει την εγγραφή, αλλά δεν περιέχει την εγγραφή. Η συναλλαγή T i χρειάζεται να εκτελεστεί εκ νέου, εάν το ιστορικό περιέχει και την εγγραφή και την εγγραφή. Οι ακυρώσεις των λειτουργιών προηγούνται των εκ νέου εκτελέσεων των λειτουργιών.
©Silberschatz, Korth and Sudarshan18ΒΔ ΙΙ: Σύστημα επαναφοράς Παράδειγμα επαναφοράς άμεσης τροποποίησης βάσης Παρακάτω δείχνουμε το ιστορικό όπως εμφανίζεται σε τρεις χρονικές στιγμές. Οι ενέργειες επαναφοράς σε καθεμιά από τις παραπάνω περιπτώσεις είναι: (a) undo (T 0 ): Το B επαναφέρεται στο 2000 και το A στο (b) undo (T 1 ) και redo (T 0 ): Το C επαναφέρεται στο 700 και μετά τα A και B τίθενται στο 950 και 2050 αντιστοίχως. (c) redo (T 0 ) και redo (T 1 ): Τα A και B τίθενται στο 950 και 2050 αντιστοίχως. Στη συνέχεια, το C γίνεται 600.
©Silberschatz, Korth and Sudarshan19ΒΔ ΙΙ: Σύστημα επαναφοράς Σημεία ελέγχου (1) - Checkpoints Τα προβλήματα της διαδικασίας επαναφοράς που συζητήσαμε προηγουμένως: 1. Η σάρωση όλου του ιστορικού είναι χρονοβόρα. 2. Μπορεί χωρίς λόγο να εκτελέσουμε εκ νέου συναλλαγές οι οποίες ήδη έχουν εξάγει τα αποτελέσματά τους στη βάση. Απλοποίηση της διαδικασίας επαναφοράς εκτελώντας περιοδικά ελέγχους σε προκαθορισμένα σημεία ελέγχου (check points) 1. Έξοδος όλων των εγγραφών του ιστορικού που βρίσκονται επί του παρόντος στην κύρια μνήμη στην ακλόνητη αποθήκευση. 2. Έξοδος όλων των τροποποιημένων buffer blocks στο δίσκο. 3. Γράψιμο μιας εγγραφής του ιστορικού στην ακλόνητη αποθήκευση.
©Silberschatz, Korth and Sudarshan20ΒΔ ΙΙ: Σύστημα επαναφοράς Σημεία ελέγχου (2) Κατά τη διάρκεια της επαναφοράς πρέπει να θεωρήσουμε μόνο την πιο πρόσφατη συναλλαγή T i που ξεκίνησε πριν το σημείο ελέγχου και τις συναλλαγές που ξεκίνησαν μετά την T i. 1. Εξετάστε προς τα πίσω από το τέλος του ιστορικού για να βρείτε την πιο πρόσφατη εγγραφή. 2. Συνεχίστε ψάχνοντας προς τα πίσω μέχρι να βρεθεί μια εγγραφή. 3. Πρέπει να θεωρήσετε μόνο το τμήμα του ιστορικού που ακολουθεί την παραπάνω start εγγραφή. Το προηγούμενο τμήμα του ιστορικού μπορεί να αγνοηθεί κατά τη διάρκεια της επαναφοράς και μπορεί να διαγραφεί όποτε αυτό είναι επιθυμητό. 4. Για όλες τις συναλλαγές (ξεκινώντας από την T i ή έπειτα) χωρίς, εκτελέστε undo(T i ). (Αυτό γίνεται μόνο στην περίπτωση άμεσης τροποποίησης.) 5. Εξετάζοντας προς τα εμπρός το ιστορικό, για όλες τις συναλλαγές που ξεκινούν από την T i ή έπειτα με ένα, εκτελέστε redo(T i ).
©Silberschatz, Korth and Sudarshan21ΒΔ ΙΙ: Σύστημα επαναφοράς Παράδειγμα σημείων ελέγχου Η συναλλαγή T 1 μπορεί να αγνοηθεί (οι ενημερώσεις έχουν ήδη εξαχθεί στο δίσκο εξαιτίας του σημείου ελέγχου). Οι συναλλαγές T 2 και T 3 επανεκτελούνται. Η συναλλαγή T 4 ακυρώνεται. TcTc TfTf T1T1 T2T2 T3T3 T4T4 Σημείο ελέγχου Αποτυχία συστήματος