4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Mysql2::Error: Tablespace is missing for tableの対処法

Posted at

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ファイルは絶対触らないようにしましょう。(教訓)

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?