2017-09-04 150 views
4

我嘗試使用RPostgreSQL軟件包從R內連接到遠程PostgreSQL數據庫,並且出現與連接的SSL設置有關的錯誤。我已驗證可以使用psql從命令行進行連接,因此我知道該連接是有效的,並可從我的計算機訪問。R RPostgreSQL使用SSL連接到遠程Postgres數據庫

我在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 [email protected]<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 [email protected]<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代碼片斷,僅僅用於踢腿,而我收到了完全相同的錯誤。我沒有想到這一點,但這似乎表明,(a)我不需要本地安裝PostgreSQL來使用RPostgreSQL軟件包,或者(b)我的計算機上有其他地方的PostgreSQL混淆安裝不是內置--with-openssl標誌。我在命令行試過locate postgresql,沒有看到任何明顯的東西,看起來像是單獨安裝。在任何情況下,我仍然無法成功地從R內部連接到遠程PostgreSQL數據庫。

我已經在這裏搜索了Stack Overflow以獲得洞察,並且似乎有一些類似的未解決的問題性質,用戶由於某種原因無法與遠程服務器建立連接。我試圖安裝KirillMüller在此處維護的RPostgres軟件包(https://github.com/rstats-db/RPostgres),但我無法通過R軟件包安裝來識別我的本地PostgreSQL安裝,即使嘗試使用R CMD INSTALL手動指定include和lib路徑作爲結果提示錯誤信息(雖然我可能錯過了某些內容......)。聽起來好像有些用戶的RPostgres的運氣好於RPostgreSQL,但是我再次無法安裝這個軟件包。

如果我不知道如何建立連接,我將不得不採取其他技術。任何幫助將不勝感激。

+0

這裏有一些信息。我爲已安裝的'RPostgreSQL'軟件包運行'otool -L RPostgreSQL.so',輸出指向'/ usr/lib/libpq.5.dylib'('otool'是Mac版Linux的'ldd'來查找庫一個二進制鏈接到)。這是* not *從我安裝的Postgres.app的'libpq'的位置,這裏是:'/ Applications/Postgres.app/Contents/Versions/9.6/lib/libpq.5.dylib'。 我不知道'/ usr/lib'中的版本來自哪裏,但似乎沒有編譯SSL支持;這是RPostgreSQL正在使用的。我怎樣才能強制'RPosgreSQL'使用其他'libpq.5.dylib'? – bmosov01

回答

2

感謝發佈!你實際上幫助我們解決了它。下面是我們如何做到了:

  • 重新啓動你的Mac進入恢復模式重新啓動計算機,並按住命令 + [R,直到屏幕上出現蘋果標誌。
  • 點擊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
  • 現在,您可以連接到數據庫。
+0

感謝您的回覆。是否需要使用'csrutil disable'關閉Mac的系統完整性保護(SIP),以便操作系統可以刪除'/ usr/lib/libpq.5.dylib'?也就是說,一旦我刪除這個文件(或者至少重命名它直到我確定我不需要它),我可以運行'csrutil enable'來重新啓用SIP嗎? – bmosov01