如何在適用於 SQL Server 的 RDS 中為建立一個以 RDS 為源的連結伺服器?

3 分的閱讀內容
0

我想在適用於 Microsoft SQL Server 執行個體的 Amazon Relational Database Service (Amazon RDS) 和 SQL Server 間建立一個連結伺服器。

簡短說明

Amazon RDS 是一種受管服務,因此用戶沒有系統管理員存取權限。直接從 GUI 建立連結伺服器會導致錯誤。若要建立連結伺服器,請使用 T-SQL。

根據先決條件,您的適用於 SQL Server 的 RDS 必須與目標 SQL Server 相連。

注意: 即使更換主機,連結伺服器密碼和組態仍保持不變。

解決方法

將適用於 SQL Server 執行個體的 RDS 連線至適用於 SQL Server 執行個體的 RDS

建立以適用於 SQL Server 的 RDS 為源,以適用於 SQL Server 的 RDS 為目標的連結伺服器時,請使用 DNS 名稱。這可防止因更換主機或伺服器而導致 IP 地址發生變化。

在 Amazon RDS 中,IP 地址是動態的,端點則是靜態。因此,最佳實務是使用端點連線至執行個體。每個 Amazon RDS 執行個體都有一個端點。請參閱以下參數:

  • @server: 您的連結伺服器名稱。
  • @datasrc: 您的 RDS 端點名稱。對於 Amazon Elastic Compute Cloud (Amazon EC2) 內部部署執行個體,為您的 EC2 內部部署 IP 地址或 DNS 名稱。
  • @rmtuser: 可存取目標資料庫的登入名稱。
  • @rmtpassword: 登入名稱的密碼。

連線到適用於 SQL Server 的 RDS 執行個體

使用主要登入連線至執行個體,然後執行下列命令。請確定您使用的是端點,而非 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]

適用於 SQL Server 執行個體的 RDS 至 EC2 SQL Server 執行個體或內部部署 SQL Server

建立連結伺服器

建立連結伺服器,將適用於SQL Server 的 RDS 作為 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 將來自適用於 SQL Server 的 RDS 的連結伺服器設定為 EC2 執行個體或內部部署 SQL Server。

先決條件

  • 您必須擁有使用 AWS 受管 Microsoft AD 建立和加入的域。
  • 源 EC2 SQL Server 執行個體和目標 RDS SQL Server 必須具有連線能力。

使用 Windows Authenticaiton,將連結伺服器從 EC2 或現內部部署 SQL Server 設定為適用於 SQL Server 的 RDS

  • 登入您的域,然後執行下列查詢以建立連結伺服器。
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 執行個體端點。必須使用 KERBEROS 對 EC2 和 RDS 進行身分驗證。

若要解決此問題,請完成下列步驟:

檢查身分驗證方法,以確認在連線至 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. 要查看屬性,請用滑鼠右鍵按一下 YourServiceAccount
  3. 委派索引標籤中,選擇信任此使用者,可委派任何服務 (僅限 Kerberos),然後選取確定
  4. 在 EC2 執行個體或內部部署 SQL Server 上重新啟動 SQL 伺服器服務。
  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. 若要擷取伺服器名稱,請在適用於 SQL Server 的 RDS 中執行下列查詢:

    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

測試來自用戶端的連線能力。

對於異質連結伺服器,您可以使用適用於 SQL Server 的 RDS Custom

相關資訊

用適用於 Microsoft SQL Server 的 Amazon RDS 實施連結伺服器

AWS 官方
AWS 官方已更新 9 個月前