failed to connect: ** (MyXQL.Error) (1044) (ER_DBACCESS_DENIED_ERROR) Access denied forでUserの権限に原因があった記録


前提

今回の事象は通常起こることは無いかと思います。
下記の前提条件で、表題のエラーに遭遇しました。

  1. docker-compose(Elixir+MySQL)を実装中に発生
  2. その時コンテナを作ったり消したりを繰り返していた
    1. DBコンテナのボリュームは消していないこともあった
  3. mysqlで初回実行するクエリもいじっていた。
    1. クエリは下記のような権限に関するものだった。
  GRANT ALL PRIVILEGES ON *.* TO 'app'@'%' WITH GRANT OPTION;
  FLUSH PRIVILEGES;

結論、上述のトライアンドエラーの中で必要だったことは、

  • コンテナを整えるときは、DBコンテナのキャッシュやボリュームをちゃんと消す

です。

このエッジケースにおいて何が原因だったのかを後述します。

事象


app_1  | [error] MyXQL.Connection (#PID<0.315.0>) failed to connect: ** (MyXQL.Error) (1044) (ER_DBACCESS_DENIED_ERROR) Access denied for user 'service'@'%' to database 'service_dev'
mysql> select * from user_privileges;
+----------------+---------------+----------------+--------------+
| GRANTEE        | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+----------------+---------------+----------------+--------------+
| 'service'@'%' | def           | USAGE          | NO           |
+----------------+---------------+----------------+--------------+
1 row in set (0.00 sec)

INFORMATION_SCHEMA USER_PRIVILEGESテーブルを確認してみる。
https://dev.mysql.com/doc/refman/5.6/ja/information-schema-user-privileges-table.html

PRIVILEGE_TYPE:USAGEというのは権限が全く無い。
参考:MySQLの権限一覧
https://dev.mysql.com/doc/refman/5.6/ja/privileges-provided.html

PRIVILEGE_TYPE:Createであるべき。