среда, 12 августа 2009 г.

"bad checksum" или чиним базу данных Firebird

Сломанная база данных Firebird 1.5 - Data.gdb (размер 95 117 312 байт).
Симптомы:
  1. При попытке подключения выводится ошибка:
  2. Unsuccessful execution caused by a system error that precludes
    successful execution of subsequent statements.database file appears corrupt ().
    bad checksum.
    checksum error on database page 23069.
  3. Утилиты gfix и IBPump падают с той же ошибкой.
  4. Сделать бэкап/рестор невозможно.
Инструменты:
  1. Любой hex-редактор
  2. Утилита IBFirstAID. Покупать ее не нужно, потребуется только бесплатный диагностический функционал.
  3. IBExpert
Решение проблемы:
Для анализа ошибки открываем БД при помощи IBFirstAID и выполняем "Database \ Diagnose". Как только завершится диагностика, получаем такой вот лог:

13.08.2009 12:28:28 INFO: Open database files: C:\Projects\Clients\96\Data.gdb
13.08.2009 12:28:28 INFO: Analyzing database low-level structures...
13.08.2009 12:28:28 INFO: Process database file #1 of 1 files.
13.08.2009 12:28:36 INFO: Actual PageCount: 23222 found in database
13.08.2009 12:28:36 ERROR: Found 1 undefined pages.
13.08.2009 12:28:36 INFO: ====== DATABASE IS READY FOR DIAGNOSING AND REPAIRING. ====
13.08.2009 12:28:36 INFO: ====== Now choose "Diagnose" or "Repair". ====
13.08.2009 12:29:22 INFO: ------------------- Starting diagnose
13.08.2009 12:29:22 INFO: Running procedure: Header page check
13.08.2009 12:29:22 INFO: ODS Major = 10 (10)
13.08.2009 12:29:22 INFO: ODS Minor = 1
13.08.2009 12:29:22 INFO: Next transaction = 7192198
13.08.2009 12:29:22 INFO: Oldest transaction = 7192158
13.08.2009 12:29:22 INFO: Oldest active = 7192159
13.08.2009 12:29:22 INFO: Oldest snapshot = 7191770
13.08.2009 12:29:22 INFO: PageSize is Ok = 4096
13.08.2009 12:29:22 INFO: Header page check: Ok
13.08.2009 12:29:22 INFO: Running procedure: Checking of RDB$Pages consistency
13.08.2009 12:29:24 ERROR: Possible error in next TIP page
13.08.2009 12:29:24 ERROR: Error in RDB$pages - wrong (missing?) page #23069 pageType = 3 pageSequence = 441 relationID = 0
13.08.2009 12:29:24 INFO: RDB$Pages checking: found 1 errors
13.08.2009 12:29:24 INFO: Running procedure: Low-level check of all relations
...

Из данного лога делаем выводы:
  1. Размер страницы БД - 4096:
  2. 13.08.2009 12:29:22 INFO: PageSize is Ok = 4096
  3. Найдена одна битая страница под номером 23069, ее тип - 03:
  4. 13.08.2009 12:28:36 ERROR: Found 1 undefined pages.
    13.08.2009 12:29:24 ERROR: Possible error in next TIP page
    13.08.2009 12:29:24 ERROR: Error in RDB$pages - wrong (missing?) page #23069 pageType = 3 pageSequence = 441 relationID = 0
    13.08.2009 12:29:24 INFO: RDB$Pages checking: found 1 errors


Открываем БД в hex-редакторе (я использовал biew). Переходим по смещению битой таблицы. Чтобы вычислить смещение, нужно номер страницы умножить на размер страницы:

23069 * 4096 = 94490624 (0x5A1D000)

Внимательно изучаем заголовок страницы основываясь на информации отсюда:


  1. Тип страницы не соответствует (ожидается 03, а имеем - 01)
  2. Контрольная сумма никак не может равняться 0x303C, т.к. в текущей версии ODS контрольная сумма всегда равна 0x3039 (12345)
Вносим изменения в БД:


Теперь необходимо выполнить ремонт БД основываясь на вот этой статье: http://ibase.ru/devinfo/db_repair.htm

Все, база данных починена и полностью работоспособна.

1 комментарий:

logros комментирует...

Добрый день, прошу помощи по восстановлению базы gdb, так случилось на работе а там работа за год(((, опыта и понимания процесса восстановления нет.
Вот что смог сделать:
лог с IBSergion
15:01:33 DEBUG: Checking LIST_VYC (137)...
15:01:33 Data page check: Undefined page type for pagenum = 12367
15:01:33 ERROR: Data page#12367 has critical errors
15:01:33 ERROR: Error on data page #12367
15:01:33 INFO: Pointer page #5814 checking: found 1 errors.
15:01:33 ERROR: Error in checking relation #137 Found 1 errors.
15:01:33 ERROR: Relation LIST_VYC (137) is CORRUPT

логин пароль стандартные, заранее благодарен.

ССылка на файл базы
https://mega.dp.ua/RywNKmVe

За помощь готов оплатить.Заранее благодарен.