もくじ
エラー文
SQLSTATE[HY000]: General error: 1030 Got error 168 - 'Unknown (generic) error from engine' from storage engine
環境
- Laravel 7
- MySQL 8(Docker コンテナ内)
発生したタイミング
Laravelにおいてマイグレートしようとしたところ、発生しました。
$ php artisan migrate Illuminate\Database\QueryException SQLSTATE[HY000]: General error: 1030 Got error 168 - 'Unknown (generic) error from engine' from storage engine (SQL: create table `users` (`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| +39 vendor frames 40 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
MySQLの問題?
調べていくと、LaravelではなくMySQLの問題のようでした。
そもそもMySQLを起動させた状態で手動でテーブルを作成しようとしても同じエラーになることが判明。
mysql> create table users( -> id int, -> title varchar(10)); ERROR 1030 (HY000): Got error 168 - 'Unknown (generic) error from engine' from storage engine
MySQLのデータベースが壊れているか何かぽいので、データベースを削除してみます。
mysql> drop database users; ERROR 3679 (HY000): Schema directory './users/' does not exist
すると削除もできない・・・・。
と一度諦めたんですが、MySQLをそもそもDockerの中で起動しているので、Dockerに直接入って不要なファイルを削除します。
Dockerで不要なファイルを削除
何かしら壊れたファイルがあるようなのでそれを削除します。
ファイルの場所を確認
まずは、MySQLのほうでファイルの場所を確認します。
mysql> show variables like 'datadir'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.03 sec)
このディレクトリの中にファイルがあることがわかります。
ターミナルで今自分がどこにいるか
$ hostname XXXXXX-no-MacBook-Pro.local
結果がこうなると、Dockerの中ではなく通常のローカルディスクにいるので、まずDockerに入ります。
Dockerに入る
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1234567890ab mysql:8 "docker-entrypoint.s…" 19 hours ago Up 19 hours 0.0.0.0:3306->3306/tcp, 33060/tcp XXXX
コンテナIDを確認しDockerの内部に入れます。
$ docker exec -i -t 1234567890ab bash root@1234567890ab:/#
root@コンテナID
となれば、Docker内にいることになります。
ファイルの削除
今いる場所にあるファイルやディレクトリを確認します。
$ ls
不要なものをようやく削除できます!
$ rm -rf /var/lib/mysql/user
改めてマイグレートしてみます。
$ php artisan migrate
ここでマイグレーション ファイルが羅列されれば完了です。
解決できました。
Dockerを再起動させる('21 3月追記)
再びこの悪夢が起きて、上記では解決できなかったので追記。私はおそらくこれでなおりました。
MySQLをそもそもDockerの中で起動している場合に限りますが、Dockerを再起動させます。
$ docker ps // ID確認 $ docker stop xxxxxxxxxxxx // ID指定 $ docker start xxxxxxxxxxxx // ID指定
このあと、認証方式を変更するとマイグレーションできました。
認証方式の変更はこちらの記事をご参考ください。
参考URL
MYSQLでDROP DATABASEがエラーになる( ERROR 1010 (HY000): Error dropping database ) - Qiita