sqlschool.gr logo

articles

Articles of SQLschool.gr Team

Keep DBCC CHECKDB output and history

Antonios Chatzipavlis
Saturday 09 October 2021

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

Antonios Chatzipavlis

Antonios Chatzipavlis

Antonios is a Data Solutions Consultant and Trainer. He has been working in IT since 1988. In his career, he has worked as senior developer, IT Manager, Solutions Architect and IT Consultant. Since 1995 he has been devoted on new technologies and software development tools, mainly by Microsoft, either by training company staff and colleagues or assisting them in design, development and implementation as a consultant or chief developer. He has focused in Databases and Data Science since 1995. He specialized in Microsoft SQL Server since version 6.0 in areas like SQL Server Internals, Database Design and Development, Business Intelligence and in 2010 he has started working with Azure Data Platform, NoSQL databases, Big Data Technologies and Machine Learning. He is an active member of many IT communities in Greece, answering colleagues' questions and writing articles in his web site. He is the owner of SQLschool.gr which is a community portal with a lot of information about Microsoft SQL Server. He has been a Microsoft Certified Trainer (MCT) since 2000. Microsoft honored him as MVP on Data Platform due to his activities in SQL Server since 2010. He holds a large number of Microsoft Certifications and Microsoft SQL Server Certifications since version 6.5.

Episode

First look: SQL Database in Microsoft Fabric

image

More Episodes...

Tip

What's New in SQL Server 2022 - Episodes

More Tips...

Become a member

If you want to receive updates from us become a member to our community.

Connect

Explore

Learn


sqlschool.gr © 2010-2024 All rights reserved

This site uses cookies for operational and analytics purposes only. By continuing to browse this site, you agree to their use.