go backsqlschool blogs list

The DB STARTUP command

by Sotiris Karras

Πρόσφατα, σε ένα παραγωγικό περιβάλλον εμφανίστηκε ένα πρόβλημα με μεγάλης διάρκειας PAGEIOLATCH_EX latches, σε έναν μεγάλου μεγέθους πίνακα, τα οποία τελικά προκαλούσαν αδυναμία εκτέλεσης CRUD operations πάνω σε αυτόν.

Ψάχνοντας τα αίτια του προβλήματος, ξεκινήσαμε από την sp_who2 για να βρούμε το session το οποίο προκαλούσε το blocking και στην συνέχεια να βρούμε το προβληματικό transaction.

Αυτό όμως που τελικά διαπιστώσαμε, ήταν ότι δεν υπήρχαν blocked sessions αλλά υπήρχε ένα DB STARTUP command το οποίο εκτελούνταν στην βάση.

 

Status      Login    BlkBy  DBName    Command          CPUTime DiskIO
-----------------------------------------------------------------------
BACKGROUND  sa       .      NULL      LOG WRITER       31      0
BACKGROUND  sa       .      NULL      RECOVERY WRITER  0       0
BACKGROUND  sa       .      NULL      LAZY WRITER      0       0
BACKGROUND  sa       .      NULL      LOCK MONITOR     0       0
BACKGROUND  sa       .      master    DB STARTUP       46      400
BACKGROUND  sa       .      master    BRKR TASK        0       0
sleeping    sa       .      master    TASK MANAGER     0       0
BACKGROUND  sa       .      master    TRACE QUEUE TASK 0       0
BACKGROUND  sa       .      master    CHECKPOINT       0       0
BACKGROUND  sa       .      NULL      UNKNOWN TOKEN    0       0
BACKGROUND  sa       .      master    BRKR TASK        0       40
BACKGROUND  sa       .      master    BRKR TASK        0       0
BACKGROUND  sa       .      master    BRKR TASK        16      55
BACKGROUND  sa       .      master    BRKR TASK        15      168
BACKGROUND  sa       .      DBXXX     DB STARTUP       3478    55777


Το DB STARTUP command είναι αυτό που εκτελείται από τον SQL Server κατά το recovery μίας database από το log.

Επίσης, εκτελώντας ένα read uncommitted count(*) στον πίνακα που είχε το πρόβλημα, διαπιστώθηκε πως ο αριθμός των εγγραφών του αυξανόταν συνεχώς. Εκεί η αιτία του πρόβληματος, καθώς και η επίλυσή του έγιναν ξεκάθαρες  και το μόνο που χρειάστηκε ήταν η επικοινωνία με τον πελάτη για να επιβεβαιωθεί.

Αυτό που συνέβη ήταν το εξής:

Στα πλαίσια ενός datafix, ανοίχτηκε ένα transaction για το deletion 20 εκατομμυρίων  records από τον πίνακα. Κατά την διάρκεια του transaction υπήρξε power outage και έγινε restart το service του SQL Server. Επειδή το transaction του deletion ΔΕΝ είχε γίνει commit, ο SQL Server μέσω του DB Startup command και του database log έκανε rollback τα deletion των records ώστε να επαναφέρει σε συνεπή μορφή τον πίνακα!

Τελικά, η λύση του προβλήματος ήταν εξίσου απλή με την αιτία που το προκάλεσε. Δόθηκε η οδηγία, να περιμένουν να τελειώσει το recovery του πίνακα. Όντως, μετά από 2 περίπου ώρες η διαδικασία ολοκληρώθηκε και ο πίνακας είχε επανέλθει στην πρότερη μορφή του.

ACID rocks!

Ημερομηνία: 07 June 2017 12:37
Αξιολόγηση: ( 1 )
Κατηγορίες:
Tags:
Share it:

Αφήστε το σχόλιο σας - Leave your comment

Τα σχόλια έχουν κλείσει.
Επιτρέπονται μόνο τα σχόλια από τα μέλη του SqlSchool.gr.


newsletter subscription

Εάν επιθυμείτε να λαμβάνετε ενημέρωση από εμάς, δώστε μας το e-mail σας.
PASS chapter logo
Official Professional Association for SQL Server (PASS) chapter for Greece
Join to PASS