web-dev-qa-db-ja.com

破損したFirefox Places.sqliteデータベースを修復するにはどうすればよいですか?

RAM(ブルースクリーンで数回、Windows XP))で問題が発生し、Firefoxデータベースが破損しています。Firefoxは機能していますが、履歴がなくなっており、実行時にいくつかの不整合とエラーが報告されますpragma integrity_check オン places.sqlite

データベースディスクイメージの形式が正しくありません

さて、SQLiteデータベースを修復するにはどうすればよいですか?

15
Bobby

注意

この手順を実行するにはFirefoxを閉じる必要があるため、先に進む前に、必ずこのページを別のWebブラウザーで開くか、印刷してください。


Placesデータベースを復旧しようとする何時間もの作業の後、Firefoxのソースコードを読んでも、なんとか成功しました。ここに私がそれをした方法があります:

  • SQLite Shell の最新バージョンをダウンロードし、プロファイルフォルダーに抽出します。 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
_
  • データベースが破損しているため、結果のデータベースダンプは完全ではなく、回復可能なデータの一部が取得されていません。エラーが発生した場所を特定するには、ダンプファイル内のSQLコメントでWord ERROR(すべて大文字)を検索します_dump.sql_(私は Notepad ++ これを行うには)、その上にあるSQL INSERTコマンドを読み取り、問題のテーブルを特定します。私の場合、破損したテーブルは_moz_places_です。 (Placesデータベースにあるテーブルの説明は こちら にあり、古いERダイアグラムが含まれています。)追加の回復方法を説明しますこのテーブルのデータのみ。次の手順は他のテーブルにはおそらく適用されないため、_moz_places_以外のテーブルが含まれている場合は、これらのサブステップをスキップしてください。)

    • _moz_places_テーブルの各行にはIDがあります。行は、このIDの順序に従ってテーブルからダンプされます。1 IDは、INSERTステートメントの左括弧に続く最初の値です。データベースが破損している領域は、このテーブルの行の小さなブロックである可能性があります。ここでの考え方は、この損傷した領域をスキップして、できるだけ多くのデータを回復することです。このようなブロックの開始領域は、ERRORコメントが表示される前の行としてダンプに表示されます。この行のIDを使用して、データベースが破損している場所を特定できます。そのためには、IDを条件としてSELECTステートメントを使用します。このプロセスには試行錯誤が必要です。たとえば、エラーの前の最後のIDが49999で、その後にエラーが発生した場合、破損したブロックはID 50000から始まります。次のようなステートメントを使用します。
    -不要な出力を抑制します
    -次のコマンドはWindowsシステム用です。 .____。]。output NUL 
     
     SELECT id FROM moz_places WHERE id> = 50100; 
    
    • _id >=_に続く値を調整し、SQLiteがエラーを出力しない最小の値が見つかるまで、上記のSELECTコマンドを繰り返します。これは、追加のデータを回復できる行から始まるIDです。このIDが50200であるとします。このデータをダンプするには、次のように入力します。
    。output dump2.sql 
    。mode insert 
     SELECT * FROM moz_places WHERE id> = 50200; 
     
    -通常の出力動作を復元します
    。output stdout 
    。mode list 
    
    • _dump2.sql_ファイルのINSERTステートメントは_INSERT INTO table VALUES_で始まるため、テキストエディターの検索と置換機能を使用して、この文字列のすべてのインスタンスを_INSERT INTO moz_places VALUES_で置き換えます。 。
    • _dump2.sql_ファイルの内容全体をコピーし、ERRORコメントが表示される_dump.sql_ファイルに貼り付けます。
  • ファイルの最後の_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 = 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 Shell実行可能ファイルをプロファイルフォルダから削除します。

より関連性の高い情報は、次のページにあります。

簡略化された手順は このMDN記事 で説明されていますが、テストしていません。それにもかかわらず、私はその記事から更新されたPRAGMAコマンドを組み込みました。


1 SQLは通常、_ORDER BY_句を使用しない限り、データベース出力が任意の順序で提供されることを保証しません。ただし、_ORDER BY_は破損したデータベースで出力を生成できない可能性があります(SQLiteは出力を生成する前にテーブル全体を読み取る必要があるため)。私の知る限り、Firefoxは常に_moz_places_テーブルエントリを連続したIDで書き込むため、すべての出力はID順に並べられていると想定できます。

22
bwDraco

まあ、破損の程度によっては修理できない場合もございます。あなたの最善の策は、おそらくsqliteを使用してデータベースをダンプしてから、何が救えるかを確認することです。

それが失敗した場合は、おそらくバックアップから復元する必要があります。

データベースをダンプして再作成するには、コマンド.dumpを使用します。

sqlite places.sqlite .dump | sqlite places-new.sqlite
4
sleske

このような修復を実行する場合と同様に、最初に、プロファイルディレクトリにあるPlaces.sqliteファイルのバックアップコピーを少なくとも1つ作成することをお勧めします。バックアップがあると、さまざまなことを試してこのような問題を修復できますが、修復を試みた結果、事態が悪化した場合は、いつでもバックアップの別のコピーを作成して再試行できます。

何が破損しているか、どれほどひどく破損しているかに応じて、拡張子 Places Maintenance で問題を解決できる場合があります。数回、places.sqliteファイルが破損しました。 Places Maintenanceは、オプションダイアログで操作として提供されるさまざまなチェック/修正を実行することで、毎回問題を修正できました。さまざまなチェックやレポートの作成には数分から数分かかります。

これが機能しない場合は、上記のDragonLordの説明と同様の方法で手動で修正する方法が必要な場合があります。

2
Makyen

この 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を起動します。歴史は再び機能するはずです。

Firefox 60.0.1を搭載したMacを使用しています。プラットフォームに応じてコマンドを調整する必要がある場合があります。

1
Daniel