如何在 RDS for SQL Server 中创建源为 RDS 的链接服务器?

上次更新日期:2022 年 10 月 3 日

我想创建一个从 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 实例到 SQL Server 的链接服务器。我该如何操作?

简短描述

Amazon RDS 是一项托管服务,因此用户没有系统管理员访问权限。直接从 GUI 创建链接服务器会导致错误。要创建链接服务器,请使用 T-SQL。唯一支持的目标是 SQL Server。

先决条件

您必须在 RDS for SQL Server 和目标 SQL Server 之间建立连接。

注意:即使在更换主机后,链接服务器的密码和配置仍保持不变。

解决方法

RDS for SQL Server 实例到 RDS for SQL Server 实例

在创建以 RDS for SQL Server 为源、以 RDS for SQL Server 为目标的链接服务器时,最好使用 DNS 名称。使用 DNS 名称可防止由于主机更换或服务器更改而导致 IP 地址更改。

在 Amazon RDS 中,IP 地址是动态的,端点是静态的。因此,最佳实践是使用端点连接到您的实例。每个 Amazon RDS 实例都有一个端点。

Parameters:

  • @server:您的链接服务器名称。
  • @datasrc:您的 RDS 端点名称。对于 Amazon Elastic Compute Cloud (Amazon EC2) 本地实例,您的 EC2 本地 IP 地址或 DNS 名称。
  • @rmtuser:有权访问目标数据库的登录名。
  • @rmtpassword:登录名的密码。

步骤 1:连接到 RDS for SQL Server 实例

使用主登录名连接到实例,然后运行以下命令。确保您使用的是端点而非 IP 地址。在主机更换期间,RDS 实例的 IP 地址可能会发生变化。

EXEC master .dbo.sp_addlinkedserver @server = N'LinkedServerRDSSQL', @srvproduct= N'', @provider= N'SQLNCLI', @datasrc= N'SQL-2019.ckeixtynaaaj.us-east-1.rds.amazonaws.com'
go
EXEC master .dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedServerRDSSQL' ,@useself=N'False' ,@locallogin=NULL,@rmtuser =N'linkedserverloginname',@rmtpassword='YourStrongPassword'
go

步骤 2:测试链接服务器

1.    在 Microsoft SQL Server Management Studio (SSMS) 中,连接到 RDS 实例

2.    在 View(视图)菜单上,选择 Object Explorer(对象资源管理器)。

3.    选择 Server Objects(服务器对象)、Linked Servers(链接服务器)。

4.    右键单击您的服务器名称,然后选择 “测试连接”。

步骤 3:查询链接服务器

运行以下查询:

select * from [LinkedServerName].[Databasename].[schemaname].[tablename]

RDS for SQL Server 实例到 EC2 SQL Server 实例或本地 SQL Server

步骤 1:创建链接服务器

使用 RDS for SQL Server 创建链接服务器,作为 EC2 实例上的 SQL Server 或本地 SQL Server 的源。

运行以下命令,以使用远程服务器的 IP 地址创建链接服务器:

EXEC master .dbo.sp_addlinkedserver @server = N'LinkedServerRDSSQL', @srvproduct= N'', @provider= N'SQLNCLI', @datasrc= N'10.0.0.152'
Go
EXEC master .dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedServerRDSSQL' ,@useself=N'False' ,@locallogin=NULL,@rmtuser =N'linkedserverloginname',@rmtpassword='YourStrongPassword'
Go

运行以下命令,以使用远程服务器的 DNS 名称创建链接服务器:

EXEC master .dbo.sp_addlinkedserver @server = N'LinkedServerRDSSQL', @srvproduct= N'', @provider= N'SQLNCLI', @datasrc= N'ServerName.datacenter.mycompany.com'
Go
EXEC master .dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedServerRDSSQL' ,@useself=N'False' ,@locallogin=NULL,@rmtuser =N'linkedserverloginname',@rmtpassword='YourStrongPassword'
go

步骤 2:测试链接服务器

1.    在 Microsoft SQL Server Management Studio (SSMS) 中,连接到 RDS 实例

2.    在 View(视图)菜单上,选择 Object Explorer(对象资源管理器)。

3.    选择 Server Objects(服务器对象)、Linked Servers(链接服务器)。

4.    右键单击您的服务器名称,然后选择 “测试连接”。

步骤 3:查询链接服务器

运行以下查询:

select * from [LinkedServerName].[Databasename].[schemaname].[tablename]

使用 Microsoft Windows Authentication 配置链接服务器

注意:不支持使用 Windows Authentication 将链接服务器从 RDS for SQL Server 配置到 EC2 实例或本地 SQL Server。

