H2 データベースのリカバリー手順
- エラーメッセージの確認
H2 はエラーメッセージに具体的な内容を出力します。例えば、次のようなエラーが発生している場合があります。
General error: "java.lang.RuntimeException: file corrupted in chunk xxxxxx, expected yyyyy but got zzzzz"
この場合、特定の チャンク (chunk) に破損が発生していることを示しています。
- バックアップがある場合の復旧
(1) 最新のバックアップからリストア
H2 では .mv.db
または .script
のバックアップを取得している場合、それを復元するのが最も安全な方法です。
mv mydb.mv.db mydb_corrupt.mv.db
cp mydb_backup.mv.db mydb.mv.db
これでバックアップから復元できます。
- バックアップがない場合のリカバリー
バックアップがない場合、以下の方法を試してください。
(1) H2 の RECOVER モードを使用
H2 には "Recover" モード があり、データベースを修復できる可能性があります。
java -cp h2*.jar org.h2.tools.Recover -dir ./recover -db mydb
このコマンドは ./recover
ディレクトリに mydb.h2.sql
を出力します。
新しいデータベースを作成する手順:
java -cp h2*.jar org.h2.tools.RunScript -url jdbc:h2:./newdb -script ./recover/mydb.h2.sql
この手順で、新しいデータベース newdb
にデータを復元できます。
(2) H2 の SCRIPT ツールを使用
データベースのスクリプトエクスポートを試みる方法もあります。
java -cp h2*.jar org.h2.tools.Script -url jdbc:h2:file:./mydb -script backup.sql
これにより、backup.sql
にデータをエクスポートできます。
エクスポートできた場合、次のように新しいデータベースへインポートします。
java -cp h2*.jar org.h2.tools.RunScript -url jdbc:h2:file:./newdb -script backup.sql
- データベースの強制リカバリ
もしRecover
やScript
で復旧できない場合、FORCE_REPAIR
を試すこともできます。
SET FORCE_REPAIR 1;
SHUTDOWN IMMEDIATELY;
その後、H2 データベースを再起動してみてください。
- データベースを開く際のオプション
データベースを開く際に "IFEXISTS=TRUE" や "RECOVER=1" のオプションを追加すると、破損データのリカバリを試みることができます。
java -cp h2*.jar org.h2.tools.Shell -url jdbc:h2:file:./mydb;RECOVER=1
- データベースの破損原因を調査
リカバリーが成功したら、破損の原因を特定して、再発防止策を考えましょう。
(1) 異常終了や強制シャットダウン
- プロセスのクラッシュ、OS の強制終了などが原因になることが多い
-
SHUTDOWN COMPACT
を定期的に実行し、クリーンな終了を行う
(2) H2 バージョンの不整合
- データベースを古いバージョンで開いたり、新しいバージョンで開いたりすると破損することがある
- 同じバージョンの H2 で動作させることを推奨
(3) ディスクの問題
- SSD や HDD に物理的な障害が発生している場合、ファイルが破損する可能性がある
-
dmesg
コマンドやchkdsk
/fsck
でディスクの状態を確認
- まとめ
| 手順 | 方法 |
|------|------|
| 1 | エラーメッセージを確認 |
| 2 | バックアップがある場合は復旧 |
| 3 |Recover
コマンドでリカバリー |
| 4 |Script
ツールで SQL を抽出 |
| 5 |FORCE_REPAIR
を試す |
| 6 |RECOVER=1
を指定して開く |
| 7 | 破損の原因を特定し、再発防止策を検討 |
これらの方法を試して、H2 データベースの復旧を行ってみてください!