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

3 分钟阅读
0

我想创建一个从 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 链接到 SQL Server 的链接服务器。

简短描述

Amazon RDS 是一项托管服务,因此用户并不具备 sysadmin 访问权限。直接从 GUI 创建链接服务器会导致错误。要创建链接服务器,请使用 T-SQL。

作为先决条件,您必须在 RDS for SQL Server 和目标 SQL 服务器之间建立连接。

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

解决方法

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

当您创建以 RDS for SQL Server 作为源并以 RDS for SQL Server 作为目标的链接服务器时,请使用 DNS 名称。这样可以防止由于更换主机或更改服务器而导致的 IP 地址变化。

在 Amazon RDS 中,IP 地址是动态的,端点是静态的。因此,最佳做法是使用端点连接到您的实例。每个 Amazon RDS 实例都有一个端点。参见以下参数:

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

连接到 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

测试链接服务器

  1. 在 Microsoft SQL Server Management Studio(SSMS)中,连接到 RDS 实例
  2. 查看菜单上,选择对象资源管理器
  3. 依次选择服务器对象链接服务器
  4. 右键单击您的服务器名称,然后选择测试连接

查询链接服务器

运行以下查询:

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

RDS for SQL Server 实例到 EC2 SQL Server 实例或本地 SQL 服务器

创建链接服务器

以 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

测试链接服务器

  1. 在 Microsoft SQL Server Management Studio(SSMS)中,连接到 RDS 实例
  2. 查看菜单上,选择对象资源管理器
  3. 依次选择服务器对象链接服务器
  4. 右键单击您的服务器名称,然后选择测试连接

查询链接服务器

运行以下查询:

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 必须保持连接。

使用 Windows Authentication 配置从 EC2 或本地 SQL Server 到 RDS for SQL Server 的链接服务器

  • 使用您的域登录信息登录,然后运行以下查询以创建链接服务器。
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

测试链接服务器

  1. 在 Microsoft SQL Server Management Studio(SSMS)中,连接到 RDS 实例
  2. 查看菜单上,选择对象资源管理器
  3. 依次选择服务器对象链接服务器
  4. 右键单击您的服务器名称,然后选择测试连接

查询链接服务器

运行以下查询:

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 没有用于处理客户端和 EC2 实例之间身份验证的服务主体名称配置(SPN)。
  • 链接服务器配置的端点(例如 RDS 实例端点)并非来自于您的域。EC2 和 RDS 的身份验证方法都必须是 KERBEROS。

要解决此问题,请完成以下步骤:

查看身份验证方法,确认连接到 RDS 和 EC2 时选择的是 KERBEROS

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

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

更正属于您的域的 SQL Server 服务账户的 SPN

  1. 在 Active Directory 用户和计算机中,选择 example.com示例(域名)用户
  2. 要查看属性,请右键单击您的服务账户
  3. 委派选项卡中,选择信任此用户以委托给任何服务(仅限 Kerberos),然后选择确定
  4. 重新启动 EC2 实例或本地 SQL Server 上的 SQL Server 服务。
  5. 如以下示例命令所示,为服务账户添加 SPN。请将 example 替换为您的域名。将 ServiceAccountNameEc2name 域替换为您域的正确的值:
    setspn -A MSSQLSvc/Ec2name.domain.com example\ServiceAccountName
    setspn -A MSSQLSvc/Ec2name.domain.com:1433 example\ServiceAccountName

要验证新创建的 SPN,请运行以下命令:

setspn -l example\ServiceAccountName

使用 RDS example.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
  3. 输出还显示了您的 RDS 实例的已注册 ServicePrincipalNames,如以下示例所示:

    MSSQLSvc/ YourServerName.example.com:1433
  4. 要使用域登录信息重新创建链接服务器,请运行以下命令。数据来源就是您在步骤 2 中从命令输出中检索到的数据来源:

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

测试来自客户端的连接。

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

相关信息

使用 Amazon RDS for Microsoft SQL Server 实现链接服务器

AWS 官方
AWS 官方已更新 8 个月前