Laravel sailのmysqlでアクセスエラー(ERROR 1044(42000))

  • 2021年9月30日
  • 2023年5月11日
  • Laravel

Laravel Sailでmysqlにログインし、CREATE文などを打とうとした場合のエラー

ERROR 1044 (42000):Access denied for user ”sail@’*’ to database ‘test_database’

に対する対処法です。

Laravel sailのmysqlでアクセスエラー(ERROR 1044(42000))

該当エラーではアクセスできないとあるが…

エラーの意味は、「データベースに対するアクセスが拒否されました」という意味です。
とはいえtest_databaseはCREATE文で作成しようとしている段階です。

つまり、ログインしたユーザーにデータベース操作権限がないことがエラーの原因だと分かります。
そこでユーザーの一覧をまずは表示してみました。

いつも通り「select * from mysql.user」を打ちましたが

ERROR 1045 (28000): Access denied for user ‘sail’@‘*’

で撃沈。
そもそもユーザー一覧も見れませんでした。

これらのエラーをもとに検索しましたが

  • mysqlに入る際に-hで127.0.0.1を指定する
  • mysqlのポート番号を3306から変更する
  • configのキャッシュをクリアする

などがありましたが、どれも解決には至りませんでした。

現在MySQLにログインしているユーザーを確認する

そこで、とりあえず現在、どのユーザーでログインしているのかを確認します。
現在のユーザーについて調べるのは「select user(), current_user();」です。

結果は以下の通り

  • user():sail@localhost
  • current_user():sail@*

user()はログインしようとしたユーザー、current_user()は実際にログインしたユーザーです。
ホストをlocalhostで指定したのですが、そのホストは存在しないので、それ以外のホストで入っているようです。

そしてどうやら「sail@*」に全く権限がないように思えました。
そこで、ログインするユーザーを「sail」から「root」に変更します。

「root」は管理者の代表的なユーザーで、あらゆる権限を持ちます。
Laravel Sailの場合、変更する場所は一か所でOKです。

envファイルの中身を変更することで解決

.envファイルのうち、DB関連の場所に注目します。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=root  ←sailから変更
DB_PASSWORD=password
DB_USERNAMEの部分がsailになっているはずです。
ですのでここをrootに変更します。
Laravel Sailを使用している場合、「docker-compose.yml」でのDB関連の指定も.envを参照しているはずですので、気にしなくてOKです。
この状態で仮想環境を再起動します。
もしもdockerなどを使用しているなら、mysqlのUsernameがrootに変わったことを確認しましょう。
この状態で
sail mysql
を入力すれば権限を持ったrootユーザーでログインできます。
これでデータベースの作成なども容易に行えます。
同じようなエラーが出ている方は参考にしてみてください。