Оценка повреждений базы данных с помощью IBFirstAID Diagnostician

support@ibase.ru, 27.02.2009, upd 26.06.2017

Иногда при повреждении базы данных СУБД InterBase или Firebird штатные средства ремонта (gfix) не помогают. Это может происходить по разным причинам – поврежден заголовок базы данных, повреждено много страниц, и т. д.

В таком случае рекомендуется использовать бесплатный инструмент IBFirstAid Diagnostitian от IBSurgeon (www.ib-aid.com), функциональность которого является частью платного инструмента для ремонта баз данных IBFirstAid.
 
Внимание! В 2013 году была выпущена версия 3.5, в которой данный модуль называется FirstAid Direct. Кроме диагностирования он выполняет так же и ремонт (при условии покупки лицензии для ремонта. диагностирование бесплатно).
Внимание! В 2017 году модули Direct и Extractor были объединены в одно приложение. Лог диагностирования можно получить через меню Direct/Direct Diagnose. После выполнения этого пункта лог будет находиться справа, на закладке DirectFix.

Этот инструмент работает только на Windows, поэтому если поврежденная база данных находится на Linux или другой Unix-системе, нужно файл БД как можно быстрее перенести на компьютер с IBFirstAid Diagnostitian.

Инструменту не требуется наличие СУБД InterBase или Firebird, т. к. он проверяет файл БД самостоятельно (поддерживаются все существующие форматы БД InterBase 4.0 и выше и Firebird 1.0 и выше).

Первое, что нужно сделать, это открыть базу данных в IBFirstAid. При этом он просканирует БД и попытается определить степень повреждения БД.

Например, вывод может быть следующим:
02.09.2008 18:32:20 INFO: Open database files: C:\DIR\DATA.GDB
02.09.2008 18:32:20 INFO: Analyzing database low-level structures...
02.09.2008 18:32:20 INFO: Process database file #1 of 1 files.
02.09.2008 18:32:22 INFO: Actual PageCount: 55872 found in database
02.09.2008 18:32:22 ERROR: Found 787 undefined pages.
02.09.2008 18:32:22 INFO:  ====== DATABASE IS READY FOR DIAGNOSING AND REPAIRING. ====
02.09.2008 18:32:22 INFO:  ====== Now choose "Diagnose" or "Repair".         ====

Здесь IBFirstAid Diagnostitian (далее IBFA) обнаружил что в БД 55872 страниц, и при этом найдено 787 undefined pages (неопределенных страниц).  Надо отметить что в Firebird 2.1 и выше, или в базах InterBase 2007/2009 с преаллокированием, undefined pages будут всегда, так как Firebird и InterBase дописывают пустое место в конце файла заранее (Firebird – периодически во время работы, InterBase – при задании преаллокирования пространства при создании БД или восстановлении резервной копии), поэтому информация о количестве страниц будет выводиться не в виде ошибки, а виде сообщения:
02.09.2008 18:32:22 INFO: Found 787 undefined pages.

"Неопределенные страницы" – это те страницы БД, которые есть в базе данных, но внутренние структуры БД на них не указывают. Например, в неповрежденной БД это могут быть просто пустые страницы, в настоящее время свободные от данных. В поврежденной БД это могут быть как пустые страницы, так и страницы с данными, взаимосвязь которых с внутренней структурой потеряна в результате повреждения.

Если вы видите, что количество undefined pages составляет более 15% от общего числа страниц в БД, то это может означать, что соответствующая часть данных в БД повреждена. При количестве неопределенных страниц более 50% база считается практически потерянной (исключая преаллокированную пустую базу InterBase 2007/2009).

Однако, если количество undefined pages невелико, то сообщение о "неопределенных страницах" можно считать просто информационным.

Далее, необходимо нажать кнопку Diagnose – IBFA проверит все структуры БД на целостность и взаимосвязанность. База данных размером ~10 гигабайт на среднем компьютере (2Ghz, 2Gb RAM) проверится примерно за 20-40 минут (время очень сильно зависит от «плотности данных»).

После проверки можно приступать к изучению лога. Лучше всего нажать на кнопку Detailed Log, и сохранить все логи на диск, нажав кнопку Save All. При этом на диск будет сохранен файл diagnostics_all.log.

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

Итак, открываем diagnostics_all.log любым средством для просмотра текстовых файлов (например, Блокнотом), и ищем слово CORRUPT.

IBFA проверяет только таблицы (а также другие структуры БД), но не индексы. Индексы можно перестроить после ремонта БД, поэтому они не так важны. Важнее всего данные. И важно определить, какие таблицы повреждены, и насколько.

Итак, например, мы нашли в логе сообщение
11:39:50 ERROR: Relation NNNNNN (142) is CORRUPT

Если вместо NNNNNN вы видите настоящее имя таблицы, то по крайней мере это говорит о том, что системная таблица rdb$relations не повреждена. Если же вместо имени таблицы написано NOT FOUND, то это означает, что повреждены системные таблицы, и возможность ремонта такой БД находится под большим вопросом. Ремонт БД с поврежденными системными таблицами может быть осуществлен двумя способами:
  1. ручной ремонт IBSurgeon/iBase.ru (имеется ряд ограничений).
  2. автоматический ремонт БД, если поврежденная база данных находилась под контролем инструмента FBDataGuard.
В остальных случаях можно считать, что ремонт базы данных невозможен, т. к. невозможно установить как минимум оригинальные имена таблиц, не говоря о том, что в такой БД могут быть повреждены и другие системные таблицы.

Если же имя таблицы показывается корректно, то можно посмотреть лог выше сообщения CORRUPT. Там могут быть перечислены следующие ошибки:
11:39:50 INFO: Pointer page #anchor_200 checking: found 8 errors.
Это означает, что примерно 8 страниц данной таблицы повреждены и не могут быть восстановлены. В зависимости от размера страницы на каждой из страниц может находиться от 0 до несколько десятков записей.

Так, путем поиска слова CORRUPT, переходим от одной таблицы к другой, и оцениваем, сколько данных и в каких таблицах повреждено.

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

Полная версия IBFirstAid позволяет ремонтировать в автоматическом режиме более 70% наиболее часто встречающихся повреждений БД.

Но для получения точного ответа лучше обратиться в IBSurgeon/iBase.ru для проведения бесплатной оценки возможности починки – для этого заполните форму на сайте http://www.ib-aid.com/services/IBSurgeonSupport или отправьте email с логом на адрес support@ibase.ru.

Подпишитесь на новости Firebird в России

Подписаться