【问题标题】:Can't connect to MySQL server (hosted by strato) over SSH无法通过 SSH 连接到 MySQL 服务器(由 Strato 托管)
【发布时间】:2018-07-21 01:45:15
【问题描述】:

我正在尝试连接到由strato 托管的 MySQL 服务器。

我正在按照this page 上的说明使用 PuTTy 连接到数据库。 现在如果我使用终端连接到我的数据库没有问题:

但是一旦我尝试使用 NaviCatMySQL Workbench 连接到 MySQL 服务器,它就会给我这个错误:

我做错了什么?如何最好使用 NaviCat 连接到数据库? 而且我也想通过Java连接到这个数据库,但是我应该用什么线来连接,我应该在主机上填写什么?只是本地主机?所以我应该只使用这样的函数来连接:

public static void connectToSQL() {
    try {
        @SuppressWarnings("unused")
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/DB3262523", "U3262523", "....");
        System.out.println("Connection success");
    } catch (Exception e) {
        //TODO: handle exception
        System.err.println(e);

}
}

【问题讨论】:

  • 您的问题不是 Java 问题,因为您在非 Java 应用程序中也有同样的问题,我已经删除了标签。我还强烈建议您将控制台输出和错误消息发布为 文本 而不是屏幕截图。
  • 旁注:您的navicat 屏幕截图显示的屏幕截图与MySQL Workbench 屏幕截图不同。你确定你使用的是正确的端口。
  • @MarkRotteveel 我现在尝试不使用 PuTTy,而是使用 NaviCat 的 SSH 功能,但我仍然遇到同样的错误@ 但由于某种原因,我无法使用 PuTTy 以外的任何其他工具连接到数据库...除了 3306 之外的端口应该是什么,主机名、localhost 或 rdbms 应该是什么? (我的 navicat 设置如何配置的两个屏幕截图:puu.sh/zkHI4/a133bad8d3.pngpuu.sh/zkHIb/a13cfd340a.png
  • @MarkRotteveel 我从 PuTTy 获得了主机名、端口和用户名,并将其填充到 NaviCat 中,但它仍然给我同样的错误:2013 - Lost connection to MySQL at 'reading intial communication packet', system error: 0 我从 PuTTy 获得的信息的屏幕截图:puu.sh/zkJ5J/2b8f844115.png 和我的 NaviCat 配置中的两个屏幕截图:puu.sh/zkJc6/c848d3ebd2.pngpuu.sh/zkJdv/6feb584e3a.png
  • 你有没有试过解决rdbms指向的问题? nslookup rdbms。然后使用任何东西作为主机?

标签: mysql ssh putty navicat


【解决方案1】:

由于您可以使用终端连接到数据库,因此您实际上可以检查数据库本身,从服务器的角度了解连接失败的原因。

试试这个查询:

SELECT * FROM performance_schema.host_cache

每个连接错误都在不同的列中说明, 因此这有助于查明连接被拒绝的根本原因。

参考手册:

https://dev.mysql.com/doc/refman/5.6/en/host-cache-table.html

【讨论】:

  • 好主意,但遗憾的是托管公司 Strato 拒绝我访问此数据表:/
【解决方案2】:

最后,我明白了,你想只使用 SSH 隧道连接 mysql 数据库服务,你不想打开防火墙并且只想通过 JumpBox 访问数据库。 我使用 JSch 库进行 SSH 调优。

这里是你的代码。

import java.sql.DriverManager;
import java.sql.SQLException;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.sql.Connection;


public class MySqlConnOverSSH {


    public static void main(String[] args) throws SQLException {

        int local_proxy_port=4567;

        String database_host="rdbms.strato.de";
        String ssh_host="ssh.strato.de";
        int database_port=3306;
        String user="ssh_username";
        String privateKey = "In case you want to use private key to do SSH";

        String password="sshpassword";
        String dbuserName = "yourDBName";
        String dbpassword = "YourDBPass";
        String url = "jdbc:mysql://localhost:"+local_proxy_port+"/your-database-name";
        String driverName="com.mysql.jdbc.Driver";
        Connection conn = null;
        Session session= null;
        try{
            java.util.Properties config = new java.util.Properties(); 
            config.put("StrictHostKeyChecking", "no");
            JSch jsch = new JSch();
            //Only in case you need to access SSH using key.
            //jsch.addIdentity(privateKey);
            session=jsch.getSession(user, ssh_host, 22);
            session.setPassword(password);
            session.setConfig(config);
            session.connect();
            System.out.println("Connected");
            int assinged_port=session.setPortForwardingL(local_proxy_port, database_host, database_port);
            System.out.println("localhost:"+assinged_port+" -> "+database_host+":"+database_port);
            System.out.println("Port Forwarded");

            Class.forName(driverName).newInstance();
            conn = DriverManager.getConnection (url, dbuserName, dbpassword);
            System.out.println ("Connected!!!");
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(conn != null && !conn.isClosed()){
                System.out.println("Hurry Done!!");
                conn.close();
            }
            if(session !=null && session.isConnected()){
                System.out.println("Hurry Done!! Closing SSH");
                session.disconnect();
            }
        }
    }

}

确保将mysql-connector-java-xxx-bin.jar; 包含在您的classpath 中。其中 xxx 是 mysql jdbc jar 的版本,例如5.0.8

如果它不起作用,请在运行此代码后发布您看到的进一步错误。我可以重新尝试回答。

【讨论】:

  • 我确实尝试了 java 解决方案,但是那个失败了,因为它没有通过 ssl 连接。我没有尝试建立 java ssl 连接,但正如 Mark Rotteveel 已经评论的那样,这个问题似乎与 java 无关,因为其他应用程序也不起作用。
  • 我不太确定如果没有 ssl 登录应该如何工作。请看一下问题中显示控制台的图片。它演示了如何通过 ssl 进行连接。它通过控制台工作,但是当通过 mysql 工作台使用相同的 ssl 配置时,它不起作用。顺便说一句,java异常是java.sql.SQLException:没有为jdbc找到合适的驱动程序:mysql://rdbms.strato.de:3306/DB3462419?verifyServerCertificate=true&useSSL=true&requireSSL=true
  • 干得好,您即将解决您的问题,请将mysql jdbc jar 包含到您的classpath 中,并在您的代码中添加Class.forName("com.mysql.jdbc.Driver"); ,因为我已经修改了我的答案。跨度>
  • 对,对不起,我忘记上次尝试使用了不同的项目。有时候是这样的。 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 你知道我必须在哪里输入我的 ssl 登录吗?我的意思是没有它就不能工作吗?
  • 需要ssl登录。请看一下控制台图像。它不起作用。两个 cmets 我已经发布了这个异常。 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
猜你喜欢
  • 2018-07-20
  • 2013-04-09
  • 2019-05-23
  • 2018-08-21
  • 2017-07-17
  • 1970-01-01
  • 2019-10-19
  • 2020-11-02
  • 2018-08-14
相关资源
最近更新 更多