質問: 破損したfirefox places.sqliteデータベースを修復するにはどうすればよいですか? ram(ブルースクリーンで数回、windows xp))で問題が発生し、firefoxデータベースが破損しています。firefoxは機能していますが、履歴がなくなっており、実行時にいくつかの不整合とエラーが報告されますpragma integrity_check オン places.sqlite: データベースディスクイメージの形式が正しくありません さて、sqliteデータベースを修復するにはどうすればよいですか?
回答: 注意この手順を実行するには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実行可能ファイルをプロファイルフォルダから削除します。 より関連性の高い情報は、次のページにあります。 http://kb.mozillazine.org/locked_or_damaged_places.sqlite http://www.sqlite.org/pragma.html 簡略化された手順は このmdn記事 で説明されていますが、テストしていません。それにもかかわらず、私はその記事から更新されたpragmaコマンドを組み込みました。1 sqlは通常、_order by_句を使用しない限り、データベース出力が任意の順序で提供されることを保証しません。ただし、_order by_は破損したデータベースで出力を生成できない可能性があります(sqliteは出力を生成する前にテーブル全体を読み取る必要があるため)。私の知る限り、firefoxは常に_moz_places_テーブルエントリを連続したidで書き込むため、すべての出力はid順に並べられていると想定できます。