RAMにいくつかの問題があり(ブルースクリーンが数回、Windows XP)、Firefoxデータベースが破損しています。Firefoxは動作していますが、私の履歴は消えており、実行時にいくつかの矛盾とエラーが報告さpragma integrity_check
れていplaces.sqlite
ます:
データベースディスクイメージの形式が正しくありません
さて、質問です。SQLite-Databaseを修復するにはどうすればよいですか?
RAMにいくつかの問題があり(ブルースクリーンが数回、Windows XP)、Firefoxデータベースが破損しています。Firefoxは動作していますが、私の履歴は消えており、実行時にいくつかの矛盾とエラーが報告さpragma integrity_check
れていplaces.sqlite
ます:
データベースディスクイメージの形式が正しくありません
さて、質問です。SQLite-Databaseを修復するにはどうすればよいですか?
回答:
この手順を実行するにはFirefoxを閉じる必要があるため、続行する前にこのページを別のWebブラウザーで開くか、印刷してください。
Firefoxのソースコードを読んでも、Placesデータベースを復元しようとして何時間も作業をした後、私は何とか成功しました。以下がその方法です。
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
データベースが破損しているため、結果のデータベースダンプは完全ではなく、すべての回復可能なデータが取得されているわけではありません。エラーが発生した場所を特定するにはERROR
、ダンプファイル内のSQLコメントで単語(すべて大文字)を検索し(Notepad ++dump.sql
を使用してこれを行います)、その上のSQL コマンドを読んで問題のテーブルを特定します。私の場合、破損したテーブルはです。(Placesデータベースにあるテーブルの説明は、古いERダイアグラムを含むこちらにあります。)このテーブルからのみ追加データを復元する方法を説明します。次の手順は他のテーブルにはおそらく適用されないため、テーブル以外のテーブルが関係する場合はこれらのサブステップをスキップしてください。INSERT
moz_places
moz_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;
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.sql
、ERROR
コメントが表示されるファイルに貼り付けます。ROLLBACK; -- due to errors
ファイルの最後のをに置き換えますCOMMIT;
。dump.sql
ファイルの先頭に次のコードを追加します。<version>
次のように、FirefoxがFirefoxのバージョンに基づいてデータベーススキーマバージョンを決定するために必要な正しい値に置き換えます(これはFirefoxソースファイルにありますtoolkit/components/places/Database.cpp
)。
PRAGMA user_version = <バージョン>; PRAGMA journal_mode = truncate; PRAGMA page_size = 32768; 真空; 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で順序付けられていると想定できます。
さて、それがどの程度損傷しているかによっては、修復が不可能な場合があります。最善の策は、おそらくを使用してdbをダンプしてからsqlite
、サルベージできるものを確認することです。
それが失敗した場合、おそらくバックアップから復元する必要があります。
データベースをダンプして再作成するには、次のコマンドを使用します.dump
。
sqlite places.sqlite .dump | sqlite places-new.sqlite
d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db
。これですべてのファビコンはなくなりましたが、サイトを訪れると再構築されます。再度、感謝します!
このような修復を実行する場合と同様に、まずプロファイルディレクトリにある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を使用しています。プラットフォームに合わせてコマンドを調整する必要がある場合があります。