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