先决条件

  • 您必须创建域并将其加入 AWS Managed Microsoft AD。
  • 源 EC2 SQL Server 实例和目标 RDS SQL Server 必须具有连接性。

步骤 1:使用 Windows Authentication 将链接服务器从 EC2 或本地 SQL Server 配置到 RDS for SQL Server

1.    使用您的域登录登录并运行以下查询以创建链接服务器。

USE [master]
GO
EXEC sp_addlinkedserver    @server=N'LinkedServerToRDSInstance',@srvproduct=N'',@provider=N'SQLNCLI',@datasrc=N'EndpointName';
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkedServerToRDSInstance', @locallogin = NULL , @useself = N'True'
GO

步骤 2:测试链接服务器

1.    在 Microsoft SQL Server Management Studio (SSMS) 中,连接到 RDS 实例

2.    在 View(视图)菜单上,选择 Object Explorer(对象资源管理器)。

3.    选择 Server Objects(服务器对象)、Linked Servers(链接服务器)。

4.    右键单击您的服务器名称,然后选择 Test the connection(测试连接)。

步骤 3:查询链接服务器

运行以下查询:

select * from [LinkedServerName].[Databasename].[schemaname].[tablename]

故障排除

从客户端连接时,您可能会收到以下错误消息:

Msg 18456, Level 14, State 1, Line 21
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

此错误是由“双跳”引起的。当一台计算机连接到另一台计算机以连接到第三台计算机时,就会发生双跳。在以下情况下可能会发生双跳:

  • AWS Managed AD 没有服务主体名称配置(SPN)来处理客户端与 EC2 实例之间的身份验证。
  • 使用不是来自您的域的端点(例如 RDS 实例端点)配置链接服务器。EC2 和 RDS 的身份验证方法都必须是 KERBEROS。

要解决此问题,请执行以下操作:

步骤 1。检查身份验证方法以确认在连接到 RDS 和 EC2 时选择了 KERBEROS

使用来自客户端的域登录运行以下查询:

select @@servername as ServerName, session_id,net_transport, auth_scheme from sys.dm_exec_connections where session_id= @@spid;

步骤 2:更正属于您的域的 SQL Server 服务帐户的 SPN

1.    在 Active Directory Users and Computers 中,选择 YourDomain.comYourDomainUsers

2.    右键单击 YourServiceAccount 以查看属性。

3.    在 Delegation(委托)选项卡中,选择 Trust this user for delegation to any service (Kerberos only)(信任此用户以委托给任何服务(仅限 Kerberos)),然后选择 OK(确定)。

4.    在 EC2 实例或本地 SQL Server 上重新启动 SQL 服务器服务。

5.     为服务帐户添加 SPN,如以下示例命令所示。将 YourDomainName\ServiceAccountNameEc2name 域替换为您的域的正确值。

setspn -A MSSQLSvc/Ec2name.domain.com YourDomainName\ServiceAccountName
setspn -A MSSQLSvc/Ec2name.domain.com:1433 YourDomainName\ServiceAccountName

6.    运行以下命令以验证新创建的 SPN:

setspn -l YourDomainName\ServiceAccountName

步骤 3:使用 RDS Yourdomain.com 端点重新创建链接服务器。

1.    在 RDS for SQL Server 中运行以下查询以检索服务器名称:

select @@servername as ServerName, session_id,net_transport, auth_scheme from sys.dm_exec_connections where session_id= @@spid;

2.    在上述命令的输出中,检查服务器名称列以验证 SPN,如以下示例所示。

setspn -l YourServerName

上述命令输出还显示了您的 RDS 实例已注册的 ServicePrincipalNames,如以下示例所示:

MSSQLSvc/ YourServerName.yourdomainname.com:1433

3.    运行以下命令以使用域登录重新创建链接服务器。数据来源与您在步骤 2 中从命令输出中检索的数据来源相同。

USE [master]
GO
EXEC sp_addlinkedserver    @server=N'LinkedServerToRDSInstance',@srvproduct=N'',@provider=N'SQLNCLI',@datasrc=N'YourServerName.YourDomainnanme,com';
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkedServerToRDSInstance', @locallogin = NULL , @useself = N'True'
GO

4.    测试来自客户端的连接。

注意:目前支持将链接服务器作为 SQL Server 的目标。这是因为 Amazon RDS 是一项托管服务。您没有操作系统访问权限,无法安装其他 ODBC 或连接不同数据库服务器(例如 Oracle、MYSQL、PostGreSQL)所需的任何驱动程序。

对于异构链接服务器,您可以使用 RDS Custom for SQL Server


这篇文章对您有帮助吗?


您是否需要账单或技术支持?