Как восстановить поврежденную базу данных Firefox place.sqlite?

19739
Bobby

У меня были некоторые проблемы с моей оперативной памятью (синий экран несколько раз, Windows XP), и теперь мои базы данных Firefox повреждены. Firefox работает, но моя история ушла, и это отчет несколько несоответствий и ошибок при выполнении pragma integrity_checkна places.sqlite:

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

Теперь вопрос, как мне восстановить базы данных SQLite?

15
Для дальнейшего использования FEBE (Расширение резервного копирования среды Firefox) может быть полезным в будущем. Копирует весь профиль и упаковывает его в одну резервную копию. Я знаю, что это не отвечает на ваш вопрос, но это может быть полезно знать в будущем. http://bit.ly/aumThw Urda 14 лет назад 2
Отредактировано, чтобы помочь Googlers найти этот вопрос. bwDraco 9 лет назад 0

4 ответа на вопрос

22
bwDraco

Заметка

Поскольку для выполнения этой процедуры 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, следующим образом (это можно найти в исходном файле 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 = <версия>; 
  • Выйдите из оболочки 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записи в таблице с последовательными идентификаторами, поэтому мы можем предположить, что весь вывод упорядочен по идентификатору.

Это чистая удивительность. Помог мне восстановить почти всю историю с испорченных мест. Большое спасибо!! Ashutosh Jindal 10 лет назад 3
Это помогло, с двумя модификациями: 1) добавить ";" в строке user_version; 2) по какой-то причине мой «испорченный» файл имел версию схемы, которая оказалась «на один меньше», чем ожидалось. После того, как ваш метод изначально не работал, я попытался импортировать дамп в новую базу данных размером 10 МБ и потерпел неудачу, потому что в старой таблице было на один столбец меньше. Просмотр ссылки на исходный код позволил мне понять, что происходит. Офигенный пост !!! Tilman Hausherr 9 лет назад 0
@TilmanHausherr: Адресовано. Чтобы избежать проблемы изменения столбца, обязательно следуйте инструкциям в этом ответе, как только вы заметите повреждение и перед обновлением Firefox, чтобы схема базы данных не изменилась. Вы также можете попробовать установить более старую версию схемы - Firefox обновит ее до новой версии при восстановлении базы данных. bwDraco 9 лет назад 0
Установка предыдущей версии схемы - это то, что я сделал, когда писал свой первый комментарий, т.е. я уже был успешным :-) Да, я подозреваю, что не сразу заметил повреждение, я обычно замечаю его только при вводе символов, которые должны сделать появляется «старый URL» и ничего не происходит. Tilman Hausherr 9 лет назад 0
Превосходная работа! Рад, что вы обновили его, что вернуло его в активные вопросы, где я его заметил. fixer1234 9 лет назад 0
В файле дампа не было ошибок, но когда я попытался воссоздать базу данных с помощью .read dump.sql, я получил сообщения об ошибках «дубликаты записей», которые мне удалось найти и удалить. Поэтому стоит запустить команду .read dump.sql, чтобы увидеть, выделяет ли это проблемную область. Nat 6 лет назад 0
Firefox 59: схема версии 41 Scott Hepler 6 лет назад 0
Это удивительный пост. Только что сохранил мою 6-месячную историю (~ 130 000 страниц). Почему я потерял это? Получил обновление FF с `60.2.0` до` 60.2.1esr (64-bit) `и случайно открыл заново с более старой * pre-60 * версией. Убил старый FF с помощью диспетчера задач (не делайте этого), надеясь, что он не нанесет никакого ущерба. Слишком поздно. Повторно открылся с новыми и все закладки + панель инструментов, история ушла. К счастью, `place.sqlite.corrupt` на самом деле не был поврежден, поэтому можно просто скопировать его обратно. (Вы также можете добавить проверку: `pragma foreign_key_check;` not2qubit 6 лет назад 0
4
sleske

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

Если это не удастся, вам, вероятно, придется восстановить из резервной копии.

Чтобы создать дамп и восстановить базу данных, используйте команду .dump:

sqlite places.sqlite .dump | sqlite places-new.sqlite 
Спасибо. Сообщение SO было бесполезным, так как оно не работало, но решение, указанное в ссылке, работало `d: \ sqlite3.exe d: \ idimager.cat.db .dump | d: \ sqlite3.exe d: \ newdb.cat.db`. Все значки теперь исчезли, но я перестраиваю их, когда посещаю сайты. Еще раз спасибо! Bobby 14 лет назад 1
http://stackoverflow.com/questions/2255305/how-to-repair-a-malformed-sqlite-database ссылка в приведенном выше вопросе, была добровольно удалена его автором. Ответ [ниже] (http://superuser.com/questions/111998/random-text-to-cause-answer-highlighting/436077#436077) может помочь. user66001 11 лет назад 0
@ user66001: Да, ОП удалил свой вопрос. Я скопировал соответствующую команду. sleske 7 лет назад 0
Это не сработало для меня, и я закончил с файлом `place.sqlite.corrupt`. Я опубликовал [другой ответ] (https://superuser.com/a/1329161/86694) с решением, которое сработало для меня. Daniel 6 лет назад 0
2
Makyen

As always with performing a repair like this, I recommend that you first make at least one backup copy of your places.sqlite file located in your profile directory. Having a backup allows you to try various different things to repair such problems while knowing that if the attempted repair makes things worse, you can always make another copy of the backup on which to try again.

Depending on what is corrupted and how badly it is corrupted, it may be possible to fix the problems with the extension Places Maintenance. I have ended up with a corrupted places.sqlite file on a few occasions. Places Maintenance has been able to fix the problem each time by running various of the checks/fixes which it provides as operations in its options dialog. The various different checks and/or reporting should take only a few moments to minutes.

If this does not work, then going the route of manually fixing it in a manner similar to what DragonLord describes above may be what is needed.

1
Daniel

Этот процесс, описанный в MDN, помог мне решить проблему, когда новые страницы, которые я посетил, не были записаны в истории браузера. У меня не было places.sqlite.corrupt(или places.sqlite-corrupt) файла, но проверка целостности моего places.sqliteфайла показала ошибку в образе диска базы данных .

Выйдите из Firefox и сделайте резервную копию своего профиля Firefox, прежде чем идти дальше.

$ cd /Users/<username>/Library/Application\ Support/Firefox/Profiles/<profile_dir>/ $ cp places.sqlite places.sqlite.bak # for safety  $ sqlite3 places.sqlite sqlite> PRAGMA integrity_check; *** in database main *** On tree page 2 cell 131: Rowid 20884 out of order ... Error: database disk image is malformed sqlite> .clone places-clone.sqlite moz_places... done moz_historyvisits... done ... more output like above plus a few errors (which I ignored) like sqlite_sequence... Error: object name reserved for internal use: sqlite_sequence SQL: [CREATE TABLE sqlite_sequence(name,seq)] done ... sqlite> PRAGMA user_version; 43 <----- TAKE NOTE OF THIS VALUE it may be different for you sqlite> .exit  $ sqlite3 places-clone.sqlite sqlite> PRAGMA integrity_check; ok sqlite> PRAGMA user_version = 43; -- use the number you got from PRAGMA user_version; above sqlite> PRAGMA journal_mode = truncate; truncate sqlite> PRAGMA page_size = 32768; sqlite> VACUUM; sqlite> PRAGMA journal_mode = wal; wal sqlite> .exit  $ mv places-clone.sqlite places.sqlite 

Запустите Firefox. История должна работать снова.

Я на Mac с Firefox 60.0.1. Возможно, вам придется настроить команды для вашей платформы.

Спасибо Даниэль, всегда полезно увидеть фактическую процедуру команды not2qubit 6 лет назад 0