2015-06-30 37 views
8

我试图使用dplyr连接到远程数据库,我通常通过ssh隧道进行查询。使用SSH tunel时无法通过套接字错误连接到本地MySQL服务器

我首先建立一个SSH隧道类似如下:

alias tunnel_ncg='ssh -fNg -L 3307:127.0.0.1:3306 [email protected] mysql5 -h 127.0.0.1:3306 -P 3307 -u mysqluser -p mypassword' 

在这一点上我可以通过连接到本地主机访问数据库: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正试图在本地计算机上查找套接字文件,但是他们应该真的在远程服务器上查找套接字文件。有没有办法解决这个问题或解决方法?

UPDATE:

如果我试图通过数据库连接/ RMySQL连接,该连接工作正常:

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

回答

25

一样傻,因为它听起来与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特别,在某种程度上是对你的期望是什么相对于其他网络可能不同基于程序。

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

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

+1

对我而言,mysql绑定到本地IP 10.x.x.x,所以我必须替换127.0.0.1。因此,请在Linux上检查etc/my.cnf以确保您使用正确的IP。 – barryku

+0

这对我有用。奇怪的是,Django Python会连接好,但R的各种软件包都被拒绝!多烦人。版本:R 3.4.1。 – Deleet

相关问题