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

时间:2022-05-08 04:19:26

引言: 在本地访问数据库之时,一般使用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的问题,自己在从一开始就认为应该是,但是事实上不是的。由于这个错误的假定认知,结果花费了非常多的时间分析这个问题,这其中的弯路是非常值得深思的。

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