sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Where stored the last checkpoint operation info

Antonios Chatzipavlis
Tuesday 16 December 2014

Στο μάθημα της προηγούμενης εβδομάδας δέχθηκα μια ερώτηση από ένα πολύ καλό φίλο και συνάδελφο (καλημέρα Θεόδωρε) μια αρκετά ενδιαφέρουσα ερώτηση που αφορούσε το που αποθηκεύεται η πληροφορία της διαδικασίας του checkpoint σε μια database.

Επειδή η απάντηση μου τον ξάφνιασε λίγο σε αυτό το post αρχικά θα την μοιραστώ μαζί σας και θα την εξηγήσω.

Είναι αρκετά εύκολο να εντοπίσεις το πότε έχει γίνει checkpoint καθώς για αυτό καταγράφεται το LSN (Log Sequence Number) του στην boot page (page #9) που υπάρχει στο πρώτο data file της κάθε database.

Για να δεις τα περιεχόμενα της συγκεκριμένης σελίδας μπορείς να το κάνεις με την χρήση της DBCC PAGE ή να χρησιμοποιήσεις την DBCC DBINFO
Καλώντας την DBCC DBINFO ως εξής

DBCC DBINFO(‘<DBNAME>’) WITH TABLERESULTS

στα αποτελέσματα που θα πάρουμε ψάχνουμε να βρούμε το dbi_checkptLSN το οποίο περιέχει το checkpoint LSN.

O SQL Server όταν ξεκινάει, όπως είναι γνωστό, πάει σε κάθε database και διαβάσει την boot page και το συγκεκριμένο field ώστε να ξεκινήσει την διαδικασία του recovery στο οποίο ότι transaction είναι ολοκληρωμένο και δεν υπάρχει στα data pages θα το κάνει redo  και ότι δεν είναι ολοκληρωμένο θα το κάνει undo.

Όπως έχω πει και γράψει στο παρελθόν η σημασία της boot page είναι αρκετά μεγάλη για τη database και από εκεί ξεκινάει πάντα ο SQL Server.
Θα πρέπει όμως να αναφερθώ και στο transaction log καθώς, ίσως, κάποιος που γνωρίζει πως να το διαβάσει μπορεί να μπερδευτεί και να πιστέψει ότι εκεί γράφεται η συγκεκριμένη πληροφορία.

Πράγματι αν κάποιος διαβάσει το transaction log μιας database χρησιμοποιώντας την fn_dblog θα εντοπίσει records που αναφέρονται στο checkpoint. Είναι αυτά που στο field Operation που η εκτέλεση της fn_dblog επιστρέφει υπάρχει η τιμή LOP_BEGIN_CKPT. Αν συγκρίνει την τιμή του LSN που υπάρχει στο τελευταίο στην σειρά record στο field Current LSN με το dbi_checkptLSN που έχει πάρει από την DBCC DBINFO θα δει ότι είναι το ίδιο.

Από αυτό είναι εύκολο κανείς να παραπλανηθεί και πιστέψει ότι ο SQL Server για να κάνει τη διαδικασία recovery ψάχνει το transaction log. Φυσικά δεν το κάνει καθώς αυτό θα απαιτούσε την σειριακή ανάγνωση του transaction log και αυτό όπως είναι εύκολα κατανοητό θα απαιτούσε χρόνο. Εκτός από αυτό υπάρχει και η περίπτωση που το transaction log μπορεί να είναι χαλασμένο οπότε δεν μπορεί να βασιστεί σε αυτό.

Βέβαια μπορεί κάποιος να πει ότι και η boot page μπορεί να είναι χαλασμένη αλλά αυτό είναι μια άλλη διαδικασία που δεν θα αναφερθώ σε αυτή στο post αυτό.

Γιατί όμως υπάρχει το συγκεκριμένο record στο transaction log;

Η απάντηση σε αυτό το ερώτημα είναι απλή ή θα προσπαθήσω να την κάνω απλή στις γραμμές  που ακολουθούν.
Το συγκεκριμένο record υπάρχει στο transaction log με σκοπό να εξυπηρετήσει την ανάγκη που υπάρχει και αφορά το ότι πρέπει να γνωρίζουμε ποια είναι τα transaction που ήταν σε εξέλιξη την στιγμή που έγινε το checkpoint. Μην ξεχνάτε ότι στο transaction log γράφονται όλα σειριακά οπότε…

Αν για παράδειγμα υπάρχει μόνο ένα session πάνω στην database και το οποίο εκτελέσει την εντολή CHECKPOINT με την οποία μπορώ να κάνω force την διαδικασία και αμέσως  μετά  να δει με την fn_dblog το transaction log και πάει στο τελευταίο record που έχει την τιμή LOP_BEGIN_CKPT θα δει ότι το επόμενο record θα έχει τιμή LOP_END_CKPT το οποίο και σηματοδοτεί την λήξη του checkpoint.

Αν μεταξύ ενός LOP_BEGIN_CKPT και LOP_END_CKPT δούμε record που έχει την τιμή LOP_XACT_CKPT αυτό σημαίνει ότι υπάρχουν ενεργά transactions κατά την διάρκεια του checkpoint ώστε να χρησιμοποιηθεί στην διαδικασία του recovery process.

Δεν θα επεκταθώ περισσότερο καθώς αυτό είναι εκτός θέματος για το συγκεκριμένο post και όπως έχω πει αρκετές φορές υπάρχει ένας θαυμαστός κόσμος στο transaction log που δεν περιγράφεται ούτε με εγκυκλοπαίδεια.


image

/*antonch*/

Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.

Tip

What's New in SQL Server 2022 - Episodes

More Tips...

Become a member

If you want to receive updates from us become a member to our community.

Connect

Explore

Learn


sqlschool.gr © 2010-2024 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.