Заметка
Поскольку 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
ВЫБЕРИТЕ 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, следующим образом (это можно найти в исходном файле Firefox toolkit/components/places/Database.cpp
):
- Firefox 52: схема версии 35
- Firefox 53: схема версии 36
- Firefox 57: схема версии 39
- Firefox 58: схема версии 41
- Firefox 60: схема версии 43
- Firefox 61: схема версии 47
- Firefox 62: схема версии 52
- Firefox 69: схема версии 53
PRAGMA user_version = <версия>;
PRAGMA journal_mode = truncate;
PRAGMA page_size = 32768;
VACUUM;
PRAGMA journal_mode = wal;
- Выйдите из оболочки SQLite, удалите
places.sqlite
и запустите оболочку SQLite, создав пустую places.sqlite
базу данных с помощью sqlite3 places.sqlite
. Введите, .read dump.sql
чтобы загрузить дамп SQL в базу данных.
- Запустите Firefox и убедитесь, что ваша история и адресная строка работают так, как задумано. Как только вы подтвердите, что все в порядке, удалите файлы дампа базы данных и исполняемый файл оболочки SQLite из папки профиля.
Более актуальная информация может быть найдена на следующих страницах:
Упрощенная процедура описана в этой статье MDN, но я не проверял ее. Тем не менее, я включил обновленные PRAGMA
команды из этой статьи.
1 SQL обычно не гарантирует, что выходные данные базы данных будут передаваться в любом порядке, если вы не используете ORDER BY
предложение. Однако, ORDER BY
скорее всего, не получится выводить данные из поврежденной базы данных (так как SQLite потребуется прочитать всю таблицу, прежде чем он сможет произвести какой-либо вывод). Насколько я знаю, Firefox всегда пишет moz_places
записи в таблице с последовательными идентификаторами, поэтому мы можем предположить, что весь вывод упорядочен по идентификатору.