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. Отчёт описывает повреждения без данных, имена таблиц и колонок в нём заменены номерами.