使用 SSH 隧道时无法通过套接字错误连接到本地 MySQL 服务器

Posted

技术标签:

【中文标题】使用 SSH 隧道时无法通过套接字错误连接到本地 MySQL 服务器【英文标题】:Can't connect to local MySQL server through socket error when using SSH tunel 【发布时间】:2015-09-17 03:46:23 【问题描述】:

我正在尝试使用 dplyr 连接到远程数据库,我通常通过 ssh 隧道进行查询。

我首先设置了一个 ssh 隧道,如下所示:

alias tunnel_ncg='ssh -fNg -L 3307:127.0.0.1:3306 mysqluser@myhost mysql5 -h 127.0.0.1:3306 -P 3307 -u mysqluser -p mypassword'

此时我可以通过连接到 localhost:3307 来访问数据库。例如:

mysql -h '127.0.0.1' -P 3307 -u mysqluser

如果我尝试通过 dplyr 访问同一个数据库,我会收到一条错误消息,抱怨它无法连接到本地 MySQL 套接字:

> conDplyr = src_mysql(dbname = "mydb", user = "mysqluser", password = "mypassword", host = "localhost", port=3307)
Error in .local(drv, ...) : 
  Failed to connect to database: Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

我的理解是 RMySQL/dplyr 正在尝试在本地计算机中查找套接字文件,但是他们确实应该在远程服务器中查找它。有没有办法解决这个问题或解决方法?

更新:

如果我尝试通过 dbConnect/RMySQL 进行连接,则连接工作正常:

> dbConnect(dbDriver("MySQL"), user="mysqluser", password="mypassword", dbname="mydb", host="127.0.0.1", port=3307)
<MySQLConnection:0,1>

【问题讨论】:

【参考方案1】:

尽管用 IP 地址 (127.0.0.1) 替换 localhost 听起来很愚蠢,但可以解决问题。

src_mysql(
    dbname = "mydb", user = "mysqluser", password = "mypassword",
    host = "127.0.0.1", port=3307)

请看MySQL documentation:

在 Unix 上,MySQL 程序对主机名 localhost 进行特殊处理,与其他基于网络的程序相比,这种方式可能与您所期望的不同。

对于到 localhost 的连接,MySQL 程序尝试使用 Unix 套接字文件连接到本地服务器。 即使给出 --port 或 -P 选项来指定端口号也会发生这种情况

为确保客户端与本地服务器建立 TCP/IP 连接,请使用 --host 或 -h 指定主机名值 127.0.0.1,或本地服务器的 IP 地址或名称。

【讨论】:

就我而言,mysql 绑定到本地 IP 为 10.x.x.x,因此我必须将 127.0.0.1 替换为该 IP。因此,请检查 Linux 上的 etc/my.cnf 以确保您使用的是正确的 IP。 这对我有用。奇怪的是,Django Python 可以正常连接,但是 R 的各种包都拒绝了!多么烦人。版本:R 3.4.1。

以上是关于使用 SSH 隧道时无法通过套接字错误连接到本地 MySQL 服务器的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 JDBC 连接通过 SSH 隧道连接到 Azure DB

如何在 ruby​​ 中使用 ssh 隧道连接 postgres 数据库

在 Java 中通过 SSH 隧道连接到 Mongo 数据库

eclipse RSE 可以连接到本地端口(ssh 隧道)吗?

无法使用 SSH 隧道将 MongoDB Compass 连接到 AWS DocumentDB

使用 Python 通过 SSH 隧道连接到远程 PostgreSQL 数据库