У меня были некоторые проблемы с оперативной памятью (несколько раз синий экран, Windows XP), и теперь мои базы данных Firefox повреждены. Firefox работает, но моя история ушла , и это отчет несколько несоответствий и ошибок при выполнении pragma integrity_check
на places.sqlite
:
образ диска базы данных искажен
Теперь вопрос, как мне восстановить базы данных SQLite?
Ответы:
Заметка
Поскольку Firefox должен быть закрыт для выполнения этой процедуры, обязательно откройте эту страницу в другом веб-браузере или распечатайте ее, прежде чем продолжить.
После нескольких часов работы, пытаясь восстановить базу данных Places, даже читая исходный код Firefox, мне удалось добиться успеха. Вот как я это сделал:
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
папке.places.sqlite
файле. Если файл был заменен из-за повреждения, используйтеplaces.sqlite.corrupt
файл для восстановления. Создайте резервную копию файла с именемplaces.sqlite.bak
илиplaces.sqlite.corrupt.bak
.sqlite3 places.sqlite
илиsqlite3 places.sqlite.corrupt
), затем введите:Поскольку база данных повреждена, результирующий дамп базы данных не завершен, и не все восстановимые данные были получены. Чтобы определить, где произошла ошибка, найдите слово
ERROR
(все заглавные буквы) в комментарии SQL внутри файла дампаdump.sql
(для этого я использовал Notepad ++ ) и прочитайте команду SQLINSERT
над ним, чтобы определить нужную таблицу. В моем случае поврежденный стол естьmoz_places
. (Описание таблиц, найденных в базе данных Places, можно найти здесь , включая устаревшую диаграмму ER.) Я объясню, как восстановить дополнительные данные только из этой таблицы; следующая процедура, вероятно, неприменима для других таблиц, поэтому пропустите эти подэтапы, если для этого используется другая таблицаmoz_places
.)moz_places
таблице имеет идентификатор. Строки выгружаются из таблицы в следующем порядке. 1 ID - это первое значение после открывающей скобки вINSERT
операторе. Область, где база данных повреждена, вероятно, будет небольшим блоком строк в этой таблице; Идея в том, чтобы пропустить эту поврежденную область и восстановить как можно больше данных. Начальная область такого блока представлена в дампе как строка перед появлениемERROR
комментария. Используя идентификатор этой строки, мы можем определить, где повреждена база данных. Мы делаем это, используяSELECT
операторы с идентификатором в качестве условия; этот процесс требует проб и ошибок. Например, если последний идентификатор перед ошибкой был 49999, а ошибка следует, поврежденный блок начинается с идентификатора 50000. Используйте такие выражения, как:id >=
и повторяйте приведенную вышеSELECT
команду, пока не найдете наименьшее значение, которое не приводит к ошибке SQLite. Это идентификатор, который относится к строке, начиная с которой мы можем восстановить дополнительные данные. Предположим, этот идентификатор равен 50200. Чтобы вывести эти данные, введите:INSERT
операторы вdump2.sql
файле начинаются сINSERT INTO table VALUES
, поэтому используйте функцию поиска и замены в текстовом редакторе, чтобы заменить все экземпляры этой строки наINSERT INTO moz_places VALUES
.dump2.sql
файла и вставьте его вdump.sql
файл, гдеERROR
появляется комментарий.ROLLBACK; -- due to errors
в конце файла наCOMMIT;
.dump.sql
файла. Замените его<version>
на правильное значение, которое требуется для Firefox, чтобы определить версию схемы базы данных на основе версии Firefox, следующим образом (это можно найти в исходном файле Firefoxtoolkit/components/places/Database.cpp
):places.sqlite
и запустите оболочку SQLite, создав пустуюplaces.sqlite
базу данных с помощьюsqlite3 places.sqlite
. Введите,.read dump.sql
чтобы загрузить дамп SQL в базу данных.Более актуальная информация может быть найдена на следующих страницах:
Упрощенная процедура описана в этой статье MDN, но я не проверял ее. Тем не менее, я включил обновленные
PRAGMA
команды из этой статьи.1 SQL обычно не гарантирует, что выходные данные базы данных будут передаваться в любом порядке, если вы не используете
ORDER BY
предложение. Однако,ORDER BY
скорее всего, не получится выводить данные из поврежденной базы данных (так как SQLite потребуется прочитать всю таблицу, прежде чем он сможет произвести какой-либо вывод). Насколько я знаю, Firefox всегда пишетmoz_places
записи в таблице с последовательными идентификаторами, поэтому мы можем предположить, что весь вывод упорядочен по идентификатору.источник
Ну, в зависимости от того, насколько он поврежден, ремонт может быть невозможен. Лучше всего, вероятно, попытаться сбросить дб с помощью
sqlite
, а затем посмотреть, что вы можете спасти.Если это не удастся, вам, вероятно, придется восстановить из резервной копии.
Чтобы создать дамп и восстановить базу данных, используйте команду
.dump
:источник
d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db
. Все значки теперь исчезли, но я перестраиваю их, когда посещаю сайты. Еще раз спасибо!places.sqlite.corrupt
файл. Я отправил другой ответ с решением, которое работало для меня.Как и всегда, выполняя подобное восстановление, я рекомендую сначала сделать хотя бы одну резервную копию файла place.sqlite, расположенного в каталоге вашего профиля. Наличие резервной копии позволяет вам попробовать различные способы устранения таких проблем, зная, что если попытка восстановления ухудшит ситуацию, вы всегда можете сделать еще одну копию резервной копии, чтобы повторить попытку.
В зависимости от того, что повреждено и насколько сильно оно повреждено, может быть возможно исправить проблемы с расширением Places Maintenance . Я несколько раз получал испорченный файл place.sqlite. Обслуживание мест было в состоянии решить проблему каждый раз, выполняя различные проверки / исправления, которые он предоставляет как операции в своем диалоге параметров. Различные проверки и / или отчеты должны занимать от нескольких минут до нескольких минут.
Если это не сработает, то может потребоваться переход на путь ручного исправления таким образом, который описан выше в DragonLord.
источник
Этот процесс, описанный в MDN, помог мне решить проблему, когда новые страницы, которые я посетил, не были записаны в истории браузера. У меня не было
places.sqlite.corrupt
(илиplaces.sqlite-corrupt
) файла, но проверка целостности моегоplaces.sqlite
файла показала ошибку в образе диска базы данных .Выйдите из Firefox и сделайте резервную копию своего профиля Firefox, прежде чем идти дальше.
Запустите Firefox. История должна работать снова.
Я на Mac с Firefox 60.0.1. Возможно, вам придется настроить команды для вашей платформы.
источник