Могу ли я запустить DBCC CHECKDB из.NET?
Я пишу запланированное задание для имитации плана обслуживания SQL Server для SQL Express. (Я должен сделать это, потому что агент SQL и связанные инструменты не существуют для SQL Express)
Одним из шагов является проверка целостности базы данных. TSQL для этого:
DBCC CHECKDB(N'Northwind') WITH NO_INFOMSGS
Как мне узнать, произошла ли ошибка во время выполнения этой команды, вызовет ли она исключение при использовании ADO.NET или мне придется анализировать текстовый вывод команды (если так, что мне искать в выходных данных)
Это трудно проверить, потому что у меня нет поврежденной базы данных.
2 ответа
Да, я считаю, что вам нужно обработать текстовый вывод, возвращенный из DBCC CHECKDB.
Чтобы помочь вам с тестированием, в следующих справочных материалах подробно описано, как намеренно повредить базу данных SQL Server.
Вы можете использовать TABLERESULTS
вариант с CHECKDB
(DBCC CHECKDB WITH TABLERESULTS
). Это даст вам набор записей с такими столбцами, как Error
, Level
, State
, MessageText
(среди многих других).
Level
столбца (уровень серьезности) этого набора записей должно быть достаточно, чтобы решить, есть ли какая-либо ошибка.
MS говорит, что уровни с 11 по 16 "генерируются пользователем и могут корректироваться пользователем". Так что я бы сказал, что все, что выше 17, должно означать: прекратить делать какие-либо резервные копии (чтобы избежать перезаписи хороших резервных копий на поврежденные), по возможности отключить систему и немедленно уведомить об этом оператора.
А уровни 11-16 должны, вероятно, также сообщаться оператору (через обычную электронную почту или что-то еще), чтобы он мог проверить это при необходимости. (Я не уверен, если CHECKDB
когда-нибудь сообщит об ошибке с уровнями с 11 по 16, хотя. Наличие кода для регистрации ошибки / уведомления оператора, вероятно, не повредит.)
ПРИМЕЧАНИЕ: если вы объединяете TABLERESULTS
с NO_INFOMSGS
, и если CHECKDB
не найдет никаких ошибок, в результате вы не получите ни одного набора записей, даже без строк.
ПРИМЕЧАНИЕ 2. При определенных условиях CHECKDB
просто потерпит неудачу с кодом ошибки. До сих пор я видел только одну ошибку, которая вызывает это, и это выглядит так:
Msg 211, Level 23, State 51, Line 3
Possible schema corruption. Run DBCC CHECKCATALOG.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Я не очень часто использую ADO.NET, но думаю, что ADO.NET отреагирует на это исключением. Кроме того, поскольку это ошибка с серьезностью>= 20, это приведет к закрытию клиентского соединения.
Подводя итог всему этому: я бы побежал DBCC CHECKDB WITH TABLERESULTS
, Если команда не выполняется, возникает проблема (возможно, серьезная). Если нет, переходите к циклу просмотра набора результатов и ищите уровни серьезности>= 17. Если вы найдете такой уровень, возможно, есть и серьезная проблема.