これは、以前に回答した投稿に対するフォローアップの質問です。 LinuxでSQLiteデータベースを検証するためのコマンドラインユーティリティはありますか?
データベースが次のエラーを生成している場合:
$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed
データベースを使用可能な状態に回復するために実行できるクリーンアップ処理はありますか?いくつかの破損したレコードが失われる可能性がありますか?
ありがとう
自動的な方法があれば、SQLiteはすでにそれを行うことができます。
場合によっては、破損はほとんどまたはほとんどがインデックスにあります。この場合、.dump
を使用してデータベース全体をダンプし、それらのコマンドを使用して新しいデータベースを作成することで、一部またはほとんどのレコードを取得できます:
$ sqlite3 mydata.db ".dump" | sqlite3 new.db
ただし、これは常に可能とは限りません。
最も簡単で信頼性の高い方法は、バックアップからデータベースファイルを復元することです。
このような症状を示す破損した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/
データベースがひどく破損している場合、.dump
にはエラーが含まれ、一部のデータが失われる可能性があります。
より複雑なデータスキーマの場合、これは孤立したレコードや部分的なレコードを意味し、アプリケーションを混乱させる可能性があります。
.dump
をファイルに追加し、テキストエディターを使用して問題のある行を削除します。ダンプファイル内でERROR
を検索します。
私はChrome履歴ファイル(これはsqlite3データベースファイルです))を次のように修復できました。
sqlite3.exe History ".backup History-new"
これは古い質問ですが、解決策を共有したいと思います。私の問題は、Kodi(xbmc)のsqlite3データベースが破損していることでした。
私の場合、.dumpは機能しませんでした
file is encrypted or is not a database
うまくいったのは次のとおりです。
プラグマwritable_schema
はいくつかの整合性チェックを無効にするので、この2つのコマンドもトリックを行い、dbのカスタマイズを維持します。
PRAGMA writable_schema=ON;
VACUUM;
私の方法は似ていますが、エラーロールバックスクリプトを防ぎます:
sqlite3 database.db ".dump" | sed -e 's|^ROLLBACK;$|COMMIT;|g' | sqlite3 database.new
これは私のために働いた:
here からsqlite3ツールパッケージをダウンロードし、任意のフォルダーに配置します。破損したデータベースを同じフォルダーに入れます。
コマンドプロンプトを開きます。
次を入力します。
sqlite3.exe
(Enterキーを押します)
NAME_OF_YOUR_CORRUPTED_DATABASE> ".dump" | sqlite3 new.db
(Enterキーを押します)
他のすべてのソリューションは私にとってはうまくいきませんでした。
これらの手順でインデックスが欠落していることによって引き起こされるデータベースの破損を修正しましたが、それらは私のために機能しています。
DROPインデックス: sqlite drop indexコマンド
バキュームの実行 Sqliteバキュームコマンド
インデックスを再作成します: Sqlite create index
次の修正プログラムは、コマンドラインツールを実行せずにデータベースを修復するために機能しました。
テーブルの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」が返されます。