Заметка
Поскольку для выполнения этой процедуры 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++) и прочитайте над ним команду SQL INSERT
чтобы определить нужную таблицу. , В моем случае поврежденная таблица - это moz_places
. (Описание таблиц, найденных в базе данных Places, можно найти здесь ; довольно устаревшую диаграмму ER можно найти здесь . Я объясню, как восстановить дополнительные данные только из этой таблицы; следующая процедура, вероятно, неприменима для других таблиц, поэтому пропустите эти подэтапы, если используется таблица, отличная от moz_places
.)
- Каждая строка в таблице
moz_places
имеет идентификатор. Строки выгружаются из таблицы в следующем порядке. 1 ID - это первое значение после открывающей скобки в INSERT
. Область, где база данных повреждена, вероятно, будет небольшим блоком строк в этой таблице; Идея в том, чтобы пропустить эту поврежденную область и восстановить как можно больше данных. Зона старта такого блока представлена на свалке в строке до появления ERROR
комментария. Используя идентификатор этой строки, мы можем определить, где повреждена база данных. Мы делаем это, используя SELECT
с идентификатором в качестве условия; этот процесс требует проб и ошибок. Например, если последний идентификатор перед ошибкой был 49999, а ошибка следует, поврежденный блок начинается с идентификатора 50000. Используйте заявления как:
- подавить ненужный вывод - следующая команда для систем Windows - для Linux и других Unix и Unix-подобных систем используйте .output /dev /null .output NUL SELECT id ОТ moz_places WHERE id> = 50100;
- Отрегулируйте значение, следуя
id >=
и повторяйте указанную выше команду SELECT
пока не найдете наименьшее значение, которое не приводит к ошибке SQLite. Это идентификатор, который относится к строке, начиная с которой мы можем восстановить дополнительные данные. Давайте предположим, что этот идентификатор 50200. Чтобы вывести эти данные, введите:
.output dump2.sql .mode insert 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, следующим образом (это можно найти в наборе инструментов исходного файла Firefox toolkit/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=<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
с последовательными идентификаторами, поэтому мы можем предположить, что весь вывод упорядочен по идентификатору.