web-dev-qa-db-ja.com

SSHトンネルを使用しているときにソケットエラーを介してローカルMySQLサーバーに接続できません

Dplyrを使用してリモートデータベースに接続しようとしています。これは通常、sshトンネルを介してクエリを実行します。

最初に、次のようなsshトンネルを設定しました。

alias tunnel_ncg='ssh -fNg -L 3307:127.0.0.1:3306 mysqluser@myhost mysql5 -h 127.0.0.1:3306 -P 3307 -u mysqluser -p mypassword'

この時点で、localhost: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はローカルコンピューターでソケットファイルを検索しようとしていますが、実際にはリモートサーバーでソケットファイルを検索する必要があります。これを修正する方法、または回避策はありますか?

更新:

DbConnect/RMySQLを介して接続しようとすると、接続は正常に機能します。

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

localhostをIPアドレス(127.0.0.1)問題を解決します。

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

説明については、 MySQLドキュメント を参照してください。

Unixでは、MySQLプログラムはホスト名localhostを特別に扱い、他のネットワークベースのプログラムと比較して予想とは異なる可能性があります。

ローカルホストへの接続の場合、MySQLプログラムはUnixソケットファイルを使用してローカルサーバーへの接続を試みます。 これは、ポート番号を指定するために--portまたは-Pオプションが指定されている場合でも発生します

クライアントがローカルサーバーにTCP/IP接続を確立するようにするには、-Hostまたは-hを使用して、ホスト名の値127.0.0.1、またはローカルサーバーのIPアドレスまたは名前を指定します。

36
zero323