#336 突然の電源断などでデータベースが壊れた場合   #Piggydb Blog     7 years ago (owner) Document
停電などが原因で突然の電源断が発生した後、以下のようなエラーが出て、Piggydbを利用できなくなることがあります。
 a) java.lang.RuntimeException: Unexpected code path
 b) java.lang.RuntimeException: double allocation in file
上記のようなエラーが出る場合、データベースファイルが壊れている可能性があります。
このような問題が発生した場合、単純にデータベースディレクトリの中のindexファイル (<データベース名>.index.db) を削除して再起動すると解決することがあります(特に a) のケース)。この方法で解決しない場合は、リカバリツールを使います。
データベースディレクトリについては、こちらを参照。
1) まずはPiggydbサーバーを停止しておきます。
2) Piggydbのパッケージの中から h2-<バージョン番号>.jar のような名前のファイルを探して(スタンドアロンパッケージの場合は、webapp/WEB-INF/lib の中にあります)、データベースディレクトリの中にコピーします。
3) そして、そのディレクトリの中で以下のコマンドを実行します。データベースの内容が、<データベース名>.data.sql というファイルに出力されます。
 java -cp h2*.jar org.h2.tools.Recover
java.io.EOFException というエラーが出ることがありますが、<データベース名>.data.sqlというファイルが出来ていれば、とりあえず無視しても問題ないようです。
4) 出力されたファイル(<データベース名>.data.sql)を使って、データベースの復元を行いますが、そのまま実行するとエラーになってしまう箇所があるのでそれらを削除する必要があります。テキストエディタなどを利用し、キーワード「CJKFullText」で検索して、ヒットした行を全て削除します。
5) データベースをゼロから作り直すので、既存のデータベースファイル(*.dbファイル)を全て削除(あるいは他の場所に移動)しておきます。このとき、ファイルフラグメントファイルが保存されている <データベース名>-files ディレクトリはそのままにしておきます。
6) 以下のコマンドでデータベースを作り直します(以下のコマンドはいずれも一行です)。エラーが無ければ、データベースが復元されているはずです。
 java -cp h2*.jar org.h2.tools.RunScript 
  -url jdbc:h2:<データベースディレクトリ>/<データベース名> 
  -user sa2 -script <データベース名>.data.sql -showResults
 デフォルト設定の場合) 
 java -cp h2*.jar org.h2.tools.RunScript 
  -url jdbc:h2:~/piggydb/piggydb 
  -user sa2 -script piggydb.data.sql -showResults
エラーが発生した場合は、その箇所を、<データベース名>.data.sql から削除して、もう一度 5), 6) の手順をやり直してみて下さい。
7) Piggydbを起動して、問題なく利用できるか確認します。
8) さらに万全を期すために、このデータベースをPiggydbのメニューからエクスポートして、再度データベースを作り直します。エクスポート後、サーバーを停止して、データベースファイルをデータベースディレクトリごと全て削除し、サーバーを再起動します。つまり、データベースを初期状態にします。その後、エクスポートしたファイルを使って、データベースを復元します。
Piggydbでは、データを保存するために「H2 Database Engine」というデータベースエンジンを利用しています。以上の手順は、H2のサイトを参考にしました。