BLOGTIMES
2021/02/07

壊れた H2 DB のファイルを修復するには

  java 
このエントリーをはてなブックマークに追加

突然、Gitbuketが JDBC エラーを吐くようになってしまって参りました。

ログを調べて見ると H2 DB に関する見たことがないログを吐いています。
Row "####" not found と言っていますが、これはデータベースファイルが不整合を起こしているようです。

Caused by: org.h2.message.DbException: Row "2515" not found in primary index "PUBLIC.COLLABORATOR_DATA" [90143-199] at org.h2.message.DbException.get(DbException.java:205) at org.h2.mvstore.db.MVPrimaryIndex.getRow(MVPrimaryIndex.java:274) at org.h2.mvstore.db.MVTable.getRow(MVTable.java:338) ・・・・・・

しかたがないので、データベースをリカバリしていきます。

H2 DB には Using the Recover Tool というプログラムが用意されていて、不整合を起こしているデータベースファイルからデータをサルベージすることができます。
サルベージされたデータは SQL としてダンプされているので、あとはこれを元にデータベースを復元してやれば OK。

具体的な手順は H2 DB をダウンロードし、カレントディレクトリにデータベースファイル( data.mv.db )がある状態で以下のコマンドを実行します。

java -cp h2*.jar org.h2.tools.Recover java -cp h2*.jar org.h2.tools.RunScript -url jdbc:h2:./new -user sa -password sa -script ./data.h2.sql -driver org.h2.Driver -showResults

うまくいけばカレントディレクトリに new.mv.db が生成されているはずなので、あとはこれを元の data.mv.db に上書きしてやれば完了です。

参考


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/12279
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン