引言: 在本地訪問數據庫之時,一般使用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的問題,自己在從一開始就認為應該是,但是事實上不是的。由於這個錯誤的假定認知,結果花費了非常多的時間分析這個問題,這其中的彎路是非常值得深思的。
http://www.woaipu.com/shops/zuzhuan/61406
http://nanning.xjwy.cn/f/bencandy.php?fid=43&id=117777
http://nanning.xjwy.cn/f/bencandy.php?fid=43&id=117890
http://nanning.xjwy.cn/f/bencandy.php?fid=43&id=117994
http://nanning.xjwy.cn/f/bencandy.php?fid=43&id=118376