2015-06-30 8 views
8

Ich versuche, dplyr verwenden, um eine Verbindung zu einer entfernten Datenbank, die ich in der Regel durch einen SSH-Tunnel abfragen.Kann nicht Verbindung zu lokalen MySQL-Server durch Socket-Fehler bei der Verwendung von SSH tunel

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' 

An dieser Stelle ich die Datenbank durch den Anschluss an localhost zugreifen können:

ich zum ersten Mal einen SSH-Tunnel wie folgt aufgebaut 3307. Zum Beispiel:

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

Wenn ich die gleiche Datenbank durch dplyr zuzugreifen versuchen, erhalte ich einen Fehler beschweren, dass es nicht auf dem lokalen MySQL-Socket-Verbindung herstellen kann:

> 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) 

Mein Verständnis ist, dass RMySQL/dplyr versucht, auf dem lokalen Computer nach einer Socket-Datei zu suchen, sollte diese jedoch auf dem Remote-Server suchen. Gibt es eine Möglichkeit, dies zu beheben, oder ein Workaround?

UPDATE:

Wenn ich versuche, durch dbConnect/RMySQL zu verbinden, funktioniert die Verbindung fein:

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

Antwort

25

So albern es klingt localhost mit einer IP-Adresse (127.0.0.1) löst das Problem zu ersetzen.

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

Für eine Erklärung zu sehen, die MySQL documentation:

Auf Unix-MySQL-Programme behandeln den Hostnamen localhost speziell, in einer Weise, die von wahrscheinlich anders ist, was erwarten Sie im Vergleich zu anderen Netzwerk -basierte Programme.

Für Verbindungen zu localhost versuchen MySQL-Programme, eine Verbindung zum lokalen Server herzustellen, indem sie eine Unix-Socket-Datei verwenden. Dies tritt auch auf, wenn eine Option --port oder -P angegeben wird, um eine Portnummer anzugeben.

Um sicherzustellen, dass der Client eine TCP/IP-Verbindung zum lokalen Server herstellt, verwenden Sie --host oder -h, um einen Hostnamen 127.0.0.1 oder die IP-Adresse oder den Namen des lokalen Servers anzugeben.

+1

Für meinen Fall war mysql an lokale IP bei 10.x.x.x gebunden, also muss ich stattdessen 127.0.0.1 ersetzen. Überprüfen Sie daher unter Linux auf etc/my.cnf, um sicherzustellen, dass Sie die richtige IP verwenden. – barryku

+0

Das hat bei mir funktioniert. Seltsamerweise würde sich Django Python gut verbinden, aber Rs verschiedene Pakete weigerten sich alle! Wie nervig. Version: R 3.4.1. – Deleet