Возникновение ошибок в процессе бэкапа связано с повреждением самой базы данных или данных внутри нее.
Типы повреждений баз данных:
1. Отключение питания компьютера
2. Поломки/неисправности оборудования
1. ОЗУ
2. Винчестера
3. контроллеры
4. другие программы
3. Сбой компьютера
4. Прерывание сборки мусора
5. Повреждения индексов
6. Повреждения таблиц данных
Работу будем вести с не забэкапленой последней копией базы. Оригинальную базу излишний раз тревожить ненужно.
Полный разбор ситуации:
Определиться с чем имеем дело: смотрим firebird.log
По имеющимся ошибкам идем в гугль и смотрим описания ошибок. Так же важна история возникновения ошибок. Если разовая — то скорее всего скакнул свет или однократный сбой оборудования. Если повторялись — то это уже вопрос к винчестерам или неоднократный сбой оборудования. Ну это уже вопросы к наблюдательности админа сервера.
После чего прогоняем gfix:
[путь к gfix]\gfix -user SYSDBA -pass masterkey -v -full database.fdb
Если ничего не показал — то это живая БД )) Но чаще всего это не так. Будем лечить.
Если выдаются ошибки checksum error:
[путь к gfix]\gfix -user SYSDBA -pass masterkey -v -ignore database.fdb
Если предыдущая команда обнаружила ошибки, то нужно их исправить командой.
[путь к gfix]\gfix -user SYSDBA -pass masterkey -mend database.fdb
ключ -mend помечает поврежденные структуры как исключаемые при backup. В итоге целостность между таблицами может быть нарушена, и даже если после этого backup пройдет, может случиться, что базу данных получится восстановить из backup. В этом случае придется вручную снимать данные при помощи утилит типа IBPump.
Проверим, все ли починилось:
[путь к gfix]\gfix -user SYSDBA -pass masterkey -v -full database.fdb
Если на этот момент вы все еще видите ошибки, то нужно сделать backup, при этом обязательно отключать уборку мусора (ключ -g):
[путь к gbak]\gbak -user SYSDBA -pass masterkey -b -v -ig -g database.fdb database.fbk
ключ -ig игнорирует ошибки при чтении структур данных, и пытается записать в backup все неповрежденные структуры и данные. Не указывайте ключ -ig при стандартном бэкапе.
Попытаемся развернуть бэкап:
[путь к gbak]\gbak -user SYSDBA -pass masterkey gbak -c -v database.fbk new.fdb
Бывает, что после всех операций распаковка не получается. Бывает, что ошибки остаются. В этих случаях можно попытаться отработать программой IB Surgeon. Более серьезная программа, хорошо справляется с большинством ошибок, но к сожалению платная. Про нее в следующих статьях.
Если бэкап сваливается на попытке закоммитить индексы можно попробовать точечное восстановление.
Как известно, восстановление базы данных из бэкапа происходит следующим образом:
1. gbak дает команду серверу создать новую БД с параметрами из бэкапа.
2. gbak копирует в новую базу пользовательские метаданные из бэкапа.
3. gbak копирует в новую базу пользовательские данные из бэкапа.
4. gbak коммитит (создает) все индексы.
Поскольку индексы создаются в самом конце процесса restore, то ошибки при их создании не являются смертельными для функционирования БД (хе-хе, ну все зависит от самой базы
), разве что без индексов запросы будут работать очень медленно. Во всех версиях InterBase и Firebird (кроме Firebird 2.x) при первой же ошибке создания индекса дальнейшее создание индексов обрывается. В Firebird 2.x ошибка создания индекса сообщается, но создание других индексов продолжается, что позволяет легко идентифицировать неактивные индексы по окончании restore.
Точечное восстановление:
Дубликаты в уникальных индексах: Соответственно, при наличии дубликатов в уникальном индексе нужно эти дубликаты найти, а затем удалить.
Отсутствующие записи по Foreign key:Нужно выполнить запрос, который покажет имеющиеся в детали и отсутствующие в мастере идентификаторы.
Затем можно или записи с этими идентификаторами удалить из таблицы деталей, либо добавить соответствующие записи в таблицу-мастер.
Оригинал статьи: http://www.ibase.ru/devinfo/db_repair.htm
Popularity: 37%
Метки:firebird, Работа, работа, ремонт баз данныхСвязанные записи
Tags: firebird, работа, ремонт баз данных
Полностью солидарен с 3ым коментарием. Оно того стоит...
Нормально, можно cделать маленький сборник.
Ну, сборник — не сборник — а вот книжку я всетки лелелю))
Попробую, попозже отпишусь.
Интересно, я попробую.
Хорошая масль, вообще молодцы!
Последний абзац в тему!
Хм... После прочтения даже мне тема стала интересна.
Интересный пост, спасибо. Меня интересует вопрос — будет ли продолжение?
У меня совсем скоро в букмарках место закончится, но я буду рад добавлять с вашего блога и дальше ссылочки на интересные темы!