MySql远程访问被拒绝

时间:2014-07-17 16:16:16

标签: java mysql remote-access

我正在尝试连接到mysql数据库。当我尝试通过mysql Workbench连接时,我可以通过java应用程序,它说:

Caused by: java.sql.SQLException: Access denied for user 'root'@'1.2.3.4' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1084)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:926)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1748)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1288)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2506)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2539)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2321)

数据源定义是:

<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://3.3.3.3:3306"/>
    <property name="username" value="root"/>
    <property name="password" value="12345"/>
</bean>

并且在db中,user_priviliges表是:

'root'@'%', 'def', 'USAGE', 'NO'

请帮我解决这个问题?

编辑:

我正在使用jdbcTemplate,错误就在这一行:

getJdbcTemplate().queryForList(sql.toString());

1 个答案:

答案 0 :(得分:1)

除了您已拥有的'root'@'localhost'帐户(使用相同的密码)之外,您还需要为'root'@'%'创建一个帐户。为什么?请参阅mysql docs on this subject。以下是相关部分:

  

其中两个帐户的用户名为monty,密码为some_pass。这两个帐户都是具有完全权限的超级用户帐户。 &#39; monty&#39; @&#39; localhost&#39;帐户只能在从本地主机连接时使用。 &#39; monty&#39; @&#39;%&#39;帐户使用&#39;%&#39;主机部分的通配符,因此可用于从任何主机连接。

     

有必要让monty的两个帐户都可以作为monty从任何地方连接。如果没有localhost帐户,当monty从本地主机连接时,mysql_install_db创建的localhost的匿名用户帐户将优先。因此,monty将被视为匿名用户。这样做的原因是,匿名用户帐户的主机列值比“monty&#39; @&#39;%&#39;帐户因此在用户表排序顺序中更早出现。 (用户表排序将在第6.2.4节“访问控制,第1阶段:连接验证”中讨论。)