Разделение DBCC CHECKDB на несколько дней

10

Я работаю над реализацией метода Пола Рэндала, который заключается в том, чтобы вручную распределять DBCC CHECKDB в течение нескольких дней для очень больших баз данных, который в основном состоит из:

  • Разделение таблиц в базе данных примерно поровну между 7 сегментами
  • Запуск DBCC CHECKALLOC два раза в неделю
  • Запуск DBCC CHECKCATALOG один раз в неделю
  • Запуск DBCC CHECKTABLE для одного сегмента каждый день недели

Кто-нибудь использовал эту технику? Есть какие-нибудь существующие сценарии?

Я обеспокоен тем, что это может не охватывать все, что делает CHECKDB; В документации по электронной документации для CHECKDB говорится, что в дополнение к CHECKALLOC, CHECKCATALOG и CHECKTABLE также:

  • Проверяет содержимое каждого индексированного представления в базе данных.
  • Проверяет согласованность на уровне ссылок между метаданными таблицы и каталогами и файлами файловой системы при хранении данных varbinary (max) в файловой системе с использованием FILESTREAM. (Только SQL 2008)
  • Проверяет данные компонента Service Broker в базе данных.

Итак, вот мои вопросы:

  1. Эти дополнительные проверки необходимы / важны? (Индексированные представления, вероятно, немного больше относятся ко мне, я не думаю, что мы пока используем Service Broker или FILESTREAM.)

  2. Если да, есть ли способы выполнить эти дополнительные проверки отдельно?

  3. CHECKALLOC и CHECKCATALOG, кажется, работают очень быстро, даже на больших БД. Есть ли причина не запускать их каждый день?

(Примечание: это будет стандартная процедура для тысяч существующих баз данных на сотнях серверов или, по крайней мере, для каждой базы данных более определенного размера. Это означает, что такие варианты, как реструктуризация всех баз данных для использования CHECKFILEGROUP, на самом деле не практичны для нас.)

BradC
источник
Пол ответил на версию этого вопроса в комментариях на своем блоге. Он сказал: «Не беспокойтесь о проверке индексированного представления. По умолчанию он отключен с 2008 года, потому что не было проблем».
BradC
Я работаю над тем, чтобы сделать то же самое - какие-либо советы / рекомендации, которые вы нашли, так как вы, вероятно, уже реализовали это?
scsimon
1
@scsimon Я сделал так, чтобы он работал хорошо, см. этот связанный вопрос для конкретной стратегии, которую я использовал для разделения таблиц. Я думаю, что в конечном итоге я составил основной список всех таблиц во всех (больших) базах данных на всем сервере, чтобы разделить его на ежедневные «корзины», что дало мне гораздо более равномерное разделение, чем разделение списка каждой базы данных по отдельности. Меньшие базы данных Я просто делал полный DBCC каждый день, и не был частью раскола.
BradC

Ответы:

6

Эти дополнительные проверки необходимы / важны? (Индексированные представления, вероятно, немного больше относятся ко мне, я не думаю, что мы пока используем Service Broker или FILESTREAM.)

Вы можете запустить DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS непосредственно на индексированных представлениях . Проверка индексированных представлений может быть проблематичной в определенных обстоятельствах , поэтому будьте готовы исследовать любые ложные срабатывания, которые могут быть получены. (Пол Рэндал также упоминает в комментариях к ссылочной статье, что ложные негативы также возможны, но у меня нет прямого опыта в этом.)

Если да, есть ли способы выполнить эти дополнительные проверки отдельно?

Нет поддержки для запуска Service Broker или FILESTREAMчеков отдельно, нет.

CHECKALLOCи, CHECKCATALOGкажется, работает очень быстро, даже на больших БД. Есть ли причина не запускать их каждый день?

Не то, чтобы я в курсе.


Вы также можете подумать о беге DBCC CHECKCONSTRAINTS. Эта проверка не включена в DBCC CHECKDB, независимо от каких - либо параметров , которые вы можете указать. Вы также можете подумать о том, чтобы время от времени бегать CHECKDB, когда это позволяют обстоятельства.

Пол Уайт 9
источник
6

DBCC CHECKDB жизненно важен для баз данных SQL Server, чтобы быть на 100% уверенными в отсутствии коррупции. Однако из-за огромного размера баз данных очень сложно найти окно обслуживания, когда вы заявляете, что работаете 24x7. За прошедшие годы команда SQL Server внедрила различные механизмы, которые будут выявлять наиболее распространенные формы повреждений, особенно связанных с физическим повреждением, вызванным оборудованием.

SQL Server 2005 и выше имеет PAGE_VERIFY = CHECKSUM, что может помочь вам заранее обнаруживать физическое повреждение на страницах базы данных, тем самым добавляя контрольную сумму на каждую страницу, когда она записывается в систему ввода-вывода, и проверяет контрольную сумму, когда она читается с диска.

Кроме того, резервное копирование (полное или дифференциальное) с помощью CHECKSUM гарантирует обнаружение любого повреждения ввода-вывода, вызванного аппаратным обеспечением.

Следовательно, с аппаратной стороны коррупции, SQL Server хорошо обнаруживает и сообщает об этом. (Убедитесь, что вы также установили важные оповещения о коррупции ).

Это, как говорится, все еще логичное повреждение , вызванное ошибками скриблера - когда страницы в памяти повреждены либо сторонним кодом, выполняющимся внутри процесса SQL Server, либо драйверами или другим программным обеспечением с достаточными привилегиями, выполняющимися в режиме ядра Windows и / или SQL Server. Ошибки и т. Д. Не выявляются с помощью вышеуказанных методов, и, следовательно, CHECKDB входит в картину.

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

Есть какие-нибудь существующие сценарии?

Вместо того, чтобы изобретать велосипед, я настоятельно рекомендую вам взглянуть на решение Ola для проверки целостности SQL Server.

Эффективно работает DBCC CHECKDB:

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

После участия в тренинге по SQLSkills я реализовал в своей среде:

  • расставьте приоритеты по тем таблицам, которые необходимо проверить.
  • разделить таблицы на группы с различными приоритетами, а затем запустить DBCC CHECKTABLEвместе с запуском DBCC CHECKALLOCиDBCC CHECKCATALOG
  • Создайте рабочую таблицу, в которой будут храниться имена таблиц с приоритетами. Просто убедитесь, что все таблицы с высокими приоритетами (которые являются огромными) не входят в одну группу, иначе ваш CHECKDB не будет заполнен вообще.
  • Вы даже можете иметь столбец тайм-аута в своей рабочей таблице, который будет управлять, когда ваш CHECKDB будет убит, когда он пройдет окно обслуживания.
  • Добавьте, сколько времени потребовалось для каждой таблицы DBCC CHECKTABLE, DBCC CHECKALLOCи DBCC CHECKCATALOG. Чтобы вы могли понять, сколько времени обычно уходит на проверку.
  • Вы даже можете запустить с NOINDEXпараметром, так как он ускорит работу, поскольку он не проверяет некластеризованные индексы в пользовательских таблицах. Это имеет некоторые преимущества, так как не так критично, как повреждение данных, поскольку данные не теряются, и вы можете удалить и заново создать индекс, если это необходимо.

Очевидно, что редакция Enterprise может использовать преимущества параллельного выполнения операторов DBCC, но обратите внимание на настройку MAXDOP, так как она может в конечном итоге занять весь ваш ЦП. Это может быть жестко ограничено управляющим ресурсами.

Примечание. Если у вас есть столбец SPARSE, то ваш CHECKDB будет работать очень медленно, как описано здесь .

Наконец, как предотвратить повреждение базы данных, используя весь доступный набор инструментов + вашу веру в аппаратную систему сервера базы данных и, самое главное, ценность ваших данных.

Несколько отличных ссылок:

Кин Шах
источник