遇到这个报错,一般人反应就是:用户名或密码错误、用户无权限、该 ip 无权限登陆数据库。百度几乎全是这种答案。什么用户名密码后面带了空格啊,什么直接把所有权限给当前用户啊这样的。但是今天我弄了一早上,找了几十个相关讨论,都不行。
后来发现了一篇文章说:root 用户默认是没有远程登陆权限的,默认只有 localhost 和 127.0.0.1 的所有权限。那么问题来了,我就是用的 root 用户在 localhost IP 登陆的数据库啊,为什么还是这么报错?更奇葩的情况是:
- 我有两个数据库 A 和 B。A 和 B 所有语句都是一样的。我把语句写在文件里,只是把数据库名改了下然后复用的;
- 我的 Navicat 能连接 A,但连不上 B。连 B 报错:Access denied for user ‘root’@‘localhost’ (using password: YES);
- 我的程序则相反,连不上 A,但能连接 B......连 A 报错:Access denied for user ‘root’@‘localhost’ (using password: YES);
- 也许是 Navicat 和程序不能同时连接同一个数据库?No. 绝对可以同时连,过去我也是这么边改程序边用 Navicat 看数据的;
- 也许我用户名密码错了?No. Navicat 和程序用的同一个用户名密码,复制过去的。我也确认程序里用户名密码前后左右绝对没有空格;
- 也许我的 root 真的没有 localhost 的远程登录权限?No. 权限已经给满了,直接
grant all privileges on *.* to 'root'@'localhost';
了,而且要是真没有权限,那么 Navicat 和程序应该同时连不上 A 和 B;
那么最后我怎么解决的呢?在 A 和 B 中分别新建了一个用户,然后给他在 localhost IP 下某个库的所有权限
。然后 Navicat 和程序都能通过这个用户正常连接了......我还是不清楚为什么用 root 用户会出现这种问题。我只知道新建用户然后授权可以解决。
也许有人会觉得这不是废话吗?我只是想提示被这个问题困扰的程序员们,赶紧新建个用户先用着吧!别纠结了,现在都凌晨两点了!附上建用户的SQL吧,免得费事搜:
create user 'userName'@'hostIP' identified by 'password';
grant all privileges on `databaseName`.* to 'userName'@'hostIP';
flush privileges;