SQLiteが database disk image is malformed エラーを吐いた話

先ほどMacがOSごとクラッシュしました。バックエンドにSQLiteを使ったクローラを走らせていたのですが、再起動してデータベースを叩いてみると、表題のエラーがでてデータにアクセス出来なくなりました。2週間ほど回し続けていたデータなので、一瞬変な汗をかきましたが、復元出来たのでメモ書きを残しておきます。

ちょっとググったら、このページが見つかったので、とりあえず書かれていた内容を試してみました。一旦壊れたデータベースのダンプを取って、データベースを作り直す方法です。

$ sqlite3 corrupted.db
sqlite> PRAGMA integrity_check;    # データが壊れているのを確認
Error: database disk image is malformed
sqlite> .mode insert
sqlite> .output dump_all.sql
sqlite> .dump
sqlite> (CTRL + D)                 # 一旦終了

$ sqlite3 new.db
sqlite> .read dump_all.sql         # 一見成功したように見える。
sqlite> .schema                    # けど空。

.readコマンドも正常に終了して、結構簡単に修復出来たなと思ったのですが、残念ながらデータベースは空のままで、復元されていませんでした。

ダンプしたSQLファイルを見てみると、一件正常なSQLが作られているように見えます。長い戦いになるのを半ば覚悟して、とりあえず末尾まで確認したら以下のようなエラーが出力されていました。

BEGIN TRANSACTION;
....

/**** ERROR: (11) database disk image is malformed *****/
/**** ERROR: (11) database disk image is malformed *****/
ROLLBACK; -- due to errors

という事で、エラーの部分とROLLBACKをCOMMITに書き換えて、インポートしてみると上手くいきました。

$ vim dump_all.sql     # ROLLBACKをCOMMITに修正。
$ sqlite3 new.db
sqlite> .read dump_all.sql
sqlite> PRAGMA integrity_check;
ok

というわけで修復出来て良かったです。

あとそもそも不安定なクライアントでクローラ回してたのが良くないなと思いました。

5 thoughts on “SQLiteが database disk image is malformed エラーを吐いた話”

  1. I have been on a spiritual pilgrimage of sorts this year and thought I would make this part of that goal as well.
    Basic purpose of hiring a professional SEO Services Provider is to rank up your website on search engines and this is only possible when you will do something which
    is hard to do like placing back links and articles submissions which take a lot of time.
    The website should be checked and modified to ensure that
    it complies with the rules of main search engines.

    Feel free to visit my blog post :: seo services social media and website design

Leave a Reply

Your email address will not be published. Required fields are marked *