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 Chatzipavlis is a highly experienced Data Solutions Consultant and Trainer. He has been working in the IT industry since 1988, holding various roles such as senior developer, IT Manager, Data & AI Solutions Architect and Consultant.

Since 1995, Antonios has focused on modern technologies and software development tools, primarily by Microsoft. He has specialized in Data & AI since 2000, with expertise in Microsoft Data Platform (SQL Server, Azure SQL Databases, Azure Synapse Analytics, Microsoft Fabric, Power BI, AI) and Databricks.

Antonios is also a Microsoft Certified Trainer (MCT) for over 25 years, has been recognized as a Microsoft Most Valuable Professional (MVP) in Data Platform since 2010 and he is in the Data Expert 40 Powerlist 2024 by Boussias. He is the co-founder and visionary behind XLYTiCA, a company dedicated to Data & AI solutions.

Episode

Task Flows in Microsoft Fabric

image

More Episodes...

Tip

Get Certified: Become a Fabric Data Engineer

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-2025 All rights reserved

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