2015-06-30 30 views
8

Tôi đang cố gắng sử dụng dplyr để kết nối với cơ sở dữ liệu từ xa, mà tôi thường truy vấn thông qua đường hầm ssh.Không thể kết nối với máy chủ MySQL cục bộ thông qua lỗi ổ cắm khi sử dụng SSH tunel

đầu tiên tôi thiết lập một đường hầm ssh như sau:

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' 

Tại thời điểm này tôi có thể truy cập vào cơ sở dữ liệu bằng cách kết nối với localhost: 3307. Ví dụ:

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

Nếu tôi cố gắng truy cập vào cơ sở dữ liệu tương tự thông qua dplyr, tôi nhận được một lỗi phàn nàn rằng nó không thể kết nối với ổ cắm MySQL địa phương:

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

sự hiểu biết của tôi là RMySQL/dplyr đang cố gắng tìm một tệp socket trong máy tính cục bộ, tuy nhiên họ thực sự cần tìm nó trong máy chủ từ xa. Có cách nào để sửa lỗi này, hoặc một công việc xung quanh?

UPDATE:

Nếu tôi cố gắng kết nối thông qua dbConnect/RMySQL, kết nối hoạt động tốt:

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

Trả lời

25

Như ngớ ngẩn như âm thanh thay thế localhost với một địa chỉ IP (127.0.0.1) giải quyết vấn đề.

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

Đối với một lời giải thích có một cái nhìn tại MySQL documentation:

Trên Unix, các chương trình MySQL đối xử với tên máy chủ localhost đặc biệt, theo một cách mà có thể khác với những gì bạn mong đợi so với mạng khác chương trình dựa trên.

Để kết nối với máy chủ cục bộ, các chương trình MySQL cố gắng kết nối với máy chủ cục bộ bằng cách sử dụng tệp socket Unix. Điều này xảy ra ngay cả khi tùy chọn --port hoặc -P được chỉ định để chỉ định số cổng.

Để đảm bảo khách hàng thực hiện kết nối TCP/IP với máy chủ cục bộ, hãy sử dụng --host hoặc -h để chỉ định giá trị tên máy chủ 127.0.0.1 hoặc địa chỉ IP hoặc tên của máy chủ cục bộ.

+1

Đối với trường hợp của tôi, mysql bị ràng buộc với IP cục bộ tại 10.x.x.x, vì vậy tôi phải thay thế 127.0.0.1 thành thay thế. Vì vậy, hãy kiểm tra etc/my.cnf trên Linux để đảm bảo bạn đang sử dụng đúng IP. – barryku

+0

Điều này làm việc cho tôi. Kỳ lạ, Django Python sẽ kết nối tốt, nhưng các gói khác nhau của R tất cả đều từ chối! Thật khó chịu. Phiên bản: R 3.4.1. – Deleet

Các vấn đề liên quan