На этой неделе на форумах и в Twitter было оживлённо: люди сталкиваются с множеством интересных проблем. Я заметил, что существует много заблуждений относительно запуска восстановления (repair), поэтому, чтобы завершить пятницу, я пройдусь по их списку для вас. Вот эти заблуждения, по поводу некоторых из которых мне приходилось спорить с людьми несколько раз и в конце концов прибегать к фразе «Слушайте, я писал код восстановления, мне жаль, но вы не правы», что я ненавижу делать:
- Восстановление не приводит к потере данных. Это смотря при каких обстоятельствах. Если вам приходится использовать REPAIR_ALLOW_DATA_LOSS, то вы потеряете данные. Именно поэтому опция так и названа – серьёзно.
- Восстановление следует запускать по умолчанию. Нет. Сначала разберитесь, что пошло не так, прежде чем решать, что делать. Если у вас повреждён кластерный индекс размером 1 ТБ, он будет перестроен в процессе восстановления. Если у вас нет дополнительного дискового пространства в 1 ТБ, операция завершится неудачей, и вы вернётесь к исходной точке после часов бесплодных усилий. Возможно, вам удастся обойтись чем-то, что не требует (по сути) отключения базы данных.
- Можно запустить восстановление без выполнения DBCC CHECKDB. Нет. Восстановление — это опция для одной из команд проверки согласованности (DBCC CHECKALLOC, DBCC CHECKTABLE или DBCC CHECKDB – обратите внимание, что DBCC CHECKFILEGROUP и DBCC CHECKCATALOG не поддерживают восстановление).
- Как только вы запустили восстановление, всё в порядке. Нет. Вы всегда должны запускать DBCC CHECKDB повторно после восстановления, чтобы убедиться, что первое восстановление исправило всё. Иногда повреждение мешает выполнению некоторых глубоких проверок, и когда оно исправлено, следующий запуск DBCC CHECKDB может выполнить более глубокую проверку и найти новые повреждения. Я называю это «маскировкой повреждения». Другая причина в том, что восстановление, вероятно, просто удалило часть ваших данных. Как это повлияет на приложение? Что, если это данные медицинских пациентов? Или страховые записи? Или детали банковских счетов?
- Восстановление всегда может исправить всё. Нет. Есть вещи, которые DBCC CHECKDB не может исправить. См. список в статье CHECKDB From Every Angle: Can CHECKDB repair everything?.
- Восстановление безопасно использовать для системных баз данных. Нет. Его нельзя использовать для master или tempdb, потому что их нельзя перевести в однопользовательский режим. Вы можете сделать это для model, но вряд ли это будет иметь эффект, так как в model нет пользовательских таблиц (если только вы их не создадите), а системные таблицы обычно не восстанавливаются. Вы можете запустить его для msdb, но это может иметь странные побочные эффекты. См. Is running repair on msdb safe?.
- Восстановление можно запускать в режиме online. Нет. Восстановление всегда выполняется в режиме offline, то есть база данных должна находиться в однопользовательском режиме.
- REPAIR_REBUILD исправит всё. Нет. REPAIR_REBUILD исправляет только проблемы в некластерных индексах. В версии 2005 и новее REPAIR_FAST вообще ничего не делает.
- Восстановление на издателе (Publisher) репликации распространяется на подписчиков (Subscribers). Нет. Любые действия, выполненные восстановлением, НЕ помечаются для репликации. Вы должны повторно инициализировать своих подписчиков, если восстановили издателя.
- Восстановление всегда исправляет ограничения. Нет. Оно не имеет представления о существовании ограничений. После восстановления базы данных с ограничениями вам следует запустить DBCC CHECKCONSTRAINT, чтобы убедиться, что они всё ещё действительны.
- Восстановление пытается сохранить данные. Нет. Оно не прилагает особых усилий для удаления данных, но и не стремится сохранить данные в большинстве случаев. «Удалить то, что сломано, и исправить все связи» — это моё краткое объяснение того, что делает восстановление. Исправить всё как можно быстрее и максимально доказательно правильно.
- Восстановление в режиме EMERGENCY всегда сработает. Нет. Я видел случаи, когда что-то сломанное в файловой системе вызывало его сбой. Не полагайтесь на восстановление.
- Восстановление можно отменить. Это смотря при каких обстоятельствах. Если вы начали явную транзакцию, то можете откатить всё, если вам не понравился результат. Однако люди редко так делают. Восстановление в режиме EMERGENCY никогда не может быть отменено.
Восстановление — опасный инструмент, и его следует использовать только в крайнем случае или для того, чтобы вернуть очень большую базу данных (VVVLDB) в онлайн потенциально гораздо быстрее, чем полное восстановление из резервной копии, когда допустима незначительная потеря данных. Это всего лишь маленький обзор кучи вещей, в которых люди ошибаются относительно восстановления.

Комментариев нет:
Отправить комментарий