欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Access denied for user 'xxx'@'localh

程序员文章站 2022-05-15 16:14:56
...

最近在部署项目,由于之前是在windows做的开发,部署却是在linux下,吃了不少跨平台的亏,比如今天才发现linux下mysql的表名是严区分大小写的。这次是另一个坑,在tomcat连接mysql的时候,报错Access denied for user 'xxx'@'localhost.localdomain' (using

最近在部署项目,由于之前是在windows做的开发,部署却是在linux下,吃了不少跨平台的亏,比如今天才发现linux下mysql的表名是严格区分大小写的。这次是另一个坑,在tomcat连接mysql的时候,报错Access denied for user 'xxx'@'localhost.localdomain' (using password: YES))。


之前也遇到过类似的问题,不过是在windows下,而且错误信息有点区别,是Access denied for user 'xxx'@'localhost' (using password: YES)),排查结果就是缓存没清,实际用来连接数据库的用户名和密码与配置文件中的不一致,这种原因的排查只需要把用来连接数据库的用户名和密码打印一次就可以了,此处不表。但是,这次并不是这个原因造成的,用户名和密码没有错误。


排查过程:

先用root用户登录mysql,然后执行下列语句查询mysql的全部用户,观察结果,这有助于你对后续内容的理解:

SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

你会看到,即便是相同的用户名,也会有不同的@host后缀,这里指的是同一个用户在不同的主机上的登录,@host指的是主机


这里注意报错的是Access denied for user 'xxx'@'localhost.localdomain' (using password: YES))而不是Access denied for user 'xxx'@'localhost' (using password: YES)),差了一个localdomain还是有很大区别的。这就牵扯到了localhost和127.0.0.1(localhost.localdomain)的区别。

我们直接在命令行以“mysql -u用户名 -p密码”的形式登录mysql数据的时候,并没有使用tcp/ip连接,mysql会认为连接来自localhost,因此实际登录的是xxx@localhost。但是,在linux中,用tomcat连接数据库的时候(我在windows下不会这样,不知道为何),使用了tcp/ip,主机被判定为来自127.0.0.1,那么实际登录的就是 xxx@localhost.localdomain,那么你用xxx@localhost的密码去验证xxx@localhost.localdomain当然只能被判定为拒绝连接。


解决方法:

1.创建一个新的用户并授权其访问指定数据库的权限。这里我指定了主机为localhost.localdomain,意味允许用户名为snow的用户,以密码123在localhost.localdomain的主机上连接数据库;注意这个指定主机localhost.localdomain很关键。

GRANT USAGE ON *.* TO 'snow'@'localhost.localdomain' IDENTIFIED BY '123' WITH GRANT OPTION;

2.位该新用户赋予操作数据库exampleDB的全部权限。

grant all privileges on exampleDB.* to snow@localhost.localdomain identified by '123';

3.更新权限表

 flush privileges;

然后把代码中连接的用户名改为snow,密码改为123。,问题解决,成功连接上mysql了。

当然你也可以不改代码中的用户名和密码,只需将上述第1,2步骤的用户名和密码替换为你的用户名和密码即可。