はじめに
Dockerを使ったMySQLのローカル開発環境を構築中に、PC再起動後にMySQLのテーブルデータが消えてしまう問題が発生しました。同時に、データベースの復旧を試みた際にエラーが発生し、ダンプファイルの再インポートも失敗しました。本記事では、発生した事象、対応内容、考えられる原因をまとめます。
発生した事象
-
PCを再起動してDocker Desktopを再起動
- Dockerコンテナ(MySQL、アプリケーション、phpMyAdmin)は正常に起動。
- しかし、MySQLデータベースに接続した際、テーブルデータが空になっていることを確認。
- phpMyAdminでデータベースのテーブルを参照しようとすると、以下のエラーが発生:
Tablespace is missing for table `hogehoge`.`hugahuga_table`.
-
ダンプファイルの再インポートを試みた際のエラー
- ダンプファイルのインポートを試みたところ、以下のエラーが発生しインポートできず:
Tablespace '`hogehoge`.`hugahuga_table`' exists.
- 既存のテーブルスペースが原因でインポートが拒否される状態。
- ダンプファイルのインポートを試みたところ、以下のエラーが発生しインポートできず:
-
Docker Desktop上で停止→再起動の場合(問題解決後に実施)
- Docker Desktop上でコンテナを停止してから再起動した場合は、データが正常に残存しており、問題は発生しなかった。
対応内容
-
コンテナを削除して環境を再構築
以下の手順でDocker環境をリセット。docker rm hogehoge_db docker system prune -a --volumes docker-compose build docker-compose up -d
-
ダンプファイルを再インポート
- 新たに構築した環境にダンプファイルをインポートし直し、動作確認を実施。
- エラーは発生せず、正常に動作。
考えられる原因
-
データ永続化の設定ミス
-
docker-compose.yml
では以下の設定をしていた:volumes: - ./db:/var/lib/mysql
- しかし、ホスト側の
db
ディレクトリにMySQLの必要なデータファイルが完全に保存されていない可能性。
-
-
MySQLデータの破損
- PCの強制終了や不適切なシャットダウンが原因で、MySQLのテーブルスペースが破損した可能性。
検討事項
-
データ永続化の設定を見直す
- データ永続化にホスト側ディレクトリ(
./db
)を使う場合、必要なファイルが正しく保存されているか確認。 - Dockerボリュームを使用することで、ホスト側のファイルシステム依存を減らす選択肢も検討。
- データ永続化にホスト側ディレクトリ(
-
MySQLのバックアップ体制を強化
- 定期的に
mysqldump
でデータベースのバックアップを取得する。
- 定期的に
-
PC再起動とコンテナ停止→起動の違いを検証
- 再現テストを行い、どの条件でデータが失われるのかを特定。
-
Docker Desktopのログ確認
- 再起動時のエラーが記録されていないか、Docker Desktopのログを確認。
まとめ
今回の問題は、Dockerを利用する際のデータ永続化設定や再起動時の処理に起因する可能性があります。原因の特定には至っていませんが、再発防止のための設定見直しや検証を進める必要があります。