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>
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アドレスまたは名前を指定します。