2013-08-15 64 views
28

これは以前答えポストへのフォローアップの質問です:データベースは、次のエラーが生成されている場合はIs there a command line utility for validating SQLite databases in Linux?壊れたSQLite3データベースを回復するには?

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

はにデータベースを回復するために行うことができます任意のクリーンアップ処理があります使用可能な状態?いくつかの破損したレコードの潜在的な損失でさえ?任意の自動的な方法があった場合

おかげ

答えて

69

は、SQLiteはすでにそれを行うことができるだろう。

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

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

しかし、これは必ずしも可能ではありません。

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

+5

もし彼がバックアップしていれば、彼は回復する必要はありませんでした。... – peterh

+6

@PeterHorvath「インターネット上で、誰もあなたが微妙であると聞くことはできません。 -Linus Torvalds –

+0

これは実際に私のために働いた。 ".dump"は、妥当なSQLを、壊れたファイルから生成しました。これは、integrity_checkが失敗していました。 – BrandonLWhite

7

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

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

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

+0

sqlite3に直接ダンプを渡すことは、一時的なダンプのエラー行を削除してそれを修正しました。 –

2

これは古い質問ですが、私はまだ私の解決策を共有したいと思います。 私の問題は、KODI(XBMC)のsqlite3のデータベースは、作業は以下の通りですやった私の場合

file is encrypted or is not a database

では動作しませんでしたの.dump

を破損したことがありました。古いデータベースファイルのバックアップ
  • KODIはsqliteのファイルのヘッダフォーマット
  • は(祝福)バイナリエディタで両方のファイルをオープンthis側にチェック
  • 新しいDBファイルを作成してみましょうメイド

    1. 最初の96バイトを確認しました
    2. 最初と40バイトが違っていて、最初の40バイトが新しいdbファイルから古いdbファイルにコピーされました
    3. これを実行した後、私のデータベースファイルは再び動作しました!!!
  • 8

    私はこのような症状を示す破損したsqliteファイルを持っていました。私は

    select * from corruptTable; 
    

    でレコードをロードしようとするとき

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

    しかし、それだけで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 
    

    これらの手順は、このウェブサイトから取られた: http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-不正な形式/

    +1

    注:ファイルが非常に**大きい**(500Mbのような)の場合、SQLファイルを簡単に編集することはできません。 あなたは、コマンドラインを使用する必要があり、この: - > 猫dump_all_last.sql |はgrep -v TRANSACTION | grepの-v ROLLBACK> dump_all_last_notrans.sql – Nadir

    +0

    良い点ナディール、あなたのコメントでこれを追加するためのおかげで。 – johnrechd

    +0

    これをAutomatorアプリにどうやって入手するか考えていますか? – callisto

    4

    私は(sqlite3のデータベースファイルである)このように私Chromeの履歴ファイルを修復することができました。このブログの記事内で共有されて

    sqlite3.exe History ".backup History-new" 
    
    +0

    これはいいですね!私は常に.dumpを使用してから、新しいデータベースにロードしました。あなたのメソッドには、カスタムの照合などを使用するデータベースや、.dumpを使用しないデータベースで動作するというメリットがあります。 – mz2

    0

    何か - http://wordpress.semnaitik.com/2017/02/01/repair-sqlite-database/

    AUトルは、壊れたSQLiteデータベースを手動で修正できると言います。どうやって?まず、SQLiteデータベースをSQLファイルにエクスポートできます。その後、SQLからSQLiteにインポートすることができます。それが有用かどうかは分かりません。あなたは一度それを試すことができます。ブログ記事には、SQLiteデータベースとその破損に関する有用な情報が掲載されています。

    ありがとうございました。

    0

    これが私の仕事:

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

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

    次のように入力します。

    sqlite3.exe

    (Enterキーを押します)

    NAME_OF_YOUR_CORRUPTED_DATABASE> "の.dump" | sqlite3のnew.db

    (押して入力します)

    他のすべてのソリューションは、私のために動作しませんでした。

    1

    破損が最初のページにある場合、回復するために ".dump"メソッドを使用することはできません。

    undarkというツールがあります。このツールは、レコードが上書きされない場合、すべての行(削除済みまたは削除されていない)をdbファイルからエクスポートします。最新版here

    SQLite-Deleted-Records-Parserも使用しましたが、同じタイプの出力は得られません。

    また、SQLite Forensic Explorer,SQLite Repair,Sqlite Database RecoverySQLiteDoctorのような製品もあります。

    あなたはこれらのいくつか使用して、再び同じ問題を避けることができます開発者の場合:

    • litereplica - ポイント・イン・タイム・リカバリシングル・マスター・レプリケーションを
    • litesync - マルチマスタの同期
    • rqlite - マルチマスターレプリケーション

    または定期的にBackup APIを使用しています。それは各バックアップのdb全体を転送します。

    覚えておいてください:SQLiteファイルをコピーするか、トランザクションがアクティブな間に通常のバックアップ方法を使用する場合 コピーはcorruptedです。

    +0

    これらはLinuxでうまくいきたいです。 Undarkにはデータベースが多少あり、Githubで開かれた問題は失敗します。 Wineは16.04でこれらのアプリケーションを処理できません –

    関連する問題