SQLite3 Восстановление данных при ошибке: образ диска базы данных искажен - PullRequest
7 голосов
/ 27 марта 2012

Фон

У меня есть поврежденная база данных, и я хочу сохранить как можно больше данных.

Я попытался выполнить дамп данных с помощью многочисленных инструментов, но безуспешно. Всегда одно и то же сообщение об ошибке:

Ошибка: образ диска базы данных искажен

Я почти уверен, что это произошло из-за сбоя питания.

подход

Теперь база данных фактически является файлом. И я думаю, можно ли так относиться к этому и попытаться сохранить как можно больше данных.

Я предполагаю, что когда БД открывается инструментом или программой, она сначала проверяет свои заголовки. В моем случае я получаю сообщение об ошибке сразу. Я предполагаю, что заголовки повреждены или не соответствуют. И из-за этого никакой инструмент не будет пытаться прочитать полезную нагрузку.

В документах http://www.sqlite.org/fileformat2.html есть пояснения по смещению заголовка.

Вопросы : Это разумный подход? И если это возможно, чтобы восстановить, изменить или обменять заголовки на поврежденной БД. И как мне это сделать?

1 Ответ

6 голосов
/ 08 сентября 2012

Несмотря на несколько ответов в нескольких потоках на SO, наоборот, Базы данных SQLite могут быть восстановлены из-за повреждения!

Я запросил обновление у команды SQLite в их FAQ (http://www.sqlite.org/faq.html#q20),, но пока есть несколько вариантов.

Часто задаваемые вопросы:

"... Если SQLITE_SECURE_DELETE не используется и VACUUM не был запущен, то часть удаленного содержимого может все еще находиться в файле базы данных, в областях, помеченных для повторного использования. Но, опять же, не существует процедур или инструментов, которыемы знаем, как помочь вам восстановить эти данные. "

и:

"... В зависимости от того, насколько сильно повреждена ваша база данных, вы можете восстановить некоторые данные с помощью интерфейса командной строки, чтобы выгрузить схему и содержимое в файл, а затем воссоздать его. К сожалению, после сбоя humpty-dumptyКак правило, его невозможно снова собрать вместе. "

На самом деле существует по крайней мере два превосходных инструмента для восстановления данных для целых баз данных SQLite и отдельных записей, и они могут помочьв случае аппаратного сбоя, ошибок программного обеспечения или человеческих проблем.Это не будет 100% нетронутым, но ситуация не безнадежно

PhotoRec с открытым исходным кодом и мультиплатформенность.Исторически он использовался для изображений и PDF-файлов, но теперь поддерживает восстановление SQLite (http://www.cgsecurity.org/wiki/File_Formats_Recovered_By_PhotoRec), вместе с 220+ двоичными типами файлов. Если база данных (или весь каталог) удалена, PhotoRec часто может восстановить файл db вдостаточно нормальное состояние для открытия и экспорта. Существуют предварительно скомпилированные версии приложения, свободно доступные для Windows, Mac и Linux.

Кроме того, коммерческий продукт Epilog от CCLКриминалистика может выполнять очень продвинутое восстановление записей, включая извлечение данных из файлов транзакций с записью в журнал записи (WAL). Это несколько сотен долларов, но это может сделать довольно удивительное восстановление данных SQLite (как собственных двоичных файлов БД, так инеобработанные образы дисков).

Оба вышеупомянутых варианта несколько раз спасли мою шкуру, поэтому мы передали это другим, кто, возможно, потерял надежду в удаленных / поврежденных базах данных SQLite (а также в подлинной экспертизе для популярных случаев использования, таких какмобильные телефоны, браузеры, адресные книги и т. д.)Если вы воспользуетесь данными / экспортируйте данные, всегда полезно проверить схемы резервного копирования и периодически запускать pragma integrity_check вместе с очисткой.

Я попросил обновить официальный FAQ, чтобы хотя бы упомянуть, что можноgoogle "sqlite recovery" или что-то в этом роде, если можно назвать другие проекты / продукты по имени.

Cheers.

...