#どんなエラー?
docker上でlaravelによるアプリ開発をしていて、コンテナを起動したまま.envの内容(APP_NAME)を変えて、一度docker-compse down
を打ったところ、mysqlがおかしな挙動を起こすようになりました。
具体的にはdocker-compose exec php php migrate:fresh
を打つと、削除コマンドはうまくいくのに、migrateコマンドがうまくいかないというものでした。(タイトルのエラーが出ます)
テーブル消せているのにテーブルがあってマイグレートできませんとは...?というところでつまづきました
ターミナルの様子
% docker-compose exec php php artisan migrate:fresh
Dropped all tables successfully.
Illuminate\Database\QueryException
SQLSTATE[HY000]: General error: 1813 Tablespace '`laravel`.`migrations`' exists. (SQL: create table `migrations` (`id` int unsigned not null auto_increment primary key, `migration` varchar(255) not null, `batch` int not null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
667| // If an exception occurs when attempting to run a query, we'll format the error
668| // message to include the bindings with SQL, which will make this exception a
669| // lot more helpful to the developer instead of just the database's errors.
670| catch (Exception $e) {
> 671| throw new QueryException(
672| $query, $this->prepareBindings($bindings), $e
673| );
674| }
675|
+51 vendor frames
52 artisan:37
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#原因
mysqlのコンテナはdocker image
に前回のコンテナで作られたテーブルデータを残して次のコンテナに引き継いでいるためでした。
もう少し詳しくいうと、dockerを落とす前に.envで設定を変えたのにテーブルを消さず、そのままdocker-compose down
をしたので、前回コンテナ作成時のアプリケーションのデータは残っているけど、今回のコンテナは.envの整合性が取れない違うアプリと判断されたようです。
そのため前回の設定のデータという異物をmysql(sequelpro)はデータとしてみなさないためか、mysqlからは確認できませんでした。
さらに、この状態でテーブルを上書きすると、違うアプリ(APP_NAME)のデータを上書きすることとなってしまうためエラーを吐くという状態になっていました。
#解決方法
コンテナ(docker)にログインして、不要なデータを削除したのちに、docker-compose exec php php artisan migrate
で直ります
#####・コンテナ(docker)にログイン
# mysqlのコンテナ名を確認
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b683d1147a97 nginx:stable-alpine "nginx -g 'daemon of…" 38 minutes ago Up 37 minutes 0.0.0.0:8080->80/tcp nginx
7345eb3d7172 construction_management_system_php "docker-php-entrypoi…" 38 minutes ago Up 38 minutes 80/tcp, 443/tcp, 0.0.0.0:9000->9000/tcp php
82289ada823c mysql:5.7 "docker-entrypoint.s…" 38 minutes ago Up 38 minutes 33060/tcp, 0.0.0.0:4306->3306/tcp mysql
# ログインコマンド
% docker exec -it 82289ada823c /bin/bash
# 下記のコマンドでログインを確認できた
root@82289ada823c:/#
#####・dockerの中の/var/lib/mysqlの中に削除したはずのlaravel(データベースの残骸)を削除
# 現況のファイルを探す
root@82289ada823c:/# cd /var/lib/mysql
root@82289ada823c:/# ls
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 laravel performance_schema public_key.pem server-key.pem
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 mysql private_key.pem server-cert.pem sys
# laravel(データベースで中にテーブルが入ってます)を削除
root@82289ada823c:/# rm -rf laravel
# laravel(データベース(テーブルの入れ物))は必要だったみたいだったので下記コマンドでフォルダだけ作成し直しました
root@82289ada823c:/# mkdir laravel
※参考としてlaravelの中身を添付しておきます
root@82289ada823c:/var/lib/mysql/laravel# ls
failed_jobs.ibd migrations.ibd operation_amounts.ibd operations.ibd password_resets.ibd projects.ibd reasons.ibd record_timings.ibd users.ibd
# 上記ののち、下記コマンドで正常な挙動をしました。
% docker-compose exec php php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.1 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.03 seconds)
Migrating: 2020_05_02_081128_create_projects_table
Migrated: 2020_05_02_081128_create_projects_table (0.13 seconds)
Migrating: 2020_05_02_091702_create_record_timings_table
Migrated: 2020_05_02_091702_create_record_timings_table (0.15 seconds)
Migrating: 2020_05_02_094345_create_operations_table
Migrated: 2020_05_02_094345_create_operations_table (0.12 seconds)
Migrating: 2020_05_02_094954_create_operation_amounts_table
Migrated: 2020_05_02_094954_create_operation_amounts_table (0.14 seconds)
Migrating: 2020_05_02_100233_create_reasons_table
Migrated: 2020_05_02_100233_create_reasons_table (0.11 seconds)
SQLSTATE[HY000]: General error: 1813 Tablespace 'laravel
.migrations
' exists.の解決の参考にしたページ
#今後このエラーを起こさないためには
コンテナを落としてから.envファイルを変更しましょう
筆者も試しにコンテナを再起動したところ、設定を変えずにコンテナの再起動を行ったところ問題なくテーブルの更新を行うことができました。
テーブルデータを消さない方法
ここからは筆者は実行していないのですが、理論上は下記の通りでうまくいくと思われます。
.envファイルを前回のものに直してコンテナを再起動すれば、おそらく再度テーブルの内容をいじることができるようになります。
それが確認できたら.envなどの設定ファイルを触らず一度コンテナを落として、.envを修正して再度コンテナを立ち上げるという手順を取ればデータを消さずに済みます。
もし大事なデータがある場合は何かの参考にしていただければと思います。
※こちらはあくまで推測ですので、うまくいかない可能性もあります。その場合はご了承ください。