使用 R 连接到远程 SQL Server

Posted

技术标签:

【中文标题】使用 R 连接到远程 SQL Server【英文标题】:Connect to remote SQL Server with R 【发布时间】:2019-07-27 19:13:59 【问题描述】:

我正在尝试将 R 连接到基于 this 的远程 SQL Server。我用

library(DBI)
conn <- dbConnect(
  drv = Rmysql::MySQL(),
  dbname = "td",
  host = "hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com",
  username = "trades",
  password = "u#6MS06")

但连接不工作。Failed to connect to database: Error: Can't connect to MySQL server on 'hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com' (0) 我错过了什么?请注意,我在这里没有给出真实的凭据。然后我想连接一个名为“rep_user_listings”的表。

在为 SQL Server 安装 `ODBC Driver 11 后,我也使用过:

library(DBI)
conn <- dbConnect(
  drv = odbc::odbc(),
  driver = "ODBC Driver 11 for SQL Server",
  database = "td",
  server = "hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com",
  uid = "trade",
  pwd = "u#6MS06X")

我得到:

Error: nanodbc/nanodbc.cpp:950: 08001: [Microsoft][ODBC Driver 11 for SQL Server]Named Pipes Provider: Could not open a connection to SQL Server [53].

library(RODBC)
dbconnection <- odbcDriverConnect("Driver=ODBC Driver 11 for SQL Server;Server=hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com\\SQLEXPRESS; Database=tdsh;Uid=trade; Pwd=u#6MS06Xv; trusted_connection=yes")
initdata <- sqlQuery(dbconnection,paste("select * from rep_user_listings;"))
odbcClose(dbconnection)

我得到:

Warning messages:
1: In odbcDriverConnect("Driver=ODBC Driver 11 for SQL Server;Server=hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com\\SQLEXPRESS; Database=tdsh;Uid=tradeshow; Pwd=u#6MS06Xvdoy; trusted_connection=yes") :
  [RODBC] ERROR: state 08001, code -1, message [Microsoft][ODBC Driver 11 for SQL Server]SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF]. 
2: In odbcDriverConnect("Driver=ODBC Driver 11 for SQL Server;Server=hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com\\SQLEXPRESS; Database=tdsh;Uid=tradeshow; Pwd=u#6MS06Xvdoy; trusted_connection=yes") :
  [RODBC] ERROR: state HYT00, code 0, message [Microsoft][ODBC Driver 11 for SQL Server]Login timeout expired
3: In odbcDriverConnect("Driver=ODBC Driver 11 for SQL Server;Server=hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com\\SQLEXPRESS; Database=tdsh;Uid=tradeshow; Pwd=u#6MS06Xvdoy; trusted_connection=yes") :
  [RODBC] ERROR: state 08001, code -1, message [Microsoft][ODBC Driver 11 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
4: In odbcDriverConnect("Driver=ODBC Driver 11 for SQL Server;Server=hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com\\SQLEXPRESS; Database=tdsh;Uid=tradeshow; Pwd=u#6MS06Xvdoy; trusted_connection=yes") :
  ODBC connection failed

【问题讨论】:

您似乎正在使用 MySQL 驱动程序(基于命名),但尝试连接到 SQL Server RDS 实例。那永远行不通。您需要使用 MS SQL Server 驱动程序。 我应该在代码中更改什么? 另外,请提供比“不起作用”更详细的信息。如此模糊的描述无法帮助您。错误消息将提供线索。首先尝试连接到另一个已知良好的数据库以排除其他因素。 我添加了错误信息 我建议***.com/questions/39401230不是基于 (1) OP 使用 DBI 而不是 RODBC(通常不兼容)和 (2) 大多数该答案中基于DBI 的建议要么被有意存档/弃用,要么多年来没有更新。 (RJDBC 似乎是最新的,所以我想这始终是一个选项,即使它确实需要 rJava ...如果无法访问经过良好调整的 java 安装/配置,这可能会出现问题。) 【参考方案1】:

没有为 R 开发的本机 SQL Server 客户端,我知道的最新版本 (https://github.com/imanuelcostigan/RSQLServer) 已存档/弃用,以代替 odbc 包。

试试这个:

library(DBI)
conn <- dbConnect(
  drv = odbc::odbc(),
  driver = "ODBC Driver 17 for SQL Server",
  database = "td",
  server = "hmsales.cav7mnk7ifa9.us-west-2.rds.amazonaws.com",
  uid = "trades",
  pwd = "u#6MS06")

(如果可行,请立即更改密码。:-)

我之所以选择"ODBC Driver 17 for SQL Server",是因为我之前为我的 windows 和 linux 机器安装了 mssql 驱动程序(当前版本可用 here),并在这里找到了驱动程序“名称”:

unique(odbc::odbcListDrivers()$name)
# [1] "SQL Server"                    "PostgreSQL ANSI(x64)"         
# [3] "PostgreSQL Unicode(x64)"       "SQLite3 ODBC Driver"          
# [5] "ODBC Driver 17 for SQL Server"

如果您安装了旧版本(例如 11 或 13)或其他版本,请改用该驱动程序(或升级)。

【讨论】:

错误:nanodbc/nanodbc.cpp:950: 08001: [Microsoft][ODBC Driver 11 for SQL Server]命名管道提供程序:无法打开与 SQL Server [53] 的连接。 您是否能够通过任何机制而不是 R 进行连接?您确定其余参数正确吗? (例如,端口、服务器)实例是否已启动并且安全组设置是否正确?我没有使用 AWS 的经验,也许 docs.aws.amazon.com/AmazonRDS/latest/UserGuide/… 可能有用。【参考方案2】:

首先,不要在网上泄露您的凭据。根据我正在查看的内容,打开您的终端并 ping 您的服务器,以确保您可以通过网络访问您的服务器。

如果您使用的是 Linux,已知问题之一是不要使用域名,如果您也使用 ipaddess,请建立可信连接 = 否。

【讨论】:

以上是关于使用 R 连接到远程 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

无法在远程系统上使用 Windows 身份验证连接到 ms sql server

使用 SQL Server Management Studio 远程连接到托管在 Azure 虚拟机上的 SQL Server Express 实例

无法远程连接到SQL Server(TCP错误)

使用 AutoIT 连接到远程 SQL Server 时出现问题

远程连接到 MS SQL - 使用 pyodbc 时出错 vs 使用 SQL Server Management Studio 成功

在 Linux Centos 6.6 上使用 R 连接到 SQL Server