Заметка
Поскольку для выполнения этой процедуры Firefox должен быть закрыт, обязательно откройте эту страницу в другом веб-браузере или распечатайте ее, прежде чем продолжить.
После нескольких часов работы, пытаясь восстановить базу данных Places, даже читая исходный код Firefox, мне удалось добиться успеха. Вот как я это сделал:
- Загрузите последнюю версию оболочки SQLite и распакуйте ее в папку своего профиля. В Windows Vista и Windows 7 он находится в
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
папке. - Закройте Firefox, если он запущен.
- База данных Places находится в
places.sqlite
файле. Если файл был заменен из-за повреждения, используйтеplaces.sqlite.corrupt
файл для восстановления. Создайте резервную копию файла с именемplaces.sqlite.bak
илиplaces.sqlite.corrupt.bak
. - Используйте оболочку SQLite, чтобы открыть файл базы данных (
sqlite3 places.sqlite
илиsqlite3 places.sqlite.corrupt
), затем введите:
.output dump.sql -- sends output to file dump.sql .dump -- dumps database to file
Поскольку база данных повреждена, результирующий дамп базы данных не завершен, и не все восстановимые данные были получены. Чтобы определить, где произошла ошибка, найдите слово
ERROR
(все заглавные буквы) в комментарии SQL внутри файла дампаdump.sql
(для этого я использовал Notepad ++ ) и прочитайте приведеннуюINSERT
выше команду SQL, чтобы определить нужную таблицу. В моем случае поврежденный стол естьmoz_places
. (Описание таблиц, найденных в базе данных Адресов можно найти здесь, довольно устаревшую схему ER можно найти здесь . Я объясню, как восстановить дополнительные данные только из этой таблицы, следующая процедура, вероятно, не применима для других таблицы, поэтому пропустите эти подэтапы, если таблица, кромеmoz_places
вовлечен.)- Каждая строка в
moz_places
таблице имеет идентификатор. Строки выгружаются из таблицы в следующем порядке. 1 ID - это первое значение после открывающей скобки вINSERT
операторе. Область, где база данных повреждена, вероятно, будет небольшим блоком строк в этой таблице; Идея в том, чтобы пропустить эту поврежденную область и восстановить как можно больше данных. Начальная область такого блока представлена в дампе как строка перед появлениемERROR
комментария. Используя идентификатор этой строки, мы можем определить, где повреждена база данных. Мы делаем это, используяSELECT
операторы с идентификатором в качестве условия; этот процесс требует проб и ошибок. Например, если последний идентификатор перед ошибкой был 49999, а ошибка следует, поврежденный блок начинается с идентификатора 50000. Используйте такие выражения, как:
- подавить ненужный вывод - следующая команда для систем Windows - для Linux и других Unix и Unix-подобных систем используйте .output / dev / null .output NUL ВЫБЕРИТЕ id ИЗ moz_places WHERE id> = 50100;
- Отрегулируйте значение после
id >=
и повторяйте приведенную вышеSELECT
команду, пока не найдете наименьшее значение, которое не приводит к ошибке SQLite. Это идентификатор, который относится к строке, начиная с которой мы можем восстановить дополнительные данные. Предположим, этот идентификатор равен 50200. Чтобы вывести эти данные, введите:
.output dump2.sql .режим вставки SELECT * FROM moz_places WHERE id> = 50200; - восстановить нормальное поведение на выходе .output stdout .mode list
- Обратите внимание, что
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
):- Firefox 50: схема версии 33
- Firefox 51: схема версии 34
- Firefox 52: схема версии 35
- Firefox 53: схема версии 36
- Firefox 57: схема версии 39
- Firefox 58: схема версии 41
- Firefox 60: схема версии 43
- Firefox 61: схема версии 47
PRAGMA page_size = 4096; PRAGMA user_version = <версия>;
- Выйдите из оболочки SQLite, удалите
places.sqlite
и запустите оболочку SQLite, создав пустуюplaces.sqlite
базу данных с помощьюsqlite3 places.sqlite
. Введите,.read dump.sql
чтобы загрузить дамп SQL в базу данных. - Запустите Firefox и убедитесь, что ваша история и адресная строка работают так, как задумано. Убедившись, что все в порядке, удалите файлы дампа базы данных и исполняемый файл оболочки SQLite из папки профиля.
Более актуальная информация может быть найдена на следующих страницах:
1 SQL обычно не гарантирует, что выходные данные базы данных будут передаваться в любом порядке, если вы не используете ORDER BY
предложение. Однако, ORDER BY
вероятно, не удастся произвести какие-либо выходные данные в поврежденной базе данных (поскольку SQLite потребуется прочитать всю таблицу, прежде чем он сможет произвести какие-либо выходные данные). Насколько я знаю, Firefox всегда пишет moz_places
записи в таблице с последовательными идентификаторами, поэтому мы можем предположить, что весь вывод упорядочен по идентификатору.