Могу ли я запустить DBCC CHECKDB из .NET? - PullRequest
4 голосов
/ 22 мая 2009

Я пишу запланированное задание для имитации плана обслуживания SQL Server для SQL Express. (Я должен сделать это, потому что агент SQL и связанные инструменты не существуют для SQL Express)

Одним из шагов является проверка целостности базы данных. TSQL для этого:

DBCC CHECKDB(N'Northwind')  WITH NO_INFOMSGS

Как узнать, произошла ли ошибка при выполнении этой команды, выдаст ли она Исключение при использовании ADO.NET или мне придется проанализировать текстовый вывод команды (если так, что мне искать в выводе)

Это сложно проверить, потому что у меня нет поврежденной базы данных.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Вы можете использовать опцию TABLERESULTS с CHECKDB (DBCC CHECKDB WITH TABLERESULTS). Это даст вам набор записей с такими столбцами, как Error, Level, State, MessageText (среди многих других).

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

MS говорит, что уровни с 11 по 16 «генерируются пользователем и могут корректироваться пользователем». Поэтому я бы сказал, что все, что выше 17, должно означать: прекратить делать какие-либо резервные копии (чтобы избежать перезаписи хороших резервных копий на поврежденные), по возможности отключить систему и немедленно уведомить оператора.

И уровни с 11 по 16, вероятно, следует сообщать оператору также (через обычную электронную почту или что-то еще), чтобы он мог проверить это при необходимости. (Я не уверен, что CHECKDB когда-либо сообщит об ошибке с уровнями с 11 по 16. Хотя наличие кода для регистрации ошибки / уведомления оператора, вероятно, не повредит.)

ПРИМЕЧАНИЕ : если вы объедините TABLERESULTS с NO_INFOMSGS, и если CHECKDB не обнаружит ошибок, вы не получите любой набор записей в результате, даже один без строк.

NOTE2 : при определенных условиях 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. Если вы найдете один из них, вероятно, есть и какая-то серьезная проблема.

4 голосов
/ 22 мая 2009

Да, я полагаю, вам нужно будет обработать текстовый вывод, возвращенный из DBCC CHECKDB.

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

http://sqlblogcasts.com/blogs/tonyrogerson/archive/2007/03/10/how-to-create-a-corrupt-database-using-bulk-insert-update-and-bcp-sql-server-as-a-hex-editor.aspx

...