如何在 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.com、YourDomain 和 Users。
2. 右键单击 YourServiceAccount 以查看属性。
3. 在 Delegation(委托)选项卡中,选择 Trust this user for delegation to any service (Kerberos only)(信任此用户以委托给任何服务(仅限 Kerberos)),然后选择 OK(确定)。
4. 在 EC2 实例或本地 SQL Server 上重新启动 SQL 服务器服务。
5. 为服务帐户添加 SPN,如以下示例命令所示。将 YourDomainName\ServiceAccountName 和 Ec2name 域替换为您的域的正确值。
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。