如何在適用於 SQL Server 的 RDS 中為建立一個以 RDS 為源的連結伺服器?
我想在適用於 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
測試連結伺服器
- 在 Microsoft SQL Server Management Studio (SSMS) 中,連線到 RDS 執行個體。
- 在檢視功能表上,選取物件總管。
- 選取伺服器物件、連結伺服器。
- 以滑鼠右鍵按一下伺服器名稱,然後選取測試連線。
查詢連結的伺服器
執行下列查詢:
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
測試連結伺服器
- 在 Microsoft SQL Server Management Studio (SSMS) 中,連線到 RDS 執行個體。
- 在檢視功能表上,選取物件總管。
- 選取伺服器物件、連結伺服器。
- 以滑鼠右鍵按一下伺服器名稱,然後選取測試連線。
查詢連結的伺服器
執行下列查詢:
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
測試連結伺服器
- 在 Microsoft SQL Server Management Studio (SSMS) 中,連線到 RDS 執行個體。
- 在檢視功能表上,選取物件總管。
- 選取伺服器物件、連結伺服器。
- 以滑鼠右鍵按一下伺服器名稱,然後選取 測試連線。
查詢連結的伺服器
執行下列查詢:
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 **
- 在 Active Directory 使用者和電腦中,選取 example.com、範例 (域名)、使用者。
- 要查看屬性,請用滑鼠右鍵按一下 YourServiceAccount。
- 在委派索引標籤中,選擇信任此使用者,可委派任何服務 (僅限 Kerberos),然後選取確定。
- 在 EC2 執行個體或內部部署 SQL Server 上重新啟動 SQL 伺服器服務。
- 新增服務帳戶的 SPN,如下列範例命令所示。將 example 替換為您的域名。將 ServiceAccountName 和 Ec2name 域替換為您的域的正確值:
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 端點重新建立連結伺服器
-
若要擷取伺服器名稱,請在適用於 SQL Server 的 RDS 中執行下列查詢:
select @@servername as ServerName, session_id,net_transport, auth_scheme from sys.dm_exec_connections where session_id= @@spid;
-
在上述命令的輸出中,檢查伺服器名稱欄以驗證 SPN:
setspn -l YourServerName
-
輸出也會顯示 RDS 執行個體的已註冊 ServicePrincipalNames,如下列範例所示:
MSSQLSvc/ YourServerName.example.com:1433
-
若要使用網域登入重新建立連結伺服器,請執行下列命令。資料來源與您在步驟 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。
相關資訊
相關內容
- 已提問 2 年前lg...
- 已提問 2 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 6 個月前
- AWS 官方已更新 2 年前