Симптомы:
- При попытке подключения выводится ошибка:
- Утилиты gfix и IBPump падают с той же ошибкой.
- Сделать бэкап/рестор невозможно.
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.
- Любой hex-редактор
- Утилита IBFirstAID. Покупать ее не нужно, потребуется только бесплатный диагностический функционал.
- 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
...
Из данного лога делаем выводы:
- Размер страницы БД - 4096:
- Найдена одна битая страница под номером 23069, ее тип - 03:
13.08.2009 12:29:22 INFO: PageSize is Ok = 4096
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)
Внимательно изучаем заголовок страницы основываясь на информации отсюда:
- Тип страницы не соответствует (ожидается 03, а имеем - 01)
- Контрольная сумма никак не может равняться 0x303C, т.к. в текущей версии ODS контрольная сумма всегда равна 0x3039 (12345)
Теперь необходимо выполнить ремонт БД основываясь на вот этой статье: http://ibase.ru/devinfo/db_repair.htm
Все, база данных починена и полностью работоспособна.