2015-06-30 40 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

相關問題