2015-06-30 20 views
8

Próbuję użyć dplyr do połączenia ze zdalną bazą danych, którą zwykle odpytuję przez tunel SSH.Nie można połączyć się z lokalnym serwerem MySQL przez błąd gniazda podczas korzystania z tunera SSH

ja najpierw skonfigurować tunel ssh tak:

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' 

W tym momencie mogę uzyskać dostęp do bazy danych po podłączeniu do localhost: 3307. Na przykład:

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

Gdy próbuję uzyskać dostęp do tej samej bazy danych poprzez dplyr, otrzymuję błąd twierdząc, że nie może połączyć się z lokalnym gniazdem 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) 

mi się, że RMySQL/dplyr próbują znaleźć plik gniazda w komputerze lokalnym, jednak naprawdę powinni go szukać na serwerze zdalnym. Czy istnieje sposób, aby to naprawić lub obejść?

UPDATE:

Gdy próbuję się połączyć poprzez dbConnect/RMySQL, połączenie działa prawidłowo:

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

Odpowiedz

25

Jak głupie, jak się wydaje, zastępując localhost z adresem IP (127.0.0.1) rozwiązuje ten problem.

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

Dla wyjaśnienia spojrzeć na MySQL documentation:

W systemie UNIX programy MySQL traktować nazwę hosta localhost specjalnie, w sposób, który jest prawdopodobnie różni się od tego, co można się spodziewać w porównaniu do innych sieci na podstawie programów.

W przypadku połączeń z localhost, programy MySQL próbują połączyć się z serwerem lokalnym za pomocą pliku gniazda systemu Unix. Ten problem występuje nawet wtedy, gdy podano opcję --port lub -P, aby określić numer portu.

Aby upewnić się, że klient nawiązuje połączenie TCP/IP z serwerem lokalnym, użyj parametru -host lub -h, aby określić wartość nazwy hosta 127.0.0.1 lub adres IP lub nazwę lokalnego serwera.

+1

Dla mojej sprawy, mysql był związany z lokalnym adresem IP na 10.x.x.x, więc zamiast tego muszę zastąpić 127.0.0.1. Dlatego sprawdź etc/my.cnf w systemie Linux, aby upewnić się, że używasz właściwego adresu IP. – barryku

+0

To zadziałało dla mnie. O dziwo, Django Python łączyłoby się dobrze, ale różne paczki R odmawiały! Jak denerwujące. Wersja: R 3.4.1. – Deleet

Powiązane problemy