【问题标题】:JDBC connection to remote MySQL DB fails;与远程 MySQL 数据库的 JDBC 连接失败;
【发布时间】:2016-01-01 23:06:14
【问题描述】:

我在连接到公共托管的静态 IP mysql 服务器时遇到了一个奇怪的问题。

我可以使用 MySQL Workbench 成功连接到服务器,也可以通过 SSH 连接到本地远程服务器。但是,从 jdbc 连接器连接到 mysql 服务器的尝试(通过 NetBeans 和通过本地部署的代码都失败)。在查看日志时,考虑到用户凭据是本地用户而不是远程用户,代码正在尝试与远程服务器连接。所以用户存在于远程但java在尝试连接时会考虑user@localhost。确切的错误显示为:

原因:java.sql.SQLException:用户访问被拒绝 'user'@'c-24-130-52-20.hsd1.ca.comcast.net'(使用密码:YES) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) ~[mysql-connector-java-5.1.27.jar:na] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237) ~[mysql-connector-java-5.1.27.jar:na] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169) ~[mysql-connector-java-5.1.27.jar:na] 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:928) ~[mysql-connector-java-5.1.27.jar:na] 在 com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1750) ~[mysql-connector-java-5.1.27.jar:na]

我的连接字符串是:

jdbc:mysql://user:password@W.X.Y.Z/

有人可以建议如何提及用户,以便 java 认为它是远程用户而不是我机器上的本地用户吗?

【问题讨论】:

  • 我认为错误中的地址表示您的机器,而不是它尝试连接的机器。 “用户”之后的标识符是标识谁在尝试连接。您确定所有远程计算机都允许连接到该服务器吗?
  • 哦,是的,你是对的。我一开始不明白这一点真是太愚蠢了。感谢您指出。是的,我通过将 bindaddress 设置为 0.0.0.0 来确保每个人都可以从外部进行远程访问。我将编辑问题以消除这种紧凑的愚蠢混乱。谢谢。
  • 但是现在我很好奇如何在连接字符串中提及远程机器的本地用户?我假设默认情况下,用户将被视为远程服务器上的用户,例如 user@w.x.y.z,而不是当前方式。我的宽带上没有静态 IP,因此在远程服务器上授予本地用户访问权限也不起作用。
  • 不只是监听地址。 MySQL 中的用户权限基于他们连接的用户名和主机,因此 jack@example.com 与 jack@foo.bar.com 不同。请参阅 MySQL 文档中的 privilege system。
  • 我认为这里的关键是从所有 IP 向该用户授予权限。见this question。

标签: java mysql jdbc


【解决方案1】:

我不知道这是否能解决您的问题,但您最好使用提供的 API 进行连接,而不是手动构建连接字符串。

这将使出错变得更加困难(这将难以诊断)并使参数替换更容易:

String username = "testuser";
String password = "test123";
String url = "jdbc:mysql://ip-address/databaseName";
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
Connection conn = DriverManager.getConnection (url, username, password);

【讨论】:

  • 感谢您的意见。但我使用的是 Play Framework,它在内部连接了你刚才提到的方式。提及连接字符串的目的是传达连接细节。 Netbeans 连接尝试也失败了,我认为这应该是非常标准的方式。令人惊讶的是,Mysql 工作台连接成功。因此,在这种情况下,这对问题没有多大帮助。 :-(
  • 无需致电Class.forName。自 JDBC 4 以来就有自动发现功能。
【解决方案2】:

这里的问题是:

当 MySQL Workbench 连接时,连接成功,因为用户是 userName@W.X.Y.Z,对 DB 具有完全访问权限。但是,当我使用 java 连接时,它尝试连接的用户是 userName@JavaServerIP,而不是 userName@W.X.Y.Z。因此连接尝试失败,因为 userName@JavaServerIP 无权访问。授予此类用户对 mysql 服务器上数据库的访问权限为我解决了这个问题。这是帮助我解决此问题的命令:

GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 2012-10-20
    • 2017-03-20
    相关资源
    最近更新 更多