DBCC CHECKDB оповещение о повреждении баз данных SQL

09.05.20

База данных - Администрирование СУБД

Проверка целостности баз данных SQL при помощи DBCC CHECKDB и рассылка оповещений на почту.

Всем доброго времени суток!

Сразу оговорюсь, что мои познания в T-SQL не сильно велики т. к. по большей части пишу код для конфигураций на платформе 1С:Предприятие, и предложенное решение может быть не совсем оптимальным.

Оптимизация и улучшения предложенного скрипта приветствуется.

 

Небольшое предисловие.

Часто случается, что базы данных повреждаются, по различным причинам, и мы не всегда это вовремя замечаем.

Что бы проверить базу данных надо зайти в интерфейс, запустить скрипт, получить результат. И уже в зависимости от результата принимать какие-то решения и действия. Возможно это нормально, когда есть свободно время и не лень запустить скрипт вручную. Но что делать когда, к примеру, на поддержке с 10-к и более баз и находятся они на разных серверах. Подключаться к каждому серверу и запускать скрипт руками занимает много времени, да делать это вручную лень.

Для разработчика, администратора и т. п. лень это двигатель его прогресса, настроил систему как надо и читай логи, письма и прочее оповещения.

Вот после очередного повреждения базы, я опять вернулся к задаче проверки целостности баз по регламенту и рассылке результата на почту. Ранее я уже занимался этой задачей но не доделал, точнее не нашел нужного мне решения.

Это было небольшое предисловие, теперь перейдем к самой задаче.

 

Целью задачи было: проверять целостность баз данных 1с на сервере SQL по регламенту и при обнаружении поврежденной базы оповещать по почте. Оповещение только если найдена поврежденная база. Состав письма краткий, все данные результата проверки высылать не требуется.


Поиски готового решения в интернете ничего не дали. Нашел всего одно решение, но оно мне не подходит. Кому интересно, можете ознакомится с публикацией Отправляем результаты задания DBCC CHECKDB по электронной почте.

Сложность в решении задачи заключается в том, что функция DBCC CHCKDB возвращает результат в виде текстового сообщения. Для обработки и формирования сообщения на почту это не годится.

На просторах интернета прочитал, что данные можно вывести в таблицу.

DBCC CHCKDB WITH TABLERESULTS выведет данные в таблицу, но просто так взять и сделать выборку из из этой таблицы нельзя, но выход все же нашелся.

В поисках нужной информации для решения моей задачи наткнулся на публикацию Capture and Store SQL Server Database Integrity History using DBCC CHECKDB, которая была взята за основу решения задачи.

Спасибо тебе Rodert Pearl, что ты ее когда то написал.

 

Решение:

1. Создаем временную таблицу.

Исходное описание таблицы немного изменено.

Добавлена колонка "DatabaseName".

Изменил типы данных в некоторых колонках, т.к. при первом же тесте получил ошибки о невозможности преобразования типов данных

Колонки: PartitionID, AllocUnitID изменил тип данных с INT на BIGINT,

Колонка: RepairLevel с INT на VARCHAR(300)

В каких колонках нужно менять тип данных искал методом тыка и исключения.

 
 Скрипт временной таблицы

 

2. В ранее созданную временную таблицу, при помощи CURSOR, по списку баз, поместим выходные данные DBCC CHCKDB.

У меня есть база 'Recovery', использую для разных целей. Сегодя она играет роль поврежденной базы данных. Результ ее проверки и поместим во временную таблицу.

 
 Результаты DBCC CHECKDB вставляем во временную таблицу
 
 Результаты DBCC CHECKDB. Выборка уже из временной таблицы

 

3. Делаем выборку из временной таблицы и формируем строку сообщения. Выбираем только строки, которые содержат текст ошибки.

Теперь с данными можно работать, накладывать отборы, делать сортировку и все остальное.

Мне на выходе нужна одна строка с описанием ошибок. Строку собираю из колонок: DatabaseName, MessageText при помощи конкатенации. Дополнительно накладываю условия на 'MessageText', что бы получить нужные строки, т.к. если база не повреждена данные в выходном наборе все равно будут. Только в тексте будет количество ошибок "0". Мне эти данные не нужны.

 
 Скипт формирования строки сообщения
 
 Результат выполнения скипта

Строку сообщения сформировали, временная таблица более не нужна, поэтому

DROP TABLE #DBCC_DataReport

 

Осталось проверить есть ли у нас в сформированной строке данные, при их наличии отправляем данные на почту.

 
 Скрипт отправки сообщения

 

Проверяем скрипт, все работает.

Создаем Job, настраиваем расписание и готово

 
 Полный текст скрипта

IF OBJECT_iD('tempdb..#DBCC_DataReport')  is not null
DROP TABLE #DBCC_DataReport
GO

-- table structure for SQL Server 2012, 2014, 2016 and 2017
CREATE TABLE #DBCC_DataReport(
    [DatabaseName][VARCHAR](100) NULL
    ,[Error] [int] NULL
    ,[Level] [int] NULL
    ,[State] [int] NULL
    ,[MessageText] [VARCHAR](7000) NULL
    ,[RepairLevel] [VARCHAR](300) 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
)

DECLARE @database_name NVARCHAR(50)
DECLARE database_cursor CURSOR FOR

SELECT name
FROM sys.databases db
WHERE name = 'Recovery'
   AND db.state_desc = 'ONLINE'
   AND source_database_id IS NULL -- REAL DBS ONLY (Not Snapshots)
   AND is_read_only = 0

OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @database_name
WHILE @@FETCH_STATUS=0
    BEGIN

      INSERT INTO #DBCC_DataReport ([Error], [Level], [State], MessageText, RepairLevel, [Status],
      [DbId], DbFragId, ObjectId, IndexId, PartitionId, AllocUnitId, RidDbId, RidPruId, [File], Page, Slot,
      RefDbId, RefPruId, RefFile, RefPage, RefSlot,Allocation)
      EXEC ('DBCC CHECKDB(''' + @database_name + ''') WITH TABLERESULTS, ALL_ERRORMSGS, DATA_PURITY')

      UPDATE #DBCC_DataReport SET [DatabaseName] = 'DB ' + @database_name WhERE [DatabaseName] IS NULL
       
      FETCH NEXT FROM database_cursor INTO @database_name
    END

CLOSE database_cursor
DEALLOCATE database_cursor

DECLARE @MSG NVARCHAR(MAX)
SET @MSG = (
SELECT
    TextData + CHAR(10) AS [text()]
FROM (
    SELECT
        Concat(DatabaseName, ': ', MessageText) as TextData
    FROM #DBCC_DataReport
    WHERE
        SUBSTRING(MessageText, 1, 45) like 'CHECKDB обнаружил [1-9]%'
        or SUBSTRING(MessageText, 1, 45) like 'CHECKDB обнаружил [0-9]%[1-9]%'
    ) AS ReportData
FOR XML PATH (''))

DROP TABLE #DBCC_DataReport

IF @MSG IS NOT NULL
BEGIN
    DECLARE @Profilename as nvarchar(100) = 'Main' -- Имя почтового профиля, для отправки электонной почты                
    DECLARE @Recipients as nvarchar(30) = 'mymail@ya.ru' -- Получатели сообщений электронной почты, разделенные знаком ";"
    DECLARE @Msubject nvarchar(20)= N'SQL SERVER. CHECKDB RESULT' -- Тема сообщения

    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = @Profilename,
        @recipients = @Recipients,
        @body = @MSG,
        @subject = @Msubject;
END
GO

 

На этом все. Всем спасибо за внимание.

Вступайте в нашу телеграмм-группу Инфостарт

DBCC CHCKDB SQL ЦелостностьБазыДанных

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Администрирование СУБД Системный администратор Программист Бесплатно (free)

Статья рассказывает об опыте перевода больших баз с MSSQL на Postgres и годовой эксплуатации после перехода. Показано, с какими ограничениями утилиты ibcmd можно столкнуться при миграции больших баз и какие подходы помогают безопасно обходить эти проблемы. Приведены наиболее интересные кейсы, выявленные в эксплуатации: особенности настроек Postgres, поведение оптимизатора, тонкости работы логики и статистики, а также редкие, но критичные ситуации с производительностью. Материал будет полезен тем, кто планирует переход на Postgres и хочет заранее понимать реальные риски, подводные камни и проверенные практики их преодоления.

20.04.2026    6225    berserg    12    

24

Администрирование СУБД Программист Бесплатно (free)

Прокачиваем Постгрес с помощью пользовательских функций и процедур.

02.03.2026    1969    SerVer1C    3    

11

HighLoad оптимизация Администрирование СУБД 1С:Предприятие 8 Бесплатно (free)

В статье рассматриваются текущие возможности горизонтального масштабирования СУБД для 1С, а также какое решение предлагает Tantor Postgres.

02.02.2026    2110    Tantor    3    

8

Администрирование СУБД Технологический журнал Мониторинг Системный администратор Программист Бесплатно (free)

Рассказываем, почему высоконагруженным бэкендам на 1С нужен регулярный мониторинг и что происходит, когда его нет: производительность и стабильность деградируют, а обращения пользователей копятся. Показываем, как построили легкую систему наблюдаемости для бэкендов корпоративных порталов. Она включает сбор метрик из технологического журнала, Apdex, журнала регистрации и динамики размеров таблиц с последующим анализом в связке ClickHouse и служебной информационной базы на 1С. Объясняем, какие отчеты и метрики быстрее всего помогают находить критичные проблемы производительности, и демонстрируем интерфейс расследования. Разбираем несколько кейсов оптимизации, найденных по итогам мониторинга, включая доработки функционала БСП «управление доступом» и «присоединенные файлы».

15.12.2025    5335    tystik    1    

9

HighLoad оптимизация Администрирование СУБД 1С:Предприятие 8 1С:ERP Управление предприятием 2 Бесплатно (free)

Завершаем цикл статей по совместному докладу Алены Генераловой и Александра Симонова на INFOSTART TECH EVENT 2025 о нагрузочном тестировании (НТ) на 30 000 АРМ на машине баз данных Tantor XData. В заключительной части расскажем о том, что нас ждало при запусках теста, и какие доработки СУБД Tantor Postgres были сделаны, чтобы его пройти с высоким результатом.

27.11.2025    4029    Tantor    28    

16

HighLoad оптимизация Администрирование СУБД Программист Бесплатно (free)

Продолжаем знакомить вас с улучшениями СУБД Tantor Postgres для работы с продуктами 1С. В рамках предыдущей статьи мы разобрали арсенал специализированных функций, призванных существенно ускорить выполнение типичных для 1С операций, снизить нагрузку на инфраструктуру и упростить администрирование. Сегодня мы рассмотрим, с какими проблемами можно столкнуться при высоких значениях default_statistics_target, расскажем о новых оптимизациях для ускорения выполнения запросов, и, конечно, коснемся временных таблиц.

11.11.2025    2712    Tantor    10    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. TerveRus 20.05.20 16:40 Сейчас в теме
Спасибо!
Осталось понять что такое DBCC CHECKDB и что делать с оповещением)
2. Fox-trot 166 20.05.20 17:33 Сейчас в теме
SELECT name
FROM sys.databases db
WHERE name = 'Recovery'
   AND db.state_desc = 'ONLINE'
   AND source_database_id IS NULL -- REAL DBS ONLY (Not Snapshots)
   AND is_read_only = 0

зачем столько уточнений? платят за количество буков? достаточно и
SELECT name
FROM sys.databases
WHERE name = 'Recovery'
3. itoptimum 24 19.06.20 11:41 Сейчас в теме
Спасибо, помогло в автоматической обработке результатов работы checkdb для исправления:
https://infostart.ru/public/1253058/
Для отправки сообщения требуется регистрация/авторизация