RAM(ブルースクリーンで数回、Windows XP))で問題が発生し、Firefoxデータベースが破損しています。Firefoxは機能していますが、履歴がなくなっており、実行時にいくつかの不整合とエラーが報告されますpragma integrity_check
オン places.sqlite
:
データベースディスクイメージの形式が正しくありません
さて、SQLiteデータベースを修復するにはどうすればよいですか?
この手順を実行するにはFirefoxを閉じる必要があるため、先に進む前に、必ずこのページを別のWebブラウザーで開くか、印刷してください。
Placesデータベースを復旧しようとする何時間もの作業の後、Firefoxのソースコードを読んでも、なんとか成功しました。ここに私がそれをした方法があります:
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
_フォルダーにあります。places.sqlite
_ファイルにあります。破損が原因でファイルが置き換えられた場合は、_places.sqlite.corrupt
_ファイルを使用して回復します。 _places.sqlite.bak
_または_places.sqlite.corrupt.bak
_という名前のファイルのバックアップコピーを作成します。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
_ ):PRAGMA user_version = <version>; PRAGMA journal_mode = truncate; PRAGMA page_size = 32768; VACUUM; PRAGMA journal_mode = wal;
places.sqlite
_を削除してから、SQLiteシェルを開始して、_places.sqlite
_を使用して空の_sqlite3 places.sqlite
_データベースを作成します。 _.read dump.sql
_と入力して、SQLダンプをデータベースにロードします。より関連性の高い情報は、次のページにあります。
簡略化された手順は このMDN記事 で説明されていますが、テストしていません。それにもかかわらず、私はその記事から更新されたPRAGMA
コマンドを組み込みました。
1 SQLは通常、_ORDER BY
_句を使用しない限り、データベース出力が任意の順序で提供されることを保証しません。ただし、_ORDER BY
_は破損したデータベースで出力を生成できない可能性があります(SQLiteは出力を生成する前にテーブル全体を読み取る必要があるため)。私の知る限り、Firefoxは常に_moz_places
_テーブルエントリを連続したIDで書き込むため、すべての出力はID順に並べられていると想定できます。
まあ、破損の程度によっては修理できない場合もございます。あなたの最善の策は、おそらくsqlite
を使用してデータベースをダンプしてから、何が救えるかを確認することです。
それが失敗した場合は、おそらくバックアップから復元する必要があります。
データベースをダンプして再作成するには、コマンド.dump
を使用します。
sqlite places.sqlite .dump | sqlite places-new.sqlite
このような修復を実行する場合と同様に、最初に、プロファイルディレクトリにあるPlaces.sqliteファイルのバックアップコピーを少なくとも1つ作成することをお勧めします。バックアップがあると、さまざまなことを試してこのような問題を修復できますが、修復を試みた結果、事態が悪化した場合は、いつでもバックアップの別のコピーを作成して再試行できます。
何が破損しているか、どれほどひどく破損しているかに応じて、拡張子 Places Maintenance で問題を解決できる場合があります。数回、places.sqliteファイルが破損しました。 Places Maintenanceは、オプションダイアログで操作として提供されるさまざまなチェック/修正を実行することで、毎回問題を修正できました。さまざまなチェックやレポートの作成には数分から数分かかります。
これが機能しない場合は、上記のDragonLordの説明と同様の方法で手動で修正する方法が必要な場合があります。
この 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を使用しています。プラットフォームに応じてコマンドを調整する必要がある場合があります。