Host is not allowed to connect to this MySQL server
前置きになります。
表題のエラーが出てSQL クライアントツール(DBeaver)から接続が失敗する事象に陥りました。
仮想で立てた環境内のDBにアクセスをしようとしてます。
実質、localhostでのアクセスでないので外部ホストにアクセスを試みるような感じですね。
当事象は、MySQLのユーザで外部ホストから接続可能なユーザを作成して、クライアントから、作成したユーザでアクセスしてあげることで解決しました。
備忘録として残しておこうと思います。
MySQL ユーザ権限設定
現在のユーザを確認
ユーザにはアクセス権限が「host」カラムで指定されているようです。
ユーザのアクセス権限状況を確認してみましょう。
mysql> select user, host from mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)
「host」カラムが「localhost」になっている場合、文字通りですが、localhostからしか接続できません。
外部のホストからアクセス可能なユーザを作成
以下のクエリでユーザを作成します。
grant all privileges
on [db_name].* to [user_name]@"[ip_address]"
identified by '[password]' with grant option;
すべてのDBにアクセスでき、どのホストからでもアクセスとしたいので「*」と「%」を使用して「root」ユーザを作成しました。
※対象の環境に合わせて適宜値を割り振ってください。
mysql> grant all privileges on *.* to root@"%" identified by 'password' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select user, host from mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)
hostが「%」のほうのrootユーザができました。
このユーザであらためて接続してみましょう!
補足
権限ユーザの削除
rootユーザがふたつ存在するけど片方だけ消すにはどうすればいいの?と思った人もいるかと思います。
「host」を一緒に指定すればOKです。
drop user [user_name]@"[ip_address]";
ちなみに以下は今回作成したhost「すべて」指定のrootユーザを削除する例です。
mysql> drop user root@"%";
GRANT USERとCREATE USERについて
どちらのクエリでもユーザを作成できます。
CREATE USER句でユーザを作成した場合、初期設定では権限「なし」の状態です。
権限を付与した状態でユーザを作成したい場合、もしくは、後付けで権限付与する場合、GRANT USER句を使用します。
以下参考になりました。
https://proengineer.internous.co.jp/content/columnfeature/6638