目录
一、问题背景
在本机部署了MySQL服务,在虚拟机中启动Web应用。但是在应用启动的过程中提示无法连接到宿主机的MySQL数据库。
1.1 环境说明
宿主机:Win10专业版
虚拟机:VitrualBox
虚拟机OS:Ubuntu18.04
二、原因排查
在Navicat中使用固定ip地址创建数据库连接,结果报了如下错误:
1045 - Access denied for user 'root'@XXXX'(using password: YES)
我使用root用户进行的登录,因为MySQL部署在宿主机上,所以按道理是可以正常访问的。
从using password: YES 可知:
输入的密码是正确的
那么,可能的原因:
没有相关的权限
所以,首先想到的就是为这个用户赋权(主机名localhost登录):
grant all PRIVILEGES on *.* to 'root'@'%';
但是Navicat报错了。错误信息如下:
grant all PRIVILEGES on *.* to 'root'@'%'
> 1410 - You are not allowed to create a user with GRANT
上面的命令是什么意思呢?
- grant:赋权命令
- all PRIVILEGES:当前用户的所有权限
- on:介词,和后面的*.*结合使用
- *.*:点前面是数据库,后面是表。本命令表示所有数据库和表
- to:介词,用于限定后面的 'root'@'%'
- ‘root’@’%’:权限赋给root用户,所有ip都能连接。@前面是用户名,后面是可以从哪些ip地址连接,如果设置%表示所有ip地址都能连接。
另外报错:“you are not allowed to create user with grant ”,又告诉了我们什么信息呢?
它的意思是:不允许使用grant的方式创建用户。
难道当前用户没有grant的权限?
那么,排查下root用户是否有grant_priv 权限,而这些信息在`mysql`.user表中都有:
select user, grant_priv, host
from `mysql`.user;
执行结果如下:
也就是说:
1. root用户有 赋权的权限 => grant_priv列为Y
2. root的 host只有localhost => 意味着不可以通过ip+端口的方式(以root用户登录)访问MySQL数据库
既然root用户有赋权的权限,为什么还会提示:“you are not allowed to create user with grant” 呢?
原因如下:
当一个用户自己的登录host为localhost时,是不允许授权别的用户通过非localhost进行登录的。
三、解决办法
以root身份(先通过localhost登录Navicat)执行下面的sql:
-- 1.更新root用户的host为%
update `mysql`.`user`set host='%' where user='root';
-- 2.刷新权限
flush privileges;
注:这里一定不能忘了步骤2,否则即使数据更新了,也是不生效的。
此时,就可以通过本地ip+端口的方式登录MySQL了
至此,本地的MySQL数据库无法通过ip地址访问的问题解决了!!!
perfect!!!
四、文章总结
本文描述了无法通过ip地址访问MySQL数据库的问题,然后根据报错信息中的“using password: YES”,排除了密码错误的因素。
后面打算给root用户赋权限,使其可以从任意ip地址进行连接。但是在赋权的过程中提示:“you are not allowed to create user with grant”,原因是root用户自己的登录host就是localhost,是无法给其他用户设置其他的登录host(非localhost)的。
问题的解决只能借助于修改`mysql`.user表中的host字段,将其值设置为%,表示某个用户可以在任意主机上进行登录。
同时我们还发现一个有趣的现象:如果`mysql`.user表中的host字段为localhost,即使用户在数据库服务器本地登录,也不可以将Navicat的host设置为本地的ip地址,必须为localhost才可以正常登录。
五、参考文章
you are not allowed to create user with grant