Laravelでコマンド開発中に、何もしてないのに突如下記のエラーがでました。
「Mysql2::Error: Tablespace is missing for table」
何もしてないのに!!
あまり日本語記事がなかったので、自分用に残しておこうと思います😃
環境
$ php artisan --version
Laravel Framework 5.5.50
$ php -v
PHP 7.1.33 (cli) (built: Oct 31 2019 17:37:57) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
$ composer -v
Composer version 2.0.12 2021-04-01 10:14:59
$ mysql --version
mysql Ver 8.0.22 osx10.15 x86_64 (Homebrew)
原因
エラーメッセージを翻訳してみると、下記の通り。
Mysql2 :: Error:テーブルのテーブルスペースがありません
うん、そのまんまですね。
テーブルスペースとやらがないらしいけど、テーブルスペースってなんだろう??
調べてみた。
InnoDB テーブルおよび関連するインデックスのデータを保持できるデータファイル。
システムテーブルスペースには InnoDB データディクショナリが含まれており、MySQL 5.6 より前は、デフォルトで他のすべての InnoDB テーブルが保持されます。
mysqlのデータファイルのようですね。
そして、拡張子「.ibd」ファイルとしてmysqlのディレクトリの保存される様子。
.ibd ファイル
file-per-table テーブルスペースおよび一般テーブルスペースのデータファイル。 File-per-table テーブルスペースの .ibd ファイルには、単一のテーブルおよび関連するインデックスデータが含まれます。 一般テーブルスペース .ibd ファイルには、複数のテーブルのテーブルおよびインデックスデータを含めることができます。
参照:https://dev.mysql.com/doc/refman/8.0/ja/glossary.html#glos_tablespace
あ、、、そういえばMacBookのストレージ容量が少なくなってきて大容量のファイルを消している時に、
「これいらなそうだな~」と思って消した気がする。。。
dumpだと思ってたけど、あれが.ibdファイルだったのか。。。(すいません何かしてました)
単純にディレクトリ消したりHDDが死んでたりしても、出ることもありそうですね。
試してみたこと
という訳で、.ibdファイルを復活させれば良さそうなので色々試してみます。
マイグレーションしてみる
私の場合はLaravelなので、マイグレーションをもっかいすれば復活してくれそうなので試してみます。
bash-4.2# php artisan migrate
Nothing to migrate.
あれ?特にマイグレーションできるファイルがないみたい。
DBを見てみると、しっかりテーブルが存在してました😮
どうやら、idbファイルが消えてもテーブルごと消える訳ではなさそうです。
そして、テーブルを開こうとしてもエラーになって開けない。。。
今回はテーブルのデータも必要ないので、テーブルごと消してしまいましょう。
##テーブルを削除する
drop table hogehoge
すると、下記エラーで怒られました🙃
cannot delete or update a parent row: a foreign key constraint fails
外部キー制約が貼られてた。
参照している別テーブルのレコードを削除すれば消せると思いますが、今回は消したくないので一時的に外部キー制約を無効にします。
外部キー制約を一時的に無効にする
SET FOREIGN_KEY_CHECKS = 0;
drop table hogehoge
無事削除できました、忘れないように外部キーを戻しておきます。
SET FOREIGN_KEY_CHECKS = 1;
本来はよろしくない対応ですが、今回は他のテーブルに影響を与えずに問題が出ているテーブルだけ作り直したいので、この対応としました。
マイグレーションをやり直してみます。
再度マイグレーションする
bash-4.2# php artisan migrate
Migrating: 2021_05_20_164657_create_hoge_table
Migrated: 2021_05_20_164657_create_hoge_table
いけました!🤗
テーブルが無事に開けるようになり、SQLの発行やモデル参照も問題ないようです!!
第3部完!!
docker環境でDBごと作り直しても良いなら
dockerのDBコンテナイメージを削除してビルドし直せば、何も考えず解決できそう。
何も考えなくて良いのでラクっちゃラクですね。
終わりに
「何もしてないと思ってる時は、だいたい何かやらかしているのが人間」だと改めて認識しましたw
mysqlのidbファイルは絶対触らないようにしましょう。(教訓)