Πώς ελέγχουμε την ακεραιότητα των βάσεων δεδομένων και πώς διορθώνουμε τυχόν corruption σε SQL Server

Πώς ελέγχουμε την ακεραιότητα των βάσεων δεδομένων και πώς  διορθώνουμε τυχόν corruption σε SQL Server
Πώς ελέγχουμε την ακεραιότητα των βάσεων δεδομένων και πώς  διορθώνουμε τυχόν corruption σε SQL Server

Σε μία βάση δεδομένων πάντα υπάρχει η πιθανότητα να έχουμε κάποιο corruption. Αυτό μπορεί να είναι είτε physical π.χ. από κάποια ζημία στον δίσκο ή είτε logical π.χ. λάθος τιμές σε πεδίο ενός πίνακα. Στο άρθρο θα δούμε πώς μπορούμε να το εντοπίσουμε και πώς να το διορθώσουμε.

Όταν πάμε να προσπελάσουμε δεδομένα που έχουν corruption θα μας επιστραφεί κάποιο μήνυμα λάθους. Όμως αν αυτά τα δεδομένα δεν τα καλούμε συχνά, θα αργήσουμε να το εντοπίσουμε. Αυτό θα έχει ως αποτέλεσμα να είναι πιο δύσκολη η διόρθωση του.

Πώς βρίσκουμε αν μία βάση εμφανίζει κάποιο corruption

Με την transact SQL εντολή CHECKDB και ορίζοντας το όνομα της βάσης πραγματοποιούμε τον έλεγχο για οποιουδήποτε τύπου corruption.

DBCC CHECKDB (test_db)

Με το που ολοκληρωθεί θα μας εμφανήσει το αποτέλεσμα, είτε μπορούμε να δούμε ανά πάσα στιγμή από το errorlog τρέχοντας την παρακάτω εντολή:

exec xp_readerrorlog 0,1,"CHECKDB",null,null,null,"DESC"

Το αποτέλεσμα της θα είναι κάπως έτσι, βλέπουμε ότι στην προκειμένη περίπτωση αναφέρει ότι βρήκε 0 errors.

DBCC CHECKDB (test_db) executed by dbadmin found 0 errors and repaired 0 errors. Elapsed time: 0 hours 0 minutes 0 seconds.  Internal database snapshot has split point LSN = 0000002d:000012be:0001 and first LSN = 0000002d:000012bc:0001.

Μπορούμε να δώσουμε παραμέτρους στην εντολή του CHECKDB όπως π.χ. να μην εμφανίζει πληροφοριακά μηνύματα, να κλειδώνει ολόκληρο τον πίνακα ώστε να εκτελεστεί πιο γρήγορα χωρίς να κάνει χρήση την tempdb, να κάνει χρήση μέχρι 2 cpu cores κ.α. :

DBCC CHECKDB (test_db) WITH NO_INFOMSGS,TABLOCK,MAXDOP=2;

Πώς διορθώνετε το corruption

Ανάλογα του τι τύπου corruption έχουμε ακολουθούμε διαφορετικά βήματα.

Όπως είπαμε στην αρχή του άρθρου ένα corruption physical ή logical από εκεί και πέρα όμως χωρίζετε και σε άλλες κατηγορίες όπως:

  • Page Corruption: να έχει υποστεί ζημιά κάποιο συγκεκριμένο page που μπορούμε να το επαναφέρουμε μεμονομένα όπως έχουμε αναφέρει αναλυτικά σε άρθρο εδώ.
  • Non-Clustered Index Corruption: το οποίο αφού δεν περιέχει actual data μπορούμε απλά να το κάνουμε drop και recreate.
  • Clustered Index Corruption: στο οποίο έχει γίνει εκτεκταμένη ζημία στα πραγματικά μας δεδομένα και εκεί μπορούμε να δοκιμάσουμε να τρέξουμε checkdb με repair και αν δεν λειτουργήσει θα αναγκαστούμε να κάνουμε κάπου restore ολόκληρη τη βάση ώστε να πάρουμε τους πίνακες που χάσαμε.

Checkdb με Repair

Για να κάνουμε προσπάθεια να διορθώσουμε το error χωρίς χάσουμε δεδομένα τρέχουμε το παρακάτω:

USE master;
GO
ALTER DATABASE test_db
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

DBCC CHECKDB ('test_db', REPAIR_REBUILD) WITH NO_INFOMSGS,MAXDOP=0;
GO

ALTER DATABASE test_db
SET MULTI_USER;
GO

Στην περίπτωση που δεν διορθωθεί το πρόβλημα μπορούμε να το τρέξουμε με τη παράμετρο repair_allow_data_loss. Υπάρχει όμως περίπτωση να χάσουμε δεδομένα, για αυτό προτείνετε η χρήση με begin transaction πρώτα και μετά αν δούμε ότι τα δεδομένα μας ειναι ΟΚ να κάνουμε commit;

USE master;
GO
ALTER DATABASE test_db
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

--BEGIN TRANSACTION
DBCC CHECKDB ('test_db', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS,MAXDOP=0;
--COMMIT;
GO

ALTER DATABASE test_db
SET MULTI_USER;
GO

Αν δεν λειτουργήσει ούτε αυτό και έχουμε corruption στο clustered index το μόνο που μπορούμε να κάνουμε είναι να επαναφέρουμε τη βάση με το latest backup που έχουμε.

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση