fbrescue

fbrescue: вопросы и ответы

Можно ли достать данные из базы Firebird без сервера Firebird?

Да. fbrescue читает файл .fdb напрямую, без движка и без fbclient, и выгружает каждую таблицу в CSV, SQL (операторы INSERT) или JSON Lines. Это один бинарник для Windows, Linux и macOS. Он работает и тогда, когда база больше не открывается и gbak не может сделать бэкап. По шагам: как открыть .fdb без Firebird.

fbrescue меняет или чинит файл базы?

Нет. Он открывает файл только на чтение и никогда в него не пишет. Тест в CI запускает каждую команду на копиях настоящих баз с правами только на чтение и проверяет, что ничего не изменилось. fbrescue выгружает данные в файлы, которые вы загружаете в новую базу; оригинал он не чинит. Работайте всё равно с копией: другие инструменты, которые вы попробуете, могут в неё писать.

Какие версии Firebird поддерживаются?

Firebird 2.5, 3.0, 4.0 и 5.0 (ODS с 11.2 по 13.1), включая типы Firebird 4 (INT128, DECFLOAT, TIME и TIMESTAMP WITH TIME ZONE), BLOB и многофайловые базы. InterBase и Firebird 1.x, 2.0 и 2.1 не поддерживаются.

Это бесплатно?

Да. fbrescue — открытый код под лицензией MIT: без лицензий на базу и без ограничений на число строк или баз.

Нужно ли сначала пробовать gfix и gbak?

Да. На копии файла выполните gfix -v -full -n, затем gfix -mend -full -ignore и gbak -b -ig -g. Если бэкап прошёл и восстановился, вы получите базу целиком — с индексами, триггерами и процедурами. fbrescue нужен, когда gbak всё равно останавливается.

Чем fbrescue отличается от IBSurgeon FirstAID?

FirstAID — коммерческая программа для Windows. Она умеет чинить файл базы на месте или извлекать данные и поддерживает InterBase и старые версии Firebird. fbrescue бесплатен, только читает файл, работает в Windows, Linux и macOS и только выгружает данные из Firebird 2.5–5.0. Подробнее — в сравнении.

Что fbrescue не восстанавливает?

Индексы, триггеры, хранимые процедуры, представления, пользователей, значения генераторов и ограничения: он выгружает описания таблиц (schema.sql) и строки. Колонки-массивы пока не выгружаются. Строки на обнулённых или отрезанных от файла страницах потеряны; каждая строка, которую не удалось прочитать, перечислена в _errors.jsonl.

Можно ли вернуть удалённые или перезаписанные строки?

Часто да, если старые версии записей ещё лежат на диске и не убраны сборкой мусора. --include-deleted записывает удалённые строки в отдельный файл, а --versions all — все версии каждой строки с транзакцией и её состоянием.

Что если повреждены системные таблицы?

Таблицы, чьи описания частично потеряны, выгружаются как TABLE_<id> с колонками FIELD_<n>. Если потеряны сами форматы записей, передайте операторы CREATE TABLE этой базы через --ddl schema.sql (скрипт создания, вывод isql -x или выгрузку fbrescue, сделанную раньше), и fbrescue вычислит раскладку записей по ним.

Сколько данных удаётся восстановить?

Зависит от повреждения. На копиях тестовой базы, повреждённых 13 разными способами в Firebird 2.5–5.0, восстанавливается 100% строк при обнулённых pointer-, индексных, TIP-страницах и заголовке. При потере страниц данных — всё, кроме строк на повреждённой странице. Полная таблица — в README.

Как получить помощь, не отправляя свои данные?

Выполните fbrescue report copy.fdb и приложите вывод к issue на GitHub. Отчёт описывает повреждения без данных, имена таблиц и колонок в нём заменены номерами.

Ещё: порядок восстановления, сообщения об ошибках, скачать.