【結論】
H2 のリカバリーコマンドを実行する際は、データベースを停止しておくことが推奨されます。
リカバリー処理は破損したデータファイルを修正または再構築する操作を含むため、データベースが稼働中だと競合が発生する可能性があります。
- リカバリーコマンドとデータベースの停止の関係
【Recover コマンド】
java -cp h2*.jar org.h2.tools.Recover -dir ./recover -db mydb
- データベースを停止した状態で実行することを推奨
-
Recover
コマンドは破損したデータベースからmydb.h2.sql
を生成し、新しいデータベースを作成するのに使われる - 実行中にデータベースが動いていると、ファイルアクセスの競合が起こる可能性がある
【SCRIPT コマンド】
java -cp h2*.jar org.h2.tools.Script -url jdbc:h2:file:./mydb -script backup.sql
- データベースが動作していても実行可能
- ただし、実行中にトランザクションが走っていると、一部のデータが正しくエクスポートされない可能性がある
【SHUTDOWN COMPACT コマンド】
SHUTDOWN COMPACT;
- データベースを適切に終了し、データを最適化する
- このコマンドの前にリカバリーを行う場合は、データベースを停止しておくのが望ましい
- 公式ドキュメントの推奨
H2 の公式ドキュメントでは、破損したデータベースのリカバリーを行う際には、データベースを停止して実施することを推奨しています。
- 具体的なリカバリー手順
【手順 1: アプリケーションを停止】
systemctl stop my_app_service # サービスがある場合
kill -9 $(pgrep -f h2) # H2のプロセスを手動で停止
【手順 2: データベースファイルをバックアップ】
cp mydb.mv.db mydb_corrupt_backup.mv.db
【手順 3: Recover コマンドを実行】
java -cp h2*.jar org.h2.tools.Recover -dir ./recover -db mydb
【手順 4: RunScript で復元】
java -cp h2*.jar org.h2.tools.RunScript -url jdbc:h2:./newdb -script ./recover/mydb.h2.sql
【手順 5: アプリケーションを再起動】
systemctl start my_app_service
- 結論
Recover
を実行する場合 → データベースを停止すべきBACKUP TO
やSCRIPT
でのバックアップ → 稼働中でも実行可能SHUTDOWN COMPACT
は停止後に実行するのが望ましい
👉 Recover
を使う場合は、必ず H2 を停止してから実行することを強く推奨!