5.1.26

Заблуждения относительно восстановления базы данных

Автор: Paul Randal, Misconceptions around database repair

На этой неделе на форумах и в Twitter было оживлённо: люди сталкиваются с множеством интересных проблем. Я заметил, что существует много заблуждений относительно запуска восстановления (repair), поэтому, чтобы завершить пятницу, я пройдусь по их списку для вас. Вот эти заблуждения, по поводу некоторых из которых мне приходилось спорить с людьми несколько раз и в конце концов прибегать к фразе «Слушайте, я писал код восстановления, мне жаль, но вы не правы», что я ненавижу делать:

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

Восстановление — опасный инструмент, и его следует использовать только в крайнем случае или для того, чтобы вернуть очень большую базу данных (VVVLDB) в онлайн потенциально гораздо быстрее, чем полное восстановление из резервной копии, когда допустима незначительная потеря данных. Это всего лишь маленький обзор кучи вещей, в которых люди ошибаются относительно восстановления.



Комментариев нет:

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