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


15

RAMにいくつかの問題があり(ブルースクリーンが数回、Windows XP)、Firefoxデータベースが破損しています。Firefoxは動作していますが、私の履歴は消えており、実行時にいくつかの矛盾とエラーが報告さpragma integrity_checkれていplaces.sqliteます:

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

さて、質問です。SQLite-Databaseを修復するにはどうすればよいですか?


2
将来の参考のために、FEBE(Firefox Env​​ironment Backup Extension)が将来役立つかもしれません。プロファイル全体をコピーし、単一のバックアップとしてパッケージ化します。あなたの質問に答えていないことは知っていますが、将来知るのに役立つかもしれません。bit.ly/aumThw
ウルダ

Google社員がこの質問を見つけやすくするために編集されました。
bwDraco-モニカの復活14年

回答:


22

注意

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


Firefoxのソースコードを読んでも、Placesデータベースを復元しようとして何時間も作業をした後、私は何とか成功しました。以下がその方法です。

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

    • moz_placesテーブルの各行にはIDがあります。行は、このIDの順序に従ってテーブルからダンプされます。1 IDは、INSERTステートメントの左括弧に続く最初の値です。データベースが破損している領域は、このテーブルの行の小さなブロックである可能性があります。ここでのアイデアは、この破損した領域をスキップして、できるだけ多くのデータを回復することです。そのようなブロックの開始領域は、ERRORコメントが表示される前の行としてダンプに表示されます。この行のIDを使用して、データベースが破損している場所を特定できます。そのためにSELECTは、IDを条件とするステートメントを使用します。このプロセスには試行錯誤が必要です。たとえば、エラーの前の最後のIDが49999で、エラーが続く場合、破損したブロックはID 50000から始まります。次のようなステートメントを使用します。

    -不要な出力を抑制する
    -次のコマンドはWindowsシステム用です
    -Linuxおよびその他のUnixおよびUnixライクなシステムの場合は、.output / dev / nullを使用します
    .output NUL
    
    SELECT id from moz_places WHERE id> = 50100;
    
    • 次の値を調整し、SQLiteがエラーを出力しない最小の値が見つかるまでid >=上記のSELECTコマンドを繰り返します。これは、追加のデータを回復できる元の行を参照するIDです。このIDが50200であると仮定します。このデータをダンプするには、次のように入力します。

    .output dump2.sql
    .mode挿入
    SELECT * FROM moz_places WHERE id> = 50200;
    
    -通常の出力動作を復元する
    .output stdout
    .modeリスト
    
    • ファイル内のINSERTステートメントはでdump2.sql始まることに注意してくださいINSERT INTO table VALUES。したがって、テキストエディターの検索と置換機能を使用して、この文字列のすべてのインスタンスをに置き換えますINSERT INTO moz_places VALUES
    • dump2.sqlファイルの内容全体をコピーしてdump.sqlERRORコメントが表示されるファイルに貼り付けます。
  • 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 = <バージョン>;
PRAGMA journal_mode = truncate;
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シーケンシャルIDでテーブルエントリを書き込むため、すべての出力はIDで順序付けられていると想定できます。


3
これは純粋な素晴らしさです。破損したplaces.sqliteからほぼすべての履歴を回復するのに役立ちました。どうもありがとう!!
アシュ

それは、2つの変更で役立ちました。1)「;」を追加します user_version行。2)何らかの理由で、「破損した」ファイルのスキーマバージョンが予想よりも「1つ少ない」。最初にメソッドが機能しなかった後、10MBの新しいデータベースにダンプをインポートしようとしましたが、古いテーブルの列が1つ少ないため失敗しました。ソースコードのリンクを見て、何が起こっているのかを理解しました。素晴らしい投稿!!!
ティルマンハウザー14

@TilmanHausherr:対処済み。列の変更の問題を回避するには、破損に気づいたらすぐに、Firefoxを更新する前に、この回答の手順に従ってください。データベーススキーマが変更されないようにします。古いスキーマバージョンを設定することもできます。データベースを復元すると、Firefoxによって新しいバージョンに更新されます。
bwDraco-モニカの復活14年

以前のスキーマバージョンを設定することは、最初のコメントを書くときに行ったものです。つまり、すでに成功していました。 「古いURL」が表示され、何も起こりません。
ティルマンハウザー14

すばらしい仕事です!それを更新してくれて、それが私が見つけた活発な質問にそれを戻しました。
fixer1234

4

さて、それがどの程度損傷しているかによっては、修復が不可能な場合があります。最善の策は、おそらくを使用してdbをダンプしてからsqlite、サルベージできるものを確認することです。

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

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

sqlite places.sqlite .dump | sqlite places-new.sqlite

1
ありがとうございました。SOの投稿は機能しなかったため役に立たなかったが、リンクで参照されているソリューションは機能したd:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db。これですべてのファビコンはなくなりましたが、サイトを訪れると再構築されます。再度、感謝します!
ボビー

stackoverflow.com/questions/2255305 / ...上記の質問のリンクは、その作者によって自発的に削除されました。以下の回答が役立つ場合があります。
user66001

@ user66001:はい、OPは質問を削除しました。関連するコマンドをコピーしました。
sleske

これは私にはうまくいきませんでした、そして、私はplaces.sqlite.corruptファイルで終わりました。私は私のために働いた解決策で別の答えを投稿しました。
ダニエル

2

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

破損したものと破損の程度によっては、拡張機能Places Maintenanceで問題を修正できる場合があります。数回、places.sqliteファイルが破損してしまいました。Places Maintenanceは、オプションダイアログで操作として提供するさまざまなチェック/修正を実行することにより、毎回問題を修正することができました。さまざまな異なるチェックやレポートは、数分から数分で完了します。

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


1

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を使用しています。プラットフォームに合わせてコマンドを調整する必要がある場合があります。


ダニエル、ありがとう、いつも実際のコマンド手順を見るのに役立つ
-not2qubit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.