MySQLのエラー『Table Doesn’t Exist』の解決方法

MySQLのエラー『Table Doesn’t Exist』の解決方法

MySQLで『Table Doesn’t Exist』エラーが発生すると、指定したテーブルにアクセスできず、クエリが失敗する。原因としては、テーブルの存在確認ミスや、ファイルシステムの問題、権限の設定ミスなどが考えられる。発生条件と解決策を詳しく説明する。

1. エラーの発生条件

このエラーは、以下のような状況で発生する。

  • 指定したテーブルがデータベースに存在しない。
  • テーブル名の大文字・小文字の違い。
  • ストレージエンジンの設定ミス。
  • データベースの破損や不整合が発生している。
  • 権限が不足している。

エラーメッセージの例:

ERROR 1146 (42S02): Table 'database_name.table_name' doesn't exist

2. テーブルの存在を確認する

まず、対象のテーブルがデータベースに存在するか確認する。

SHOW TABLES;

特定のテーブルが存在するか確認するには、次のクエリを実行する。

SELECT table_name FROM information_schema.tables WHERE table_schema = 'database_name' AND table_name = 'table_name';

3. 大文字・小文字の違いを確認する

Linux環境では、テーブル名の大文字・小文字が区別される。以下の設定を確認する。

SHOW VARIABLES LIKE 'lower_case_table_names';

値が 0 の場合は、大文字・小文字が区別される。小文字に統一する場合は、my.cnf に次の設定を追加する。

[mysqld]
lower_case_table_names=1

4. 権限の問題を確認する

ユーザーがテーブルにアクセスできる権限を持っているか確認する。

SHOW GRANTS FOR 'username'@'host';

権限が不足している場合、適切な権限を付与する。

GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host';
FLUSH PRIVILEGES;

5. ストレージエンジンを確認する

一部のストレージエンジンでは、テーブルの物理ファイルが異なるため、正しく認識されないことがある。

SHOW TABLE STATUS WHERE Name = 'table_name';

特定のストレージエンジンを使用するには、次のように変更する。

ALTER TABLE table_name ENGINE = InnoDB;

6. データベースを修復する

データベースの不整合が原因の場合、mysqlcheck を実行して修復する。

mysqlcheck -u root -p --repair --all-databases

7. MySQLのキャッシュをクリアする

キャッシュが原因でテーブルが認識されない場合がある。

RESET QUERY CACHE;

8. テーブルの物理ファイルを確認する

データディレクトリ内にテーブルの物理ファイルが存在するか確認する。

ls -l /var/lib/mysql/database_name/

テーブルの .frm.ibd ファイルがない場合、バックアップから復元する。

9. MySQLを再起動する

設定変更後や一時的な不具合の解決に、MySQLの再起動を試す。

sudo systemctl restart mysql

10. バックアップから復元する

テーブルが削除されてしまった場合、バックアップから復元する。

mysql -u root -p database_name < backup.sql

11. MySQLのログを確認する

エラーの詳細を知るため、ログを確認する。

sudo cat /var/log/mysql/error.log