Πώς αυτοματοποιούμε τη διαδικασία ελέγχου ακεραιότητας των βάσεων δεδομένων σε SQL Server χωρίς την χρήση maintenance plan
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
Κατά διαστήματα πρέπει να ελέγχουμε την ακεραιότητα των βάσεων μας για τυχόν corruptions. Σε αυτό το άρθρο θα δούμε τον πιο εύκολο και αποδοτικό τρόπο ώστε να κάνουμε έλεγχο για corruption σε όλες τις βάσεις δεδομένων του instance. Αυτό θα το κάνουμε με τη χρήση της procedure DatabaseIntegrityCheck που έχει φτιάξει ο Hallengren.
Φυσικά αυτή η εργασία γίνεται με την χρήση T-SQL π.χ. dbcc checkdb db_name ή maintance plans που έχει build-in ο SQL Server αλλά τα παραπάνω έχουν κάποιους περιορισμούς.
Υπάρχει ανάλυση για το πως ελέγχουμε για την ακεραιότητα μίας βάσης δεδομένων με τη χρήση checkdb και πως το διορθώνουμε τυχόν corruption στο άρθρο στον σύνδεσμο εδώ.
Τι παραπάνω προσφέρει
Η procedure DatabaseIntegrityCheck μπορεί να πραγματοποιεί έλεγχο σε όλες τις βάσεις στο instance με μία εντολή.
Επίσης μας προσφέρει μεγαλύτερο έλεγχο με τις παραμέτρους που δέχεται κατά την εκτέλεση της.
Η εγκατάσταση
Κατεβάσουμε από εδώ το πακέτο με τις procedure που θα χρειαστούμε:
ή απευθείας από το site του δημιουργού εδώ.
Αφού κατέβει εκτελούμε όλο το script στη βάση που θέλουμε να καλούντε από αυτήν π.χ σε μία custom βάση που έχουμε φτιάξει για monitoring ή στην συστημική βάση master.
Στη συνέχεια για να ξεκινήσει η διαδικασία, απλά εκτελούμε την procedure με τις παραμέτρους όπως παρακάτω:
EXECUTE dbo.DatabaseIntegrityCheck @Databases = 'ALL_DATABASES', @CheckCommands = 'CHECKDB', @MaxDOP = 0, @LogToTable = 'Y', @TabLock = 'N'
Τι ακριβώς ορίζει η κάθε παράμετρος:
- @Databases ορίζουμε αν θα τρέξει η διαδικασία σε όλες τις βάσεις, στις συστημικές ή σε αυτές που έχουμε φτιάξει.
- @CheckCommands ορίζουμε τι τύπου έλεγχο θα κάνει, το αφήνουμε στο default που είναι το CHECKDB.
- @MaxDOP ορίζουμε την μέγιστη παραλληλία των cpu cores που επιτρέπεται, με 0 ορίζουμε ότι θέλουμε να χρησιμοποιήσει όσα υπάρχουν.
- @LogToTable ορίζουμε αν θα καταγράφονται τα commands του indexΟptimize στον πίνακα commandlog που δημιουργήθηκε όταν εγκαταστήσαμε το script.
- @TabLock ορίζουμε αν θα κάνει χρήση την tempdb με χρήση snapshot του κάθε πίνακα σε αυτήν ή θα κάνει tablock στoν πίνακα κλειδώνοντας τον μέχρι να ολοκληρωθεί η διαδικασία. Σαν αποτέλεσμα όμως δεν θα μπορεί να προσπελαστεί.
Υπάρχουν αναλυτικά οι οδηγίες για την κάθε παράμετρο στον ιστότοπο του δημιουργού εδώ.
Πως αυτοματοποιούμαι τη διαδικασία
Μπορούμε να προσθέσουμε την εκτέλεση της procedure σε ένα SQL Server Agent Job.
Για να το κάνουμε αυτό πάμε στον Objects Explorer, SQL Server Agent, Δεξί κλικ στο Jobs, New Job…
Στο παράθυρο που εμφανίζεται πάμε στην καρτέλα Steps και επιλέγουμε New.
Εκεί διαλέγουμε τη βάση master που είχαμε εγκαταστήσει την procedure και προσθέτουμε το script της procedure:
Στην καρτέλα Schedules μπορούμε να ορίσουμε την συχνότητα που θα εκτελείτε η εργασία. Καλό θα είναι να διαλέξουμε μια χρονική στιγμή που δεν έχει μεγάλο φόρτο εργασίας με προσπέλαση στα δεδομένα στο instance:
Για να δούμε αναλυτικά το κάθε action που έχει κάνει η procedure και πότε το έκανε
Απλά κάνουμε ένα select στον πίνακα commandlog:
select * from master..commandlog;
Bonus
Με το παρακάτω script που έχω φτιάξει, με μόνο ένα κλικ, κάνει εγκατάσταση το MaintenanceSolution του Ola Hallengren μαζί με έτοιμα παραμετροποιημένα jobs για Backup ,Database Integrity και Index Optimize με τις βέλτιστες παραμέτρους και χρονοδιάγραμμα.
Τα Backup jobs δημιουργούνται disabled καθώς μπορεί να έχουμε άλλη λύση για backup με 3rd party tool. Επίσης κάνει έλεγχο για Availability Group ώστε να τρέχουν μόνο αν είναι η Preffered Backup Replica (για backup / database integrity) και αν είναι Primary Replica (για Index Optimize).
Το μόνο που χρειάζεται να κάνουμε, είναι να εκτελέσουμε το παρακάτω script στο κάθε SQL Server Instance: