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

dal*_*ogm 12 r ssh-tunnel rmysql dplyr

我试图使用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'
Run Code Online (Sandbox Code Playgroud)

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

mysql -h '127.0.0.1' -P 3307 -u mysqluser
Run Code Online (Sandbox Code Playgroud)

如果我尝试通过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)
Run Code Online (Sandbox Code Playgroud)

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

更新:

如果我尝试通过dbConnect/RMySQL连接,连接正常:

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

zer*_*323 36

听起来很傻,因为它听起来用localhostIP地址替换(127.0.0.1)解决了这个问题.

src_mysql(
    dbname = "mydb", user = "mysqluser", password = "mypassword",
    host = "127.0.0.1", port=3307)
Run Code Online (Sandbox Code Playgroud)

有关解释,请查看MySQL文档:

在Unix上,MySQL程序特别对待主机名localhost,其方式可能与您期望的与其他基于网络的程序相比有所不同.

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

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

  • 就我而言,mysql 绑定到 10.xxx 的本地 IP,因此我必须将 127.0.0.1 替换为该 IP。因此,请检查 Linux 上的 etc/my.cnf 以确保您使用的是正确的 IP。 (2认同)