2015-06-30 30 views
8

Sto tentando di utilizzare dplyr per connettersi a un database remoto, che di solito interrogare tramite un tunnel ssh.Impossibile connettersi al server MySQL locale tramite errore socket quando si utilizza il tunel SSH

ho messo un tunnel ssh come la seguente:

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' 

A questo punto posso accedere al database collegandosi a localhost: 3307. Per esempio:

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

Se provo ad accedere allo stesso database tramite dplyr, ottengo un errore dice che non è in grado di connettersi alla presa locale 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) 

mia comprensione è che RMySQL/dplyr sta cercando di cercare un file socket nel computer locale, tuttavia dovrebbero cercarlo sul server remoto. C'è un modo per risolvere questo problema o una soluzione?

UPDATE:

Se provo a connettersi tramite collegamento database/RMySQL, la connessione funziona bene:

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

risposta

25

Per quanto stupido come sembra sostituzione localhost con un indirizzo IP (127.0.0.1) risolve il problema.

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

Per una spiegazione dare un'occhiata al MySQL documentation:

In Unix, i programmi MySQL trattano il nome host localhost appositamente, in un modo che è probabile diverso da quello che ci si aspetta rispetto ad altre reti programmi basati su

Per le connessioni a localhost, i programmi MySQL tentano di connettersi al server locale utilizzando un file socket Unix. Ciò si verifica anche se viene fornita un'opzione --port o -P per specificare un numero di porta.

Per garantire che il client effettui una connessione TCP/IP al server locale, utilizzare --host o -h per specificare un valore del nome host di 127.0.0.1 o l'indirizzo IP o il nome del server locale.

+1

Per il mio caso, mysql era associato all'IP locale a 10.x.x.x, quindi devo sostituire 127.0.0.1 con quello. Pertanto, controlla etc/my.cnf su Linux per assicurarti di utilizzare l'IP corretto. – barryku

+0

Questo ha funzionato per me. Stranamente, Django Python si collegherebbe perfettamente, ma i vari pacchetti di R si sono tutti rifiutati! Che noioso. Versione: R 3.4.1. – Deleet