Overview
Ο έλεγχος μιας database είναι κάτι που πρέπει να γίνεται ακόμα και αυτή είναι αρκετά μεγάλη. Αρκετοί δυστυχώς δεν το κάνουν αυτό τακτικά και αυτό μπορεί να οδηγήσει σε δύσκολές καταστάσεις.
Η εκτέλεση της γνωστής DBCC CHECKDB είναι αυτό που πρέπει να γίνεται καθώς είναι αυτή που ελέγχει την database. Το αποτέλεσμα της είναι κάτι που πρέπει να μελετούμε σχολαστικά μετά από κάθε εκτέλεση της και σε αρκετές περιπτώσεις ίσως θα πρέπει να το συγκρίνουμε με παλαιότερες εκτελέσεις.
Αυτό που κάνουμε οι περισσότεροι DBA είναι να κρατάμε κάποιο ιστορικό για αυτές και σε αυτό το άρθρο μου δείχνω το πως αυτό μπορεί να γίνει.
Ένα από πρώτα πράγματα που κάνουμε είναι να δημιουργήσουμε μια database η οποία να κρατάει αρκετές πληροφορίες που αφορούν performance και actions που γίνονται πάνω στο instance. Προσωπικά την database αυτή την ονομάζω DBADB και μέσα σε αυτή έχω αρκετά πράγματα που με βοηθάνε στο να ξέρω με λεπτομέρεια γίνεται στο instance. Σε άλλο άρθρο μου θα μιλήσω για το τι άλλο κρατώ σε αυτή.
My Solution
Για να κρατήσω το ιστορικό εκτέλεσης της DBCC CHECKDB για κάθε database δημιουργώ ένα πίνακα που κρατάει τις εκτελέσεις για κάθε database για τις τελευταίες 90 ημέρες.
Όλα αυτά γίνονται με απλό τρόπο καθώς είμαι από αυτούς που θέλουν απλότητα και αυτός ο τρόπος είναι με την εκτέλεση μιας stored procedure την οποία απλά κάνω schedule. Φυσικά δεν με ενδιαφέρουν οι εκτελέσεις που δεν έχουν πρόβλημα για αυτό και χρησιμοποιώ το option NO_INFOMSGS.
Αν σε κάποια database υπάρχει πρόβλημα ενημερώνομαι από το schedule που έχω κάνει με το SQL Server Agent και αν θέλω να δω τα αποτελέσματα αυτό το κάνω κάνοντας απλά ένα query στο πίνακα που κρατώ τα αποτελέσματα.
Δεν χρειάζεται να εξηγήσω περισσότερο την ακριβώς κάνω καθώς το παρακάτω script είναι αρκετά κατανοητό για όσους ασχολούνται με το SQL Server.
SQL Script
CREATE DATABASE DBADB;
GO
USE DBADB;
GO
CREATE TABLE dbo.CheckDBResultsHistory
(
[error] INT NULL
, [level] INT NULL
, [state] INT NULL
, [messagetext] VARCHAR(8000) NULL
, [repairlevel] VARCHAR(512) NULL
, [status] INT NULL
, [dbid] INT NULL
, [dbfragid] INT NULL
, [objectid] INT NULL
, [indexid] INT NULL
, [partitionid] BIGINT NULL
, [allocunitid] BIGINT NULL
, [riddbid] INT NULL
, [ridpruid] INT NULL
, [file] INT NULL
, [page] INT NULL
, [slot] INT NULL
, [refdbid] INT NULL
, [refpruid] INT NULL
, [reffile] INT NULL
, [refpage] INT NULL
, [refslot] INT NULL
, [allocation] INT NULL
, [executiondate] DATETIME CONSTRAINT [df_CheckDBResultsHistory_executiondate] DEFAULT(GETDATE())
)
GO
CREATE INDEX idx_CheckDBResultsHistory_executiondate ON dbo.CheckDBResultsHistory(executiondate);
CREATE INDEX idx_CheckDBResultsHistory_dbid ON dbo.CheckDBResultsHistory(dbid);
GO
CREATE OR ALTER PROC dbo.RunCheckDBonDB @dbname varchar(256)
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM dbo.CheckDBResultsHistory
WHERE executiondate <= DATEADD(DAY,-90,GETDATE());
DECLARE @dbcccmd VARCHAR(8000) = 'DBCC CHECKDB (''@db'') WITH NO_INFOMSGS,TABLERESULTS';
SET @dbcccmd = REPLACE(@dbcccmd,'@db',@dbname);
--print @dbcccmd;
INSERT INTO dbo.CheckDBResultsHistory([error], [level], [state], [messagetext], [repairlevel],
[status], [dbid], [dbfragid], [objectid], [indexid],
[partitionid], [allocunitid], [riddbid], [ridpruid],
[file], [page], [slot], [refdbid], [refpruid], [reffile],
[refpage], [refslot], [allocation])
EXEC (@dbcccmd);
END
GO
Αυτό που πρέπει να κάνω schedule είναι η stored procedure όπως στο παράδειγμα
SQL Script
exec DBADB.dbo.RunCheckDBonDB @dbname = 'tsqlv5'
και απλά αν θέλω να δω τα αποτελέσματα εκτελώ το παρακάτω query
SQL Script
select * from dbadb.dbo.CheckDBResultsHistory
where dbid=42