web-dev-qa-db-ja.com

破損したSQLite3データベースを回復する方法

これは、以前に回答した投稿に対するフォローアップの質問です。 LinuxでSQLiteデータベースを検証するためのコマンドラインユーティリティはありますか?

データベースが次のエラーを生成している場合:

$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed

データベースを使用可能な状態に回復するために実行できるクリーンアップ処理はありますか?いくつかの破損したレコードが失われる可能性がありますか?

ありがとう

51
linsek

自動的な方法があれば、SQLiteはすでにそれを行うことができます。

場合によっては、破損はほとんどまたはほとんどがインデックスにあります。この場合、.dumpを使用してデータベース全体をダンプし、それらのコマンドを使用して新しいデータベースを作成することで、一部またはほとんどのレコードを取得できます:

$ sqlite3 mydata.db ".dump" | sqlite3 new.db

ただし、これは常に可能とは限りません。

最も簡単で信頼性の高い方法は、バックアップからデータベースファイルを復元することです。

101
CL.

このような症状を示す破損したsqliteファイルがありました。

select count(*) from corruptTable;
return:38000;

しかし、私がレコードをロードしようとすると

select * from corruptTable;

7レコードのみを返します。

私はいくつかのことを試しましたが、これらの手順は最も成功しました。

Macでは、ターミナルを開き、破損したデータベースでこれらのコマンドを実行します。 (これらはsqlite3コマンドなので、他のシステムで他のsqlite3エディターまたは同様のコマンドを使用できるはずです)。

1 sqlite3 dbWithCorruptTable.sqlite (Obviously replace "dbWithCorruptTable" to your sqlite3 file that has the corrupt table)
2 .mode insert
3 .output dump_all.sql
4 .dump
5 .exit
6 Manually edit the dump_all.sql file in a text editor and remove the transaction statements. Usually there is a "BEGIN TRANSACTION" statement on the 2nd line of the file and a "ROLLBACK" statement on the last line. Remove these and save the file

これらの手順は、このWebサイトから取得されました。http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed/

17
johnrechd

データベースがひどく破損している場合、.dumpにはエラーが含まれ、一部のデータが失われる可能性があります。

より複雑なデータスキーマの場合、これは孤立したレコードや部分的なレコードを意味し、アプリケーションを混乱させる可能性があります。

.dumpをファイルに追加し、テキストエディターを使用して問題のある行を削除します。ダンプファイル内でERRORを検索します。

9
Stavr00

私はChrome履歴ファイル(これはsqlite3データベースファイルです))を次のように修復できました。

sqlite3.exe History ".backup History-new"
7
Oliver Kötter

これは古い質問ですが、解決策を共有したいと思います。私の問題は、Kodi(xbmc)のsqlite3データベースが破損していることでした。

私の場合、.dumpは機能しませんでした

file is encrypted or is not a database

うまくいったのは次のとおりです。

  1. 古いdbファイルのバックアップを作成しました
  2. Kodiに新しいdbファイルを作成させます
  3. Sqliteファイルのヘッダー形式について this サイトで確認
  4. 16進エディターで両方のファイルを開き(bless)、最初の96バイトをチェックしました
  5. 最初の40バイトが異なるため、最初の40バイトを新しいdbファイルから古いdbファイルにコピーしました
  6. これを行った後、私のデータベースファイルは再び機能しました!!!
4
SuiTheDoc

プラグマwritable_schemaはいくつかの整合性チェックを無効にするので、この2つのコマンドもトリックを行い、dbのカスタマイズを維持します。

PRAGMA writable_schema=ON;
VACUUM;
2
Thinkeye

私の方法は似ていますが、エラーロールバックスクリプトを防ぎます:

sqlite3 database.db ".dump" | sed -e 's|^ROLLBACK;$|COMMIT;|g' | sqlite3 database.new
2

これは私のために働いた:

here からsqlite3ツールパッケージをダウンロードし、任意のフォルダーに配置します。破損したデータベースを同じフォルダーに入れます。

コマンドプロンプトを開きます。

次を入力します。

sqlite3.exe

(Enterキーを押します)

NAME_OF_YOUR_CORRUPTED_DATABASE> ".dump" | sqlite3 new.db

(Enterキーを押します)

他のすべてのソリューションは私にとってはうまくいきませんでした。

1
tmighty

これらの手順でインデックスが欠落していることによって引き起こされるデータベースの破損を修正しましたが、それらは私のために機能しています。

  1. DROPインデックス: sqlite drop indexコマンド

  2. バキュームの実行 Sqliteバキュームコマンド

  3. インデックスを再作成します: Sqlite create index

1
Mohit Chauhan

次の修正プログラムは、コマンドラインツールを実行せずにデータベースを修復するために機能しました。

テーブルの1つを操作しているときに「データベースディスクイメージの形式が正しくありません」というエラーメッセージが表示されたため、[PRAGMA integrity_check]を実行しました。

メインフリーリスト:ヘッダーの空きページ数が少なすぎます

ツリーページ16198のセル1:ページ14190への2番目の参照

ページ16988は使用されません

ページ46637は使用されません

インデックスindexname1に行4493がありません

インデックスindexname2に行4493がありません

インデックスindexname3に行4493がありません

最初に不良インデックスを使用してテーブルのスキーマを保存し、それらのインデックスを再作成できるようにしました。次に、[drop index _]コマンドを使用して、インデックス名1、2、および3のインデックスを削除しました。テーブルを1つずつJSONファイルにエクスポートしてから、各テーブルを切り捨てました。その時点での整合性チェックの実行は成功しました。次に、[create index _]コマンドで3つのインデックスを追加し直し、JSONファイルのエクスポートから各テーブルのレコードをインポートしました。整合性チェックコマンドを実行しても、すべてのレコードが復元された状態で「ok」が返されます。

0
Gary Z