MySQLのエラー『Can’t Drop Database; Database Doesn’t Exist』の解決方法

MySQLのエラー『Can’t Drop Database; Database Doesn’t Exist』の解決方法

MySQLで「DROP DATABASE」コマンドを実行した際に、「Can’t drop database; database doesn’t exist」というエラーが発生することがある。これは指定したデータベースが実際には存在していない場合に出るエラーメッセージ。コマンドの実行ミス、データベース名のタイプミス、既に削除済みのデータベースに対してDROPを再度実行した場合など、さまざまな原因がある。

1. エラーの発生条件

存在しないデータベースをDROPしようとしたときに発生する。

DROP DATABASE nonexistent_db;

ERROR 1008 (HY000): Can't drop database 'nonexistent_db'; database doesn't exist

2. DROP DATABASEコマンドの基本構文

データベースを削除する標準的な構文は以下の通り。

DROP DATABASE データベース名;

存在確認をせずにこのコマンドを実行すると、対象のデータベースが無ければエラーが出る。

3. データベース名のスペルミスに注意

スペルミスが原因で存在しないと判断される場合がある。MySQLはデフォルトでデータベース名の大文字小文字を区別する設定になっている場合もある。

SHOW DATABASES;

4. 大文字・小文字の違いによる誤判定

Unix系OS(Linuxなど)では、MySQLがファイルシステムの影響を受けて、データベース名の大文字小文字を区別する。

DROP DATABASE MyDatabase;
-- 実際には mydatabase という名前で存在している場合、エラーになる

5. 既に削除されたデータベースに対する再DROP

スクリプトなどで同じDROPコマンドを複数回実行していると、2回目以降でこのエラーになる。

DROP DATABASE IF EXISTS mydb;

このように「IF EXISTS」を使えば、存在していない場合にもエラーを抑制できる。

6. 「IF EXISTS」句で安全に削除する

「IF EXISTS」を使うことで、「存在しているときだけ削除する」という安全な動作になる。

DROP DATABASE IF EXISTS mydb;

この句は複数人で開発している環境やCI/CD環境で特に有用。

7. データベースが一時的に消えた原因を探る

ストレージ障害や他ユーザーによる削除、バックアップ復元などによって、意図せずデータベースが消えていることがある。

ログファイルを確認:

/var/log/mysqld.log

サーバの操作履歴や他の管理者による作業記録を確認する。

8. パーミッション不足による誤判定

ユーザー権限が足りない場合、MySQLが「見えていない」だけのケースもある。

SHOW GRANTS FOR 'user'@'localhost';

権限がないと「SHOW DATABASES」や「DROP DATABASE」でエラーになる場合がある。

9. ファイルベースで確認する(Linux環境)

Linuxサーバでは、データベースごとにディレクトリが割り当てられている。

ls -l /var/lib/mysql/

このディレクトリ一覧に存在していれば、データベースは物理的に存在している。

10. スクリプトやバッチで複数DROPを行う場合の注意点

同一スクリプト内で複数DROPがある場合は、すべてに「IF EXISTS」をつけておくと安全。

DROP DATABASE IF EXISTS dev_db;
DROP DATABASE IF EXISTS test_db;
DROP DATABASE IF EXISTS stage_db;

「IF EXISTS」をつけないと、1つでも存在しないDBがあるとスクリプト全体が失敗するリスクがある。

11. 標準出力での確認を組み込む

DROP前にログ出力や確認を入れておくことで、無意味なDROPの実行を回避できる。

SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'target_db';

このクエリで事前に確認し、結果が0件であればDROPをスキップするなどの処理に分岐できる。

12. DROPに失敗し続ける場合の最終手段

DROP DATABASE が失敗し続けるがファイルとしては存在しないような異常状態が続く場合、MySQLの再起動やファイルシステムの整合性チェックが必要になることもある。

systemctl restart mysqld

再起動で状態がリセットされることもあるため、どうしても削除できない場合の最終手段として使う。