木小鱼的笔记

技术之海,顺势者昌;看问题,要看思路与问题实质

MySQL在本机无法基于localhost访问的问题解决

引言: 在本地访问数据库之时,一般使用localhost, 127.0.0.1来进行数据库访问,但是笔者这几天就碰到了只能通过127.0.0.1来访问,但是无法基于localhost来访问,非常之诡异…..

环境介绍

Centos 7, mariadb 10.2 tomcat 8 , Java War应用

问题表现

在数据库连接中使用了localhost:3306之类的连接信息,但是在启动服务过程中,一直在报连接数据库的错误信息:

java.sql.SQLException: Access denied for user ‘bladestone’@’localhost’ (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:928)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1750)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1290)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2493)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2526)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2311)
at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:834)
at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47)
at sun.reflect.GeneratedConstructorAccessor62.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:142)
at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:211)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:136)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1271)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1325)
at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:1215)
[com.alibaba.druid.pool.DruidDataSource]create connection error

但是,切换到127.0.0.1确是可以被正常访问的,问题出在localhost上。

分析过程

ping localhost

这个命令是可以正常访问的, 换句话说localhost是一个正确的域名,可以被正确的解析到。
之后回想起来,之前是使用如下命令来授权访问的:

grant all privileges on zhouzdb.* to ‘zhouz’@’%’ identified by ‘1234’;

后面的‘%’是一个通配符,用以匹配所以的ip地址,但是其是否可以匹配localhost这个特殊域名呢?验证一下即可知道:

 grant all privileges on zhouzdb.* to ‘zhouz’@’locahost’ identified by ‘1234’;

在本地重新访问一下mysql,结果顺利访问成功了。结果证明: %无法匹配localhost这个特殊的域名地址信息,需要额外进行添加设置。

总结

这里的分析过程中,有一个想当然的问题是通配符是否可以匹配localhost的问题,自己在从一开始就认为应该是,但是事实上不是的。由于这个错误的假定认知,结果花费了非常多的时间分析这个问题,这其中的弯路是非常值得深思的。

————————- 罪恶的分割线,终于到底了 —————————————————

阅读更多

扫码向博主提问

去开通我的Chat快问

blueheart20

博客专家

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • 架构师
  • AI手工匠人
  • 攻城狮
  • Java老兵
  • 问题解决者
版权声明:本文章是作者辛勤书写的成果,如需转载,请与作者联系,并保留作者信息以及原文链接,谢谢~~ https://blog.csdn.net/blueheart20/article/details/75033001
个人分类: 问题分析 数据库
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