Συμπτώματα
Όταν χρησιμοποιείτε κατοπτρισμό βάσης δεδομένων στον Microsoft SQL Server 2012 ή στον Microsoft SQL Server 2014, ενδέχεται να πατήσετε μια συνθήκη διεκδίκησης και η δημιουργία ειδώλου βάσης δεδομένων εισέρχεται σε κατάσταση αναστολής.
Αιτία
Το πρόβλημα παρουσιάζεται επειδή, κατά την εκχώρηση μιας νέας σελίδας, ο SQL Server αποκτά ένα κλείδωμα X στη νέα σελίδα. Ο SQL Server θα τοποθετήσει το hobt_id (heap ή B-Tree ID) στο οποίο η νέα σελίδα ανήκει στην αίτηση κλειδώματος. Ωστόσο, ο SQL Server δεν μπορεί να τοποθετήσει το hobt_id σε κατοπτρισμό αρχείου καταγραφής και έχει ως αποτέλεσμα διαφορετική συμπεριφορά κλειδώματος μεταξύ του πρωτεύοντος και του ειδώλου. Αυτό μπορεί να εξηγηθεί λεπτομερώς ως εξής:
-
T1 κρατήστε πατημένο ένα κλείδωμα IX στη σελίδα P1.
-
T2 κάντε μια σελίδα διαιρεμένη στο P1, εκχωρήστε μια νέα σελίδα P2, μια συναλλαγή συστήματος TX χρησιμοποιείται εδώ, κρατάει ένα X Lock στο P2. Εδώ ο SQL Server δεν τοποθέτησε το hobt_id στο αρχείο καταγραφής κατοπτρισμού.
-
Το TX κάνει μια μετεγκατάσταση κλειδώματος για το Τ1 για να μετακινήσει το κλείδωμα IX από το P1 στο P2.
-
Δεσμευμένος TX, τώρα ο T2 μπορεί να χρησιμοποιήσει τη σελίδα P2 και το T2 να αποκτήσει ένα άλλο κλείδωμα IX στη σελίδα P2.
-
Ο T1 έχει δεσμευτεί, τώρα ο T2 είναι ο μόνος που κατέχει ένα κλείδωμα IX στο P2.
-
Μετά την τοποθέτηση πολλών τοποθετήσεων, εμφανίζεται μια κλιμάκωση κλειδώματος, στον πρωτεύοντα, ο T2 απελευθερώνει το ΙΧ στο P2, αλλά στον καθρέφτη, κατά τη διάρκεια της κλιμάκωσης κλειδώματος, το T2 δεν απελευθέρωσε το κλείδωμα IX.
-
Μετά τη μεγάλη διαγραφή, η σελίδα P2 έγινε κενή και έχει αποδεσμευτεί.
-
Το T3 χρειάζεται μια νέα σελίδα και συμβαίνει να εκχωρείται P2, αυτό απαιτεί κλείδωμα X, αλλά στο είδωλο, αυτό το βήμα απέτυχε λόγω του βήματος 6.
Στο είδωλο, το βήμα 6 δεν απελευθερώνει το κλείδωμα IX, επειδή το hobt_id στο μπλοκ κλειδώματος είναι εσφαλμένο. Αυτή η εσφαλμένη hobt_id έρχεται κατά τη διάρκεια του βήματος 2 και επειδή ο SQL Server δεν τοποθετεί το hobt_id στο αρχείο καταγραφής κατοπτρισμού. συνήθως δεν βλέπετε κανένα πρόβλημα, επειδή το TX στο βήμα 2 είναι πολύ σύντομο και το κλείδωμα μπλοκ με εσφαλμένο hobt_id θα κυκλοφορήσει όταν δεσμευτεί. Ωστόσο, εξαιτίας της μετεγκατάστασης κλειδώματος στο βήμα και τα παρακάτω βήματα (4 και 5), αυτό το μπλοκ κλειδώματος με εσφαλμένο hobt_id διατηρείται και, τέλος, προκαλεί το πρόβλημα. Το πρωτεύον δεν έχει αυτό το πρόβλημα, επειδή χρησιμοποιεί ένα σωστό hobt_id στο βήμα 2. Ωστόσο, η εγγραφή του αρχείου καταγραφής δεν έχει σωστές hobt_id.
Επίλυση
Το πρόβλημα διορθώθηκε για πρώτη φορά με την ακόλουθη αθροιστική ενημέρωση του SQL Server.
Αθροιστική ενημερωμένη έκδοση 1 για τον SQL Server 2014 /en-us/help/2931693
Αθροιστική ενημερωμένη έκδοση 9 για SQL Server 2012 SP1 /en-us/help/2931078
Κάθε νέα αθροιστική ενημέρωση για τον SQL Server περιέχει όλες τις επείγουσες επιδιορθώσεις και όλες τις επιδιορθώσεις ασφαλείας που συμπεριλήφθηκαν στην προηγούμενη αθροιστική ενημέρωση. Ανάληψη ελέγχου των πιο πρόσφατων αθροιστικών ενημερώσεων για τον SQL Server:
Λύση
Για να επιλύσετε αυτό το πρόβλημα, προετοιμάστε ξανά το είδωλο για να τερματίσετε την κατάσταση αναστολής.
Κατάσταση
Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα πρόβλημα στα προϊόντα της Microsoft που παρατίθενται στην ενότητα "ισχύει για".