go backarticles

Articles of SQLschool.gr Team

Let's talk about Backup related wait types

Antonios Chatzipavlis

Overview

Τα backups/restores κατέχουν ένα πολύ σημαντικό μέρος της διαχείρισης μιας database, και είναι απαραίτητα για την επιβίωση του οργανισμού. Τα δεδομένα έχουν γίνει απολύτως σημαντικά για τους οργανισμούς, που αν κάποια καταστροφή προκαλέσει απώλεια δεδομένων, αυτές μπορούν να χάσουν μεγάλα χρηματικά ποσά ή ακόμη και να κλείσουν.

Η εφαρμογή και ο προγραμματισμός backups στο SQL Server δεν είναι καμία πολύ δύσκολη εργασία και είναι αδιανόητο να μην έχετε backups.

Το είδος backup που θα έχετε και το κάθε πότε θα διενεργείτε μια διαδικασία backup υπαγορεύονται από τις ανάγκες του οργανισμού οι οποίες εκφράζονται με το RTO και RPO, και ο SQL Server παρέχει πολλές επιλογές για την εκπλήρωση των απαιτήσεων αυτών, χωρίς εξαρτώμαστε από λογισμικό δημιουργίας backups τρίτων κατασκευαστών.

Η λειτουργία δημιουργίας backups στο SQL Server είναι μια εσωτερική διαδικασία και όπως για όλες οι εσωτερικές εργασίες έχει και αυτή κάποια wait types και σε αυτό το άρθρο θα ασχοληθώ με αυτά ώστε να μπορείτε να έχετε πάντα τη καλύτερη δυνατή απόδοση σε αυτά διότι όπως είπα και παραπάνω τα δεδομένα είναι πολύτιμα. Ποιος δεν θέλεις να εκτελούνται όσο το δυνατόν γρηγορότερα τα backups και ιδιαίτερα τα restores; Νομίζω κανείς.

BACKUPBUFFER

Αρκετοί είναι αυτοί που πιστεύουν ότι το συγκεκριμένο wait type αφορά τα backups/restores που γίνονται σε tape το οποίο μάλιστα δεν υποστηρίζεται εδώ και αρκετές εκδόσεις στον SQL Server, δεν είναι όμως έτσι. Εύκολα αυτό μπορεί κάποιος να το επιβεβαιώσει με το παρακάτω παράδειγμα στο οποίο είναι ενεργοποιημένο το TF3213 το οποίο επιστρέφει πληροφορίες για το backup/restore operation και το γράφει αυτές στο SQL Server error log με το TF3605.

-- enable trace flags
dbcc traceon (3213);
dbcc traceon (3605);
-- backup database
backup database [wideworldimporters]
  to  disk = N'r:\backup\wwibackup.bak';
go
-- disable trace flags
dbcc traceoff (3213);
dbcc traceoff (3605);

Αν ανατρέξετε στο error log μετά από την παραπάνω εκτέλεση του disk backup, έχουν καταγραφεί οι εξής πληροφορίες, όπως φαίνονται στην εικόνα που ακολουθεί.

Σε αυτές βρίσκουμε τον αριθμό των χρησιμοποιούμενων buffers μέσω του BufferCount που έχει την τιμή 7 άρα έχω 7 backup buffers, όπου ο κάθε buffer έχει μέγεθος 1024ΚΒ το οποίο φαίνεται στο MaxTransferSize και το συνολικό μέγεθος μνήμης που χρειάζονται όλοι μαζί οι Buffers είναι στην Total buffer space, που είναι ο πολλαπλασιασμός των δύο προηγούμενα αναφερόμενων παραμέτρων και είναι 7ΜΒ.


SQL Server error log
image

Σε όλα τα παραπάνω όμως υπάρχει ακόμα μια αρκετά σημαντική πληροφορία και είναι το Memory Limit το οποίο δείχνει το μέγιστο μέγεθος της μνήμης που είναι εκτός της buffer cache και την οποία μπορεί να χρησιμοποιήσει ένα backup/restore operation.

Όπα τι είναι αυτό τώρα; Δηλαδή για την διεξαγωγή backup/restore χρειάζομαι μνήμη η οποία δεν ορίζεται στην buffer cache;

Ακριβώς, η μνήμη αυτή καταλαμβάνει μνήμη από το σύστημα αλλά δεν την "κλέβει" από την buffer cache .

Θεωρώ ότι το επόμενο εύλογο ερώτημα που έχετε είναι τι είναι και τι σκοπό εξυπηρετούν αυτοί οι buffers.

Ο SQL Server όπως είδατε χρησιμοποιεί buffers κατά την εκτέλεση των backup/restore διαδικασιών τα οποία γεμίζουν με δεδομένα από την database και γράφουν αυτά τα δεδομένα με την σειρά στο backup file. Ο αριθμός και το μέγεθος των buffers αυτών υπολογίζονται αυτόματα από τον SQL Server, αλλά μπορείτε να τις διαμορφώσετε με τις παραμέτρους BUFFERCOUNT, MAXTRANSFERSIZE για τις οποίες μπορείτε να διαβάσετε περισσότερα στο BACKUP statement.


Backup/Restore internal operation
image

To BACKUPBUFFER συμβαίνει ότι ένα backup thread περιμένει για να γεμίσει ένα backup buffer γιατί δεν υπάρχει άδειος/ελεύθερος buffer που με την σειρά του θα γραφτεί στο backup file. Αφορά δηλαδή το αριστερό τμήμα της παραπάνω εικόνας.

Για την μείωση του συγκεκριμένου wait type η συνηθέστερη πρόταση που κυκλοφορεί στο internet προτείνει την αύξηση των buffers με την χρήση της BUFFERCOUNT στο statement. Δεν είμαι αντίθετος σε αυτό απλά να επισημάνω ότι αν το κάνετε απερίσκεπτα και βάλετε μεγάλο αριθμό πιθανότητα να έχετε out of memory συμβάν και δεν είναι ότι καλύτερο σε παραγωγικό περιβάλλον. Όπως όλα τα πράγματα στο SQL Server θέλει tuning μέχρι να βρεθεί αυτό που και καλύτερους χρόνους δίνει και λιγότερα BACKUPBUFFER έχετε και δεν γίνεται out of memory.

BACKUPIO

Αφού έχετε καταλάβει το προηγούμενο BACKUPBUFFER το BACKUPIO είναι πλέον εύκολο να γίνει κατανοητό καθώς αφορά το δεξί τμήμα της παραπάνω εικόνας καθώς συμβαίνει όταν υπάρχει καθυστέρηση στο γράψιμο του buffer στο backup file. Αυτό μπορεί να συμβεί διότι γράφουμε σε αρκετά αργό δίσκο ή σε δίσκο που χρησιμοποιείται αρκετά (κοινό λάθος όλων να παίρνουν backups στο ίδιο δίσκο που έχουν και τις databases) ή σε network storage (όπου μπαίνει ο παράγοντας ταχύτητα network). Συνήθως με αυτό το wait type έχουμε και ακόμα ένα να εμφανίζεται και αυτό είναι το ASYNC_IO_COMPLETION.

Η σωστή λύση για την μείωση του BACKUPIO είναι να πάμε σε κάτι γρηγορότερο όσον αφορά το δίσκο που βάζουμε τα backup files.

BACKUPTHREAD

Το wait type αυτό θα το δείτε κυρίως σε restore operations. Δεν είναι από αυτά που φέρνουν πονοκέφαλο, εκτός και αν δούμε μεγαλύτερους χρόνους από τους αναμενόμενους, καθώς συμβαίνει όταν ένα άλλο thread περιμένει ένα backup/restore operation να ολοκληρωθεί.

Για την μείωση αυτού η καλύτερη λύση είναι μειωθεί ο χρόνος που διαρκεί ένα restore operation.

Επίλογος

Αυτά είναι τα wait types που αφορούν τα backup/restore operations


//Antonios Chatzipavlis


Relative Articles

Leave your comment

Login with your SQLschool.gr account if you want to comment on this article.


Follow us in
PASS chapter logo

The Official PASS Local Group for Greece

Subscription

If you want to receive updates from us subscribe below with your email.
sql school greece logo
© 2010-2020 All rights reserved