0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

H2 データベースのリカバリー時にデータベースは停止すべきか?

Posted at

【結論】
H2 のリカバリーコマンドを実行する際は、データベースを停止しておくことが推奨されます。
リカバリー処理は破損したデータファイルを修正または再構築する操作を含むため、データベースが稼働中だと競合が発生する可能性があります。


  1. リカバリーコマンドとデータベースの停止の関係

【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;
  • データベースを適切に終了し、データを最適化する
  • このコマンドの前にリカバリーを行う場合は、データベースを停止しておくのが望ましい

  1. 公式ドキュメントの推奨
    H2 の公式ドキュメントでは、破損したデータベースのリカバリーを行う際には、データベースを停止して実施することを推奨しています。

  1. 具体的なリカバリー手順

【手順 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

  1. 結論
  • Recover を実行する場合 → データベースを停止すべき
  • BACKUP TOSCRIPT でのバックアップ → 稼働中でも実行可能
  • SHUTDOWN COMPACT は停止後に実行するのが望ましい

👉 Recover を使う場合は、必ず H2 を停止してから実行することを強く推奨!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?