【MySQL】エラー:SQLSTATE[HY000]: General error: 1030 Got error 168 - 'Unknown (generic) error from engine' from storage engine('21 3月追記)

もくじ

エラー文

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指定

このあと、認証方式を変更するとマイグレーションできました。

認証方式の変更はこちらの記事をご参考ください。

bonoponz.hatenablog.com

参考URL

MYSQLでDROP DATABASEがエラーになる( ERROR 1010 (HY000): Error dropping database ) - Qiita