Примітка
Оскільки 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записи таблиць із послідовними ідентифікаторами, тому ми можемо припустити, що весь вихід упорядкований за ідентифікатором.