R RPostgreSQL 使用 SSL 连接到远程 Postgres 数据库
Posted
技术标签:
【中文标题】R RPostgreSQL 使用 SSL 连接到远程 Postgres 数据库【英文标题】:R RPostgreSQL Connect to Remote Postgres Database with SSL 【发布时间】:2017-09-04 05:38:39 【问题描述】:我正在尝试使用 RPostgreSQL
包从 R 中连接到远程 PostgreSQL 数据库,但我收到的错误似乎与连接的 SSL 设置有关。我已经验证我可以使用psql
从命令行进行连接,所以我知道连接是有效的并且可以从我的计算机访问。
我在 R 中的第一次连接尝试如下(其中 <MyHost>
和 <MyPass>
为我的连接正确填写):
library(RPostgreSQL)
pg <- dbDriver( 'PostgreSQL' )
con = dbConnect( pg, host=<MyHost>, dbname='warehouse',
user='warehouse', password=<MyPass>, port=5432 )
我在 R 中收到的错误是:
RS-DBI driver: (could not connect warehouse@<MyHost>.com:5432 on
dbname "warehouse": FATAL: no pg_hba.conf entry for host "75.166.243.177",
user "warehouse", database "warehouse", SSL off
我理解这意味着我需要对我的连接应用 SSL 加密,因此我尝试了以下方法,这似乎适用于此处的 OP:Connect to Postgres via SSL using R
library(RPostgreSQL)
pg <- dbDriver( 'PostgreSQL' )
con = dbConnect( pg, host=<MyHost>, dbname='dbname=warehouse sslmode=require',
user='warehouse', password=<MyPass>, port=5432 )
我收到的错误是:
RS-DBI driver: (could not connect warehouse@<MyHost>:5432 on dbname
"warehouse": sslmode value "require" invalid when SSL support is not
compiled in
我发现这篇文章 (Postgres SSLMode Value "require" Invalid When SSL Support Is Not Compiled Using Foreign Data Wrapper) 表明我的 PostgreSQL 构建在编译时可能没有包含 --with-openssl
标志,但运行 pg_config 显示该标志确实在我的构建中设置。这是有道理的,因为当我使用 psql 命令行工具时,我能够使用 SSL 连接到数据库。
担心我的 PostgreSQL 安装可能有问题,我完全删除了它。然后我运行了上述两个 R 代码的 sn-ps,只是为了好玩,我收到了完全相同的错误。我没想到会这样,但这似乎表明(a)我不需要本地安装 PostgreSQL 才能使用 RPostgreSQL
包,或者(b)我在计算机上的其他地方安装了令人困惑的 PostgreSQL这不是包含--with-openssl
标志的。我在命令行中尝试过locate postgresql
,但没有看到任何看起来像是单独安装的明显内容。无论如何,我仍然无法从 R 中成功连接到远程 PostgreSQL 数据库。
我在这里搜索了 Stack Overflow 以获得洞察力,似乎存在许多类似性质的未解决问题,即用户由于某种原因无法与远程服务器建立连接。我尝试安装 Kirill Müller 在这里维护的 RPostgres 包 (https://github.com/rstats-db/RPostgres),但我无法让 R 包安装来识别我的本地 PostgreSQL 安装,即使在尝试使用 R CMD INSTALL
手动指定包含和 lib 路径之后也是如此,正如由此产生的错误消息所建议的那样(虽然我可能在这里遗漏了一些东西......)。听起来有些用户使用RPostgres
比使用RPostgreSQL
更幸运,但同样,我无法安装此软件包。
我不知道还能做什么,如果我不知道如何尽快建立连接,我将不得不求助于其他技术。任何帮助将不胜感激。
【问题讨论】:
这里有更多信息。我为已安装的RPostgreSQL
包运行otool -L RPostgreSQL.so
,输出指向/usr/lib/libpq.5.dylib
(otool
是Linux 的ldd
的Mac 版本,用于查找二进制文件链接到的库)。这不是在我安装的 Postgres.app 中libpq
的位置,这里是:/Applications/Postgres.app/Contents/Versions/9.6/lib/libpq.5.dylib
。我不知道/usr/lib
中的版本来自哪里,但它似乎没有使用 SSL 支持编译;这就是 RPostgreSQL 正在使用的。如何强制RPosgreSQL
使用另一个libpq.5.dylib
?
这似乎是一个较老的问题,但仍然相关。我正在尝试运行相同的连接命令:library(RPostgreSQL) pg <- dbDriver( 'PostgreSQL' ) con = dbConnect( pg, host=<MyHost>, dbname='dbname=<dbname> sslmode=require', user='<user>', password=<pass>, port=<port> )
并得到相同的“未编译 SSL 支持”错误。我没有/Applications/Postgres.app
目录并且 otool 没有找到 RPostgreSQL.so
RPostgreSQL 代码显示了一个参数 USE_SSL,如果未定义 (github.com/cran/RPostgreSQL/blob/…) 将导致错误消息 (github.com/cran/RPostgreSQL/blob/…)。 USE_SSL 是如何定义/确定的?
【参考方案1】:
感谢发帖!你实际上帮助我们解决了它。以下是我们的做法:
通过重新启动计算机并按住 Command+R 直到 Apple 徽标出现在屏幕上,将 Mac 重新启动到恢复模式。 点击Utilities
> Terminal
。
在终端窗口中,输入csrutil disable
并按 Enter。
重新启动您的 Mac。
打开一个终端。
运行sudo rm /usr/lib/libpq.5.dylib
运行sudo ln -s /Applications/Postgres.app/Contents/Versions/9.6/lib/libpq.5.dylib
现在您可以连接到数据库了。
【讨论】:
感谢您的回复。是否需要使用csrutil disable
关闭 Mac 的系统完整性保护 (SIP),以便操作系统允许您删除 /usr/lib/libpq.5.dylib
?也就是说,一旦我删除了这个文件(或者至少重命名它直到我确定我不需要它),我可以运行csrutil enable
重新启用 SIP 吗?以上是关于R RPostgreSQL 使用 SSL 连接到远程 Postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 libssl 和 libpg 和 SSL 激活编译 RpostgreSQL
如何使用 dplyr 和 RPostgreSQL 将 r 连接到 redshift?
R 在使用 dplyr 或 RPostgreSQL 的模式下访问 redshift 表