Dockerで作成したローカル環境のデータベースの削除ができない。(Error dropping database)

公開日:

目次

先日、修理に出していた MacBook Pro が戻ってきたので、Time Machine の機能で、代替機として使用していたPC からデータを戻そうとした際に、Docker で作成したローカル環境のデータベースが壊れてしまっていることがありました。最初はデータが消えているだけかと重い、データをインポートしようとすると正常にできなかったので、データベースとしては存在しているようですが色々壊れてしまっているようでした。データベースを一旦削除してもう一度作成し直そうと思ったのですが、どうもエラーが出てしまいうまく行かなくて困ったので、解決方法をメモとして残しておきたいと思います。

まず、エラーが出た状況を説明します。データベースが壊れていることがわかったので、データベースクライアントである Sequel Pro から削除しようとすると、以下のようなエラーが。。。

Error dropping database

Sequel Pro からは削除できそうにないため、Docker の MySQL コンテナに入って直接操作します。

docker exec -it MySQLコンテナのコンテナ名 bash

MySQLコンテナのコンテナ名がわからない場合は docker ps で現在起動しているコンテナの一覧を表示した際に NAMES がコンテナ名に当たります。

MySQL コンテナに入ることができると以下のようになります。

I have no name!@59195326f848:/$

次に MySQL に接続するために以下のコマンドを実行します。

mysql -u root -p

コマンドを実行するとパスワードの入力が求められるため、docker-compose.yml の MYSQL_ROOT_PASSWORD で設定したパスワードを入力します。MySQL接続に成功すると以下の文が表示されます。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

更に以下のコマンドでデータベース一覧を表示できる。

mysql> show databases;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
| sys                |
+--------------------+
5 rows in set (0.08 sec)

さて、まず Docker コンテナ内のデータベースに接続することができました。それでは実際に壊れているデータベースを見ていきます。例えば、sample というデータベースが壊れているとします。以下のように削除しようと思っても削除できません。

mysql> drop database sample;
ERROR 1010 (HY000): Error dropping database (can't rmdir ‘./sample', errno: 66)

こういった場合は、データファイルごと削除してしまいましょう。まず、データファイルの場所を確認します。

mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.06 sec)

データファイルの場所が、/var/lib/mysql/sample/ ということがわかりました。MySQLから ^C で抜けてから、以下のコマンドでディレクトリ毎削除します。

rm -rf /var/lib/mysql/sample/

再度、MySQLに接続して、show databases; でデータベース一覧を表示すると削除できていることが確認できます。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.04 sec)

以上になります。ここまでできたら再度データベースを作り直すなどしてください。