Як відремонтувати пошкоджену базу даних Firefox places.sqlite?


15

У мене виникли проблеми з оперативною пам’яттю (кілька разів на bluescreen, Windows XP), і тепер мої бази даних Firefox пошкоджені. Firefox працює, але моя історія пішла , і це звіт кілька невідповідностей і помилок при виконанні pragma integrity_checkна places.sqlite:

Образ диска бази даних неправильно сформований

Тепер питання, як мені відновлювати бази даних SQLite?


2
Для подальшої довідки в майбутньому може бути корисно FEBE (розширення резервного копіювання Firefox Environment). Копіює весь профіль і пакує його як єдину резервну копію. Я знаю, що це не відповідає на ваше запитання, але це може бути корисно знати в майбутньому. bit.ly/aumThw
Урда

Відредагований, щоб допомогти Googlersм знайти це питання.
bwDraco

Відповіді:


22

Примітка

Оскільки Firefox повинен бути закритим для виконання цієї процедури, не забудьте відкрити цю сторінку в іншому веб-браузері або роздрукувати її, перш ніж продовжувати.


Після години роботи, намагаючись відновити базу даних Місця на карті, навіть прочитавши вихідний код Firefox, мені вдалося досягти успіху. Ось як я це зробив:

  • Завантажте останню версію оболонки SQLite та витягніть її у свою папку профілю. У Windows Vista та Windows 7 він знаходиться в C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.defaultпапці.
  • Закрийте Firefox, якщо він працює.
  • База даних місць знаходиться у 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. (Опис таблиць, що знаходяться в базі даних Місць, можна знайти тут , що включає застарілу діаграму ER.) Я поясню, як відновити додаткові дані тільки з цієї таблиці; наступна процедура, ймовірно, не застосовується для інших таблиць, тому пропустіть ці під кроки, якщо інша таблиця moz_placesзадіяна.)

    • У кожному рядку moz_placesтаблиці є ідентифікатор. Рядки скидаються з таблиці відповідно до порядку цього ідентифікатора. 1 Ідентифікатор - це перше значення після вступних дужок у INSERTвиписці. Область, де база даних пошкоджена, ймовірно, буде невеликим блоком рядків у цій таблиці; ідея тут - пропустити цю пошкоджену ділянку та відновити якомога більше даних. Початкова область такого блоку представлена ​​на дамп як рядок до появи ERRORкоментаря. Використовуючи ідентифікатор для цього рядка, ми можемо визначити, де база даних пошкоджена. Ми робимо це, використовуючи SELECTзаяви як ідентифікатор як умову; цей процес має деякі пробні помилки. Наприклад, якщо останній ідентифікатор перед помилкою становив 49999, а помилка випливає, пошкоджений блок починається з ідентифікатора 50000. Використовуйте оператори типу:

    - придушити непотрібний вихід
    - наступна команда призначена для систем Windows
    - для Linux та інших систем, схожих на Unix та Unix, використовуйте .output / dev / null
    . вихід NUL
    
    ВИБРАТИ ідентифікатор ВІД moz_places WHERE id> = 50100;
    
    • Відрегулюйте значення після id >=та повторіть вищевказану SELECTкоманду, поки не знайдете найменше значення, яке не призведе до того, що SQLite виводить помилку. Це ідентифікатор, який відноситься до рядка, починаючи з якого ми можемо відновити додаткові дані. Припустимо, цей ідентифікатор 50200. Щоб скинути ці дані, введіть:

    . вихід dump2.sql
    .встановити модуль
    SELECT * FROM moz_places WHERE id> = 50200;
    
    - відновити нормальну вихідну поведінку
    вихідний вихід
    .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 = <version>;
PRAGMA journal_mode = усікати;
PRAGMA page_size = 32768;
ВАКУУМ;
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записи таблиць із послідовними ідентифікаторами, тому ми можемо припустити, що весь вихід упорядкований за ідентифікатором.


3
Це чиста дивовижність. Допоміг мені відновити майже всю історію з корумпованих місць.sqlite. Дуже дякую!!
Ашутош Джиндал

Це допомогло з двома модифікаціями: 1) додати ";" у рядку user_version; 2) чомусь мій «пошкоджений» файл мав версію схеми, яка була «на одну меншу», ніж очікувалося. Після того, як ваш метод спочатку не працював, я спробував імпортувати дамп у нову базу даних 10 МБ і не вдався, оскільки у старої таблиці було на один стовпчик менше. Погляд на посилання на вихідний код змусив мене зрозуміти, що відбувається. Дивовижний пост !!!
Tilman Hausherr

@TilmanHausherr: адресовано. Щоб уникнути проблеми зі зміною стовпців, обов’язково виконайте кроки в цій відповіді, як тільки ви помітите корупцію та перед оновленням Firefox, щоб схема бази даних не була змінена. Ви також можете спробувати встановити старішу версію схеми - Firefox оновить її до нової версії, коли відновите базу даних.
bwDraco

Встановлення попередньої версії схеми - це те, що я робив під час написання першого коментаря, тобто я вже мав успіх :-) Так, я підозрюю, що я не помітив корупцію відразу, я зазвичай помічаю це лише при введенні символів, які повинні зробити З'являється "стара URL-адреса", і нічого не відбувається.
Tilman Hausherr

Відмінна робота! Радий, що ви оновили його, що повернуло його до активних питань, де я його помітив.
fixer1234

4

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

Якщо це не вдасться, вам, ймовірно, доведеться відновити з резервного копіювання.

Щоб скинути та відтворити базу даних, використовуйте команду .dump:

sqlite places.sqlite .dump | sqlite places-new.sqlite

1
Дякую. Повідомлення SO не було корисним, оскільки воно не працювало, але рішення, на яке посилається посилання, справді спрацювало d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db. Усі фаворити вже пішли, але я їх відновлюю, коли відвідую сайти. Знову дякую!
Боббі

stackoverflow.com/questions/2255305/… посилання у вищезазначеному питанні було добровільно видалено її автором. Відповідь нижче може бути корисною.
user66001

@ user66001: Так, ОП видалило їх питання. Я скопіював відповідну команду.
sleske

Це не спрацювало для мене, і я закінчив places.sqlite.corruptфайл. Я розмістив ще одну відповідь із рішенням, яке працювало на мене.
Даніель

2

Як завжди, виконуючи подібний ремонт, рекомендую спершу зробити хоча б одну резервну копію файлу places.sqlite, що знаходиться у вашому каталозі профілю. Наявність резервної копії дозволяє спробувати різні речі для усунення подібних проблем, знаючи, що якщо спроба ремонту погіршить ситуацію, ви завжди можете зробити ще одну копію резервної копії, на якій потрібно спробувати ще раз.

Залежно від того, що пошкоджено та наскільки воно пошкоджено, можливо, виправити проблеми з розширенням Обслуговування місць . У мене кілька разів зіткнувся зіпсований файл places.sqlite. Обслуговування місць дозволяє виправити проблему щоразу, запускаючи різні перевірки / виправлення, які вона надає в якості операцій у своєму діалоговому вікні параметрів. Різні різні перевірки та / або звітність повинні зайняти лише кілька хвилин до хвилин.

Якщо це не спрацює, то, можливо, потрібно пройти маршрут ручного виправлення таким чином, як аналогічний описаному вище DragonLord.


1

Цей процес, описаний на 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.