適用於:Azure SQL 受控執行個體
本文將教你如何用 Transact-SQL 和 PowerShell 或 Azure CLI 腳本,在 SQL Server 與 Azure SQL 受控執行個體 之間配置單一資料庫模式連結。 這個連結能將資料庫從最初的主副本複製到次要副本,幾乎是即時的。
在建立連結之後,您就可以容錯移轉至次要複本,以便進行移轉或災害復原。
注意
- 也可以用 SQL Server Management Studio(SSMS)來設定連結。
- 從
SQL Server 2022 CU10 開始,支援將 Azure SQL 受控執行個體 設定為初始主體。
概觀
使用連結功能,將資料庫從初始主複本複寫到次要複本。 對於 SQL Server 2022,初始的主要節點可以是 SQL Server 或 Azure SQL 受控執行個體。 對於 SQL Server 2019 及更早版本,首字母必須是 SQL Server。 在設定連結之後,會將初始主要複本的資料庫複寫到次要複本。
你可以選擇保留連線,以便在主副本與次要副本之間的混合環境中持續進行資料複製,或者將資料庫故障移轉到次要副本,將系統遷移到 Azure 或進行災難復原。 在 SQL Server 2019 及更早版本中,切換到 Azure SQL 受控執行個體 會斷開連結,且不支援回傳。 在 SQL Server 2022 中,你可以選擇維持連結,並在兩個副本之間互相切換。
如果您打算僅使用次要受控執行個體進行災害復原,您可藉由啟用混合式容錯移轉權益來節省授權成本。
請依照本文說明手動設定 SQL Server 與 Azure SQL 受控執行個體 之間的連結。 在建立連結之後,您的來源資料庫會在目標次要複本上生成一個唯讀副本。
提示
為了簡化使用 T-SQL 腳本並符合您環境的正確參數,我們強烈建議使用
必要條件
若要複寫您的資料庫,必須符合下列必要條件:
- 一個有效的 Azure 訂閱。 如果您沒有訂用帳戶,請建立免費帳戶。
- 已安裝所需服務更新的支援版本 SQL Server。
- Azure SQL 受控執行個體. 如果您尚未擁有,請開始使用。
- Azure PowerShell 搭配 Az 16.3.0 或更新版本及 Az.Sql 7.1.0 或更新版本,或 Azure CLI 2.90.0 或更新版本。 您也可以使用 Azure Cloud Shell。 執行腳本前,請先確認已安裝的模組或 CLI 版本。
- 已正確備妥的環境。
請考慮下列事項:
- 本文範例使用單一資料庫連結模式,即每個連結複製一個資料庫。 若要擴展現有的 Always On 可用性群組並支援多個資料庫,請依照 Extend an Always On 可用性群組至 Azure SQL 受控執行個體 (preview)操作。
- SQL Server 和 SQL 受管理執行個體 之間的整合應該是一樣的。 整合不符可能導致伺服器名稱外殼不符,阻礙 SQL Server 與 SQL 受管理執行個體 的成功連線。
- 你在初始 SQL Server 主伺服器上出現錯誤 1475,表示你需要建立一份完整備份,且未使用
COPY ONLY選項來啟動新的備份鏈。 - 若要在 SQL 托管實例和 SQL Server 2025 之間建立連結或執行故障轉移,您的 SQL 托管實例必須設定為適用 SQL Server 2025 的更新政策。 由於更新政策不匹配配置的實例,不支援資料複製與故障轉移從 SQL 受管理執行個體 到 SQL Server 2025。
- 若要建立連結或進行故障轉移從 SQL 管理實例到 SQL Server 2022,您的 SQL 管理實例必須配置為 SQL Server 2022 更新策略。 資料複寫與故障移轉從 SQL 受管理執行個體 到 SQL Server 2022,若實例的更新政策配置不匹配,不支援。
- 雖然您可以從支援版本的 SQL Server 建立連結到設定為 Always-up-to-date 更新策略的 SQL 受控執行個體,但在 SQL 受控執行個體發生故障轉移後,您將無法再複製資料或將服務恢復到您的 SQL Server 實例。
權限
SQL Server方面,你應該有 sysadmin 權限。
Azure SQL 受控執行個體方面,你應該是 SQL 受管理執行個體 Contributor 的成員,或擁有以下自訂角色權限:
| Microsoft.Sql/資源 | 必要權限 |
|---|---|
| Microsoft.Sql/managedInstances | /read、/write |
| Microsoft。Sql/managedInstances/hybridCertificate | /action |
| Microsoft。Sql/managedInstances/資料庫 | /read、/delete、/write、/completeRestore/action、/readBackups/action、/restoreDetails/read |
| Microsoft。Sql/managedInstances/distributedAvailabilityGroups | /read、/write、/delete、/setRole/action |
| Microsoft。Sql/managedInstances/endpointCertificates | /read |
| Microsoft.Sql/managedInstances/hybridLink | /read、/write、/delete |
| Microsoft。Sql/managedInstances/serverTrustCertificates | /write、/delete、/read |
詞彙和命名慣例
執行本使用者指南腳本時,重要的是不要將 SQL Server 和 SQL 受管理執行個體 名稱誤認為完全限定的網域名稱(FQDN)。 下表說明各種名稱確切代表的意思,以及如何取得其值:
| 詞彙 | 描述 | 如何查詢 |
|---|---|---|
| 初始主要項目 1 | SQL Server 或 SQL 受管理執行個體 是你最初建立連結,將資料庫複製到次要副本的地方。 | |
| 主要副本 | 當前承載主要資料庫的 SQL Server 或 SQL 受管理執行個體。 | |
| 次要副本 | 接收來自目前主要複本的近即時複製資料的 SQL Server 或 SQL 受管理執行個體。 | |
| SQL Server 名稱 | 簡短、單字的 SQL Server 名稱。 例如:sqlserver1。 | 從 T-SQL 執行 SELECT @@SERVERNAME。 |
| SQL Server FQDN | SQL Server 的完全限定網域名稱(FQDN)。 例如:sqlserver1.domain.com。 | 查看你本地的網路(DNS)設定,或者如果你使用Azure虛擬機(VM),請查看伺服器名稱。 |
| SQL 受管理執行個體 名稱 | 短且為單一單字的 SQL 受管理執行個體 名稱。 例如:managedinstance1。 | 在 Azure 入口網站查看你所管理實例的名稱。 |
| SQL 托管實例完整域名 (FQDN) | 你的 SQL 受管理執行個體 的完全限定網域名稱(FQDN)。 例如:managedinstance1.6d710bcf372b.database.windows.net。 | 請參閱 Azure 入口網站中 SQL 受管理執行個體 概覽頁面上的主機名稱。 |
| 可解析的網域名稱 | 可解析為 IP 位址的 DNS 名稱。 例如,執行 nslookup sqlserver1.domain.com 應傳回 IP 位址,例如 10.0.0.1。 |
從命令提示字元執行 nslookup 命令。 |
| SQL Server 網際協議 | 你的 SQL Server IP 位址。 若 SQL Server 有多個 IP,請選擇 Azure 可存取的 IP 位址。 | 從運行 SQL Server 的主機作業系統命令提示字元中執行 ipconfig 命令。 |
1 支援將 Azure SQL 受控執行個體 設定為初始主體是從 SQL Server 2022 CU10 開始。
設定資料庫復原和備份
如果 SQL Server 是你的初始主要伺服器,那麼透過連結複製的資料庫必須完整恢復模式,且至少有一個備份。 由於 Azure SQL 受控執行個體 會自動備份,如果 SQL 受管理執行個體 是你的初始主要備份,可以跳過這一步。
當您建立連結時,主副本和次副本之間的初始化種子是透過完整備份主副本的資料庫,將其轉移到次副本,然後在次副本上還原該資料庫。 當您進行完整備份時,我們建議您使用 WITH CHECKSUM 該選項來確保備份有效且無任何損壞。 更多資訊請參見 BACKUP (Transact-SQL)。
在 SQL Server 上執行以下程式碼,針對你想複製的所有資料庫。 將 <DatabaseName> 取代為實際的資料庫名稱。
-- Run on SQL Server
-- Set full recovery model for all databases you want to replicate.
ALTER DATABASE [<DatabaseName>] SET RECOVERY FULL
GO
-- Execute backup for all databases you want to replicate.
BACKUP DATABASE [<DatabaseName>] TO DISK = N'<DiskPath>'
GO
如需詳細資訊,請參閱建立完整資料庫備份。
注意
此連結僅支援使用者資料庫的複寫。 不支援系統資料庫的複寫。 若要複寫執行個體層級物件 (儲存在 master 或 msdb 資料庫中),建議您透過指令碼找出這些物件,並在目的地執行個體上執行 T-SQL 指令碼。
在執行個體之間建立信任
首先,您必須在兩個執行個體之間建立信任,並保護用來跨網路通訊和加密資料的端點。 分散式可用性群組會使用現有可用性群組的資料庫鏡像端點,而不是擁有自己的專用端點。 因此,必須透過可用性群組資料庫鏡像端點,在兩個執行個體之間設定安全性和信任。
注意
基於“Always On”可用性群組技術的連結。 資料庫鏡像端點是供可用性群組使用的特殊目的端點,用於接收來自其他伺服器執行個體的連線。 資料庫鏡像端點這個詞不應與舊有的 SQL Server 資料庫鏡像功能混淆。
憑證式信任是唯一支援保護 SQL Server 與 SQL 受管理執行個體 資料庫鏡像端點的方法。 如果你已有使用 Windows 驗證 的可用性群組,你需要在現有的鏡像端點新增憑證信任作為次要認證選項。 如本文稍後所示,您可以使用 ALTER ENDPOINT 陳述式來完成這項作業。
重要
系統會產生具有到期日期和時間的憑證。 這些憑證必須在到期前更新並輪替。
以下列出保護 SQL Server 與 SQL 受管理執行個體 資料庫鏡像端點的流程概述:
- 在 SQL Server 上產生憑證並取得其公鑰。
- 取得 SQL 受管理執行個體 憑證的公開金鑰。
- 在 SQL Server 與 SQL 受管理執行個體 之間交換公鑰。
- 將 Azure 信任的根憑證授權機構的密鑰匯入 SQL Server
下列各節會詳細描述這些步驟。
在 SQL Server 建立憑證,並將其公鑰匯入 SQL 受管理執行個體
首先,如果 master 資料庫中還沒有資料庫主要金鑰,請建立一個。 用強密碼取代 <password> ,並放在保密且安全的地方。 在 SQL Server 上執行這個 T-SQL 腳本:
-- Run on SQL Server
-- Create a master key encryption password
-- Keep the password confidential and in a secure place
USE MASTER
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
BEGIN
PRINT 'Creating master key.' + CHAR(13) + 'Keep the password confidential and in a secure place.'
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>'
END
ELSE
PRINT 'Master key already exists.'
GO
接著,在 SQL Server 上產生認證憑證。 在下列指令碼中,取代:
- 將
@cert_expiry_date取代為所需憑證到期日 (未來日期)。
記錄此日期並設定提醒,以便在 SQL Server 憑證到期日期之前輪替 (更新),確保連結能夠持續作業。
重要
強烈建議使用此指令碼中自動產生的憑證名稱。 雖然允許在SQL Server自訂自己的憑證名稱,但名稱中不應包含任何 \ 字元。
-- Create the SQL Server certificate for the instance link
USE MASTER
-- Customize SQL Server certificate expiration date by adjusting the date below
DECLARE @cert_expiry_date AS varchar(max)='03/30/2025'
-- Build the query to generate the certificate
DECLARE @sqlserver_certificate_name NVARCHAR(MAX) = N'Cert_' + @@servername + N'_endpoint'
DECLARE @sqlserver_certificate_subject NVARCHAR(MAX) = N'Certificate for ' + @sqlserver_certificate_name
DECLARE @create_sqlserver_certificate_command NVARCHAR(MAX) = N'CREATE CERTIFICATE [' + @sqlserver_certificate_name + '] ' + char (13) +
' WITH SUBJECT = ''' + @sqlserver_certificate_subject + ''',' + char (13) +
' EXPIRY_DATE = '''+ @cert_expiry_date + ''''+ char (13)
IF NOT EXISTS (SELECT name from sys.certificates WHERE name = @sqlserver_certificate_name)
BEGIN
PRINT (@create_sqlserver_certificate_command)
-- Execute the query to create SQL Server certificate for the instance link
EXEC sp_executesql @stmt = @create_sqlserver_certificate_command
END
ELSE
PRINT 'Certificate ' + @sqlserver_certificate_name + ' already exists.'
GO
接著,在 SQL Server 上使用以下 T-SQL 查詢來驗證憑證是否已建立:
-- Run on SQL Server
USE MASTER
GO
SELECT * FROM sys.certificates WHERE pvt_key_encryption_type = 'MK'
在查詢結果中,您會看到該憑證已使用主要金鑰進行加密。
現在,你可以在 SQL Server 上取得產生憑證的公鑰:
-- Run on SQL Server
-- Show the name and the public key of generated SQL Server certificate
USE MASTER
GO
DECLARE @sqlserver_certificate_name NVARCHAR(MAX) = N'Cert_' + @@servername + N'_endpoint'
DECLARE @PUBLICKEYENC VARBINARY(MAX) = CERTENCODED(CERT_ID(@sqlserver_certificate_name));
SELECT @sqlserver_certificate_name as 'SQLServerCertName'
SELECT @PUBLICKEYENC AS SQLServerPublicKey;
儲存輸出中的 SQLServerCertName 和 SQLServerPublicKey 值,因為您將在下一個步驟匯入憑證時需要這項資訊。
首先,確保你已登入 Azure,並且已選擇你所託管實例的訂閱。 如果你的帳戶上有多個 Azure 訂閱,選擇合適的訂閱尤其重要。
請將<SubscriptionID>替換成你的Azure訂閱ID。
# Run in Azure Cloud Shell (select PowerShell console)
# Enter your Azure subscription ID
$SubscriptionID = "<SubscriptionID>"
# Login to Azure and select subscription ID
if ((Get-AzContext ) -eq $null)
{
echo "Logging to Azure subscription"
Login-AzAccount
}
Select-AzSubscription -SubscriptionName $SubscriptionID
接著使用 New-AzSqlServerTrustCertificate PowerShell 或 az sql mi partner-cert create Azure CLI 指令,將認證憑證的公鑰從 SQL Server 上傳到 Azure,例如以下 PowerShell 範例。
填寫必要的使用者資訊,複製、貼上這些資訊,然後執行指令碼。 取代:
-
<SQLServerPublicKey>,使用你在前一步記錄的以二進位格式呈現的 SQL Server 證書的公用部分。 這是開頭為0x的長字串值。 -
<SQLServerCertName>,並使用你在前一步記錄的SQL Server證書名稱。 - 請將
<ManagedInstanceName>替換為您的受控執行個體的簡短名稱。
# Run in Azure Cloud Shell (select PowerShell console)
# ===============================================================================
# POWERSHELL SCRIPT TO IMPORT SQL SERVER PUBLIC CERTIFICATE TO SQL MANAGED INSTANCE
# ===== Enter user variables here ====
# Enter the name for the server SQLServerCertName certificate – for example, "Cert_sqlserver1_endpoint"
$CertificateName = "<SQLServerCertName>"
# Insert the certificate public key blob that you got from SQL Server – for example, "0x1234567..."
$PublicKeyEncoded = "<SQLServerPublicKey>"
# Enter your managed instance short name – for example, "sqlmi"
$ManagedInstanceName = "<ManagedInstanceName>"
# ==== Do not customize the below cmdlets====
# Find out the resource group name
$ResourceGroup = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName
# Upload the public key of the authentication certificate from SQL Server to Azure.
New-AzSqlInstanceServerTrustCertificate -ResourceGroupName $ResourceGroup -InstanceName $ManagedInstanceName -Name $CertificateName -PublicKey $PublicKeyEncoded
此操作的結果是將上傳至 Azure 的 SQL Server 憑證摘要。
如果您需要查看所有已上傳至受管控實例的 SQL Server 憑證,請在 Azure Cloud Shell 中使用 Get-AzSqlInstanceServerTrustCertificate PowerShell 或 az sql mi partner-cert list Azure CLI 指令。 要移除上傳到 SQL 管理實例的 SQL Server 憑證,請在 Azure Cloud Shell 中使用 Remove-AzSqlInstanceServerTrustCertificate PowerShell 命令或 az sql mi partner-cert delete Azure CLI 命令。
從 SQL 受管理執行個體 取得憑證公鑰並匯入 SQL Server
保護連結端點的憑證會在 Azure SQL 受控執行個體 自動產生。 從 SQL 受管理執行個體 取得憑證公鑰,並使用 Get-AzSqlInstanceEndpointCertificatePowerShell 或 az sql mi endpoint-cert show Azure CLI 指令匯入 SQL Server,例如以下 PowerShell 範例。
警告
使用Azure CLI時,你需要在後續步驟手動在 PublicKey 輸出前加上 0x。 例如,PublicKey 看起來會像 “0x3082033E30...”。
執行下列指令碼。 取代:
-
<SubscriptionID>,並附上你的Azure訂閱 ID。 - 請將
<ManagedInstanceName>替換為您的受控執行個體的簡短名稱。
# Run in Azure Cloud Shell (select PowerShell console)
# ===============================================================================
# POWERSHELL SCRIPT TO EXPORT MANAGED INSTANCE PUBLIC CERTIFICATE
# ===== Enter user variables here ====
# Enter your managed instance short name – for example, "sqlmi"
$ManagedInstanceName = "<ManagedInstanceName>"
# ==== Do not customize the following cmdlet ====
# Find out the resource group name
$ResourceGroup = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName
# Fetch the public key of the authentication certificate from Managed Instance. Outputs a binary key in the property PublicKey.
Get-AzSqlInstanceEndpointCertificate -ResourceGroupName $ResourceGroup -InstanceName $ManagedInstanceName -EndpointType "DATABASE_MIRRORING" | out-string
複製整個 PublicKey 輸出 (以 0x 開頭),因為您將在下個步驟中需要這項資訊。
或者,如果您在複製並貼上公開金鑰時遇到問題,您也可以在受控執行個體上執行 T-SQL 命令 EXEC sp_get_endpoint_certificate 4,以取得連結端點的公開金鑰。
接著,將取得的管理實例安全憑證的公開金鑰匯入 SQL Server。 在 SQL Server 執行以下查詢以建立 MI 端點憑證。 取代:
- 將
<ManagedInstanceFQDN>取代為受控執行個體的完整網域名稱。 -
<PublicKey>,並使用在前一步驟中取得的公鑰值(以0x開頭,從 Azure Cloud Shell 取得)。 您不需要使用引號。
重要
憑證名稱必須為 SQL 受管理執行個體 FQDN,且不得被修改。 如果使用自訂名稱,連結將無法運作。
-- Run on SQL Server
USE MASTER
CREATE CERTIFICATE [<ManagedInstanceFQDN>]
FROM BINARY = <PublicKey>
將 Azure 信任的根憑證授權機構的密鑰匯入 SQL Server
將您的 Azure 受信任根憑證授權機構(CA)金鑰匯入 SQL Server 是必須的,這樣 SQL Server 才能信任由 Azure 頒發的 SQL 受管理執行個體 公鑰憑證。
你可以從 Azure憑證授權機構詳情下載必要的根 CA 金鑰。 至少,下載DigiCert Global Root G2 以及 Microsoft RSA 根憑證授權機構 2017 憑證,並匯入到你的 SQL Server 實例。 不過,如果你打算讓這個連結持續超過幾個月,請下載並匯入 Root Certificate Authorities 區塊中列出的所有 7 張憑證,以避免 Azure 更新其受信任憑證清單時可能造成的干擾。
注意
SQL 受管理執行個體 公鑰憑證路徑中的根憑證是由 Azure 受信任的根憑證授權機構(CA)發出的。 隨著 Azure 更新其受信任的 CA 清單,特定的根 CA 可能會隨時間改變。
為了簡化設定,安裝在
將憑證儲存在SQL Server實例本地,例如範例C:\Path\To\<name of certificate>.crt路徑,然後使用以下Transact-SQL腳本從該路徑匯入憑證。 將<name of certificate>替換為證書名稱,例如DigiCert Global Root G2或Microsoft RSA Root Certificate Authority 2017。
-- Run on SQL Server
-- Import <name of certificate> root-authority certificate (trusted by Azure), if not already present
IF NOT EXISTS (SELECT name FROM sys.certificates WHERE name = N'<name of certificate>')
BEGIN
PRINT 'Creating <name of certificate> certificate.'
CREATE CERTIFICATE [<name of certificate>] FROM FILE = 'C:\Path\To\<name of certificate>.crt'
--Trust certificates issued by <name of certificate> root authority for Azure database.windows.net domains
DECLARE @CERTID int
SELECT @CERTID = CERT_ID('<name of certificate>')
--For government cloud, use the corresponding SQL Database DNS suffix, e.g. '*.database.usgovcloudapi.net', '*.database.chinacloudapi.cn' etc.
EXEC sp_certificate_add_issuer @CERTID, N'*.database.windows.net'
END
ELSE
PRINT 'Certificate <name of certificate> already exists.'
GO
注意
SQL Server 環境中缺少的 sp_certificate_add_issuer 儲存程序表示你的 SQL Server 實例尚未安裝 適當的服務更新。
最後,使用下列動態管理檢視 (DMV) 來驗證所有建立的憑證:
-- Run on SQL Server
USE master
SELECT * FROM sys.certificates
驗證憑證鏈結
對憑證的排程或無意變更可能會削弱鏈結的品質。 為避免中斷,定期在 SQL Server 上 驗證憑證鏈 是重要的。
如果您要設定新連結,或最近已匯入憑證,請略過此步驟,如前幾節所述。
保護資料庫鏡像端點
如果你沒有現有的可用性群組,或沒有 SQL Server 上的資料庫鏡像端點,下一步是在 SQL Server 建立一個資料庫鏡像端點,並用先前產生的 SQL Server 憑證加以保護。 如果您確實有現有的可用性群組或鏡像端點,請跳至更改現有的端點一節。
在 SQL Server 上建立並保護資料庫鏡像端點
若要確認您尚未建立現有的資料庫鏡像端點,請使用下列指令碼:
-- Run on SQL Server
-- View database mirroring endpoints on SQL Server
SELECT * FROM sys.database_mirroring_endpoints WHERE type_desc = 'DATABASE_MIRRORING'
如果前述查詢沒有顯示現有的資料庫鏡像端點,請在 SQL Server 上執行以下腳本,取得先前產生的 SQL Server 憑證名稱。
-- Run on SQL Server
-- Show the name and the public key of generated SQL Server certificate
USE MASTER
GO
DECLARE @sqlserver_certificate_name NVARCHAR(MAX) = N'Cert_' + @@servername + N'_endpoint'
SELECT @sqlserver_certificate_name as 'SQLServerCertName'
儲存來自輸出的 SQLServerCertName,因為您將在下一個步驟中需要這項資訊。
請使用以下腳本在埠號 <EndpointPort> 建立一個新的資料庫鏡像端點,並用 SQL Server 憑證保護該端點。 取代:
- 將
<SQL_SERVER_CERTIFICATE>取代為您在上一個步驟中取得的 SQLServerCertName 名稱。
-- Run on SQL Server
-- Create a connection endpoint listener on SQL Server
USE MASTER
CREATE ENDPOINT database_mirroring_endpoint
STATE=STARTED
AS TCP (LISTENER_PORT=<EndpointPort>, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING (
ROLE=ALL,
AUTHENTICATION = CERTIFICATE [<SQL_SERVER_CERTIFICATE>],
ENCRYPTION = REQUIRED ALGORITHM AES
)
GO
透過在 SQL Server 上執行以下腳本,驗證鏡像端點是否已建立:
-- Run on SQL Server
-- View database mirroring endpoints on SQL Server
SELECT
name, type_desc, state_desc, role_desc,
connection_auth_desc, is_encryption_enabled, encryption_algorithm_desc
FROM
sys.database_mirroring_endpoints
成功建立的端點 state_desc 資料行應處於 STARTED 狀態。
已建立新的鏡像端點,並啟用憑證驗證和 AES 加密。
更改現有的端點
對於已有多個資料庫的 Always On 可用性群組,也請檢視擴展至 Azure SQL 受控執行個體 時的監聽器和憑證需求。
注意
如果您剛建立新的鏡像端點,請略過此步驟。 只有當您使用現有的可用性群組以及現有的資料庫鏡像端點時,才採用此步驟。
如果您針對連結使用現有的可用性群組,或如果有現有的資料庫鏡像端點,請先驗證其符合連結的下列必要條件:
- 類型必須是
DATABASE_MIRRORING。 - 連線驗證必須是
CERTIFICATE。 - 必須啟用加密。
- 加密演算法必須是
AES。
請在 SQL Server 上執行以下查詢,以查看現有資料庫鏡像端點的詳細資訊:
-- Run on SQL Server
-- View database mirroring endpoints on SQL Server
SELECT
name, type_desc, state_desc, role_desc, connection_auth_desc,
is_encryption_enabled, encryption_algorithm_desc
FROM
sys.database_mirroring_endpoints
如果輸出顯示現有 DATABASE_MIRRORING 端點的 connection_auth_desc 不是 CERTIFICATE 或 encryption_algorithm_desc 不是 AES,則「必須更改端點以符合需求」。
在 SQL Server 上,同一資料庫鏡像端點同時用於可用性群組與分散式可用性群組。 如果您的 connection_auth_desc 端點是 NTLM(Windows 驗證)或 KERBEROS,並且您需要為現有可用性群組設置 Windows 驗證,可以透過將驗證選項更改為 NEGOTIATE CERTIFICATE,使端點使用多重驗證方法。 此變更允許現有可用性群組使用 Windows 驗證,同時使用憑證驗證 SQL 受管理執行個體。
同樣地,如果加密不包含 AES,而且您需要 RC4 加密,則可以更改端點以使用這兩種演算法。 如需更改端點的可能選項詳細資料,請參閱 sys.database_mirroring_endpoints 的文件頁面。
以下腳本示範如何修改 SQL Server 上現有的資料庫鏡像端點。 取代:
- 用您現有的端點名稱替換
<YourExistingEndpointName>。 -
<SQLServerCertName>並提供生成的 SQL Server 證書名稱(在以上步驟之一中獲取)。
根據您的特定設定,您可能需要進一步自訂指令碼。 你也可以用 SELECT * FROM sys.certificates 取得 SQL Server 上建立憑證的名稱。
-- Run on SQL Server
-- Alter the existing database mirroring endpoint to use CERTIFICATE for authentication and AES for encryption
USE MASTER
ALTER ENDPOINT [<YourExistingEndpointName>]
STATE=STARTED
AS TCP (LISTENER_PORT=<EndpointPort>, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING (
ROLE=ALL,
AUTHENTICATION = WINDOWS NEGOTIATE CERTIFICATE [<SQLServerCertName>],
ENCRYPTION = REQUIRED ALGORITHM AES
)
GO
執行 ALTER 端點查詢並將雙重驗證模式設為 Windows 和憑證後,再次在 SQL Server 使用此查詢顯示資料庫鏡像端點的詳細資料:
-- Run on SQL Server
-- View database mirroring endpoints on SQL Server
SELECT
name, type_desc, state_desc, role_desc, connection_auth_desc,
is_encryption_enabled, encryption_algorithm_desc
FROM
sys.database_mirroring_endpoints
你已經成功修改了資料庫鏡像端點,讓它變成 SQL 受管理執行個體 連結。
在 SQL Server 建立可用性群組
如果你沒有現有的可用性群組,就在 SQL Server 上建立一個,不管哪個實例是初始的主要實例。
注意
如果您已經有現有的可用性群組,請略過本節。
如果你的SQL 受管理執行個體是初始主節點,建立可用性群組的指令會不同,且該指令只支援從
在單一資料庫連結模式下,你可以為同一資料庫建立多個連結,但每個連結只支援一個資料庫的複製。 如果你想為同一個資料庫建立多個連結,請使用同一個可用群組來管理所有連結。 不過,請為 SQL Server 與 SQL 受管理執行個體 之間的每個資料庫連結建立一個新的分散式可用性群組。
若要在現有的 Always On 可用性群組中使用多資料庫連結模式,請參見 擴展可用性群組。
如果 SQL Server 是你的初始主要伺服器,請建立一個包含以下參數的可用性群組作為連結:
- 初始主要伺服器名稱
- 資料庫名稱
-
MANUAL的容錯移轉模式 -
AUTOMATIC的播種模式
首先,透過執行以下 T-SQL 陳述式來找出你的 SQL Server 名稱:
-- Run on the initial primary
SELECT @@SERVERNAME AS SQLServerName
接著,使用以下腳本在 SQL Server 上建立可用性群組。 取代:
-
<AGNameOnSQLServer>,並標示你SQL Server可用群組名稱。 對於多個資料庫在多個連結中,考慮將每個可用群組命名為其名稱,使其名稱反映對應資料庫——例如。AG_<db_name> - 將
<DatabaseName>取代為您要複寫的資料庫名稱。 -
<SQLServerName>並以您在上一個步驟取得的 SQL Server 實例名稱。 -
<SQLServerIP>,SQL Server IP 位址。 你可以使用可解析的 SQL Server 主機名稱作為替代方案,但必須確保該名稱能從 SQL 受管理執行個體 虛擬網路中解析。
-- Run on SQL Server
-- Create the primary availability group on SQL Server
USE MASTER
CREATE AVAILABILITY GROUP [<AGNameOnSQLServer>]
WITH (CLUSTER_TYPE = NONE) -- <- Delete this line for SQL Server 2016 only. Leave as-is for all higher versions.
FOR database [<DatabaseName>]
REPLICA ON
N'<SQLServerName>' WITH
(
ENDPOINT_URL = 'TCP://<SQLServerIP>:<EndpointPort>',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
GO
重要
2016 SQL Server,請刪除上述 T-SQL 陳述句中的 WITH (CLUSTER_TYPE = NONE)。 將所有後續 SQL Server 版本保留原樣。
接著,在 SQL Server 上建立分散式可用性群組。 如果您計劃建立多個連結,則即使您是為同一個資料庫建立多個連結,也需要為每個連結建立一個分散式可用性群組。
取代下列值,然後執行 T-SQL 指令碼來建立分散式可用性群組。
- 將
<DAGName>替換為您的分散式可用性群組名稱。 由於您可以透過為每個連結建立一個分散式可用性群組來為同一個資料庫設定多個連結,因此請考慮據此命名每個分散式可用性群組,例如DAG1_<db_name>、DAG2_<db_name>。 - 將
<AGNameOnSQLServer>替換為您在上一個步驟中建立的可用性群組名稱。 -
<AGNameOnSQLMI>,並標示你SQL 受管理執行個體上可用群組名稱。 此名稱在 SQL MI 中必須是唯一的。 請考慮命名每個可用性群組,使其名稱反映對應的資料庫 (例如AG_<db_name>_MI)。 - 使用前一步驟取得的 SQL Server 的 IP 位址,替換
<SQLServerIP>。 你可以用可解析的 SQL Server 主機名稱作為替代,但請確保名稱能從 SQL 受管理執行個體 虛擬網路解析(這需要為受管理實例的子網設定自訂 Azure DNS)。 - 請將
<ManagedInstanceName>替換為您的受控執行個體的簡短名稱。 - 將
<ManagedInstanceFQDN>取代為您的管理的執行個體完整網域名稱。
-- Run on SQL Server
-- Create a distributed availability group for the availability group and database
-- ManagedInstanceName example: 'sqlmi1'
-- ManagedInstanceFQDN example: 'sqlmi1.73d19f36a420a.database.windows.net'
USE MASTER
CREATE AVAILABILITY GROUP [<DAGName>]
WITH (DISTRIBUTED)
AVAILABILITY GROUP ON
N'<AGNameOnSQLServer>' WITH
(
LISTENER_URL = 'TCP://<SQLServerIP>:<EndpointPort>',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC,
SESSION_TIMEOUT = 20
),
N'<AGNameOnSQLMI>' WITH
(
LISTENER_URL = 'tcp://<ManagedInstanceFQDN>:5022;Server=[<ManagedInstanceName>]',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC
);
GO
驗證可用性群組
請使用以下腳本確認可用性群組與分散式可用性群組的存在。 在搜尋結果中依名稱找到這兩個團體。 分散式可用性群組具有 is_distributed = 1。 此目錄檢視顯示的是群組元資料,而非副本連線狀態。 建立連結後,使用 檢查連結狀態 來驗證連接性與同步性。
-- Run on SQL Server
-- This will show that the availability group and distributed availability group have been created on SQL Server.
SELECT * FROM sys.availability_groups
或者,你也可以使用 SSMS 物件總管 來尋找可用性群組和分散式可用性群組。 展開 [Always On 高可用性] 資料夾,然後展開 [可用性群組] 資料夾。
建立連結
在執行建立腳本前,請在支援的 SQL Server 建置中使用追蹤旗標 12381,以防止在做種時過早截斷日誌,特別是對大型資料庫而言。 在所需紀錄被保留期間,日誌備份可以持續進行。 監控 SQL Server 記錄檔成長與可用磁碟空間,並在所有正在建立的連結皆完成植入後停用該旗標。
最後,您可以建立連結。 命令會依據作為初始主伺服器的實例而有所不同。 請使用 New-AzSqlInstanceLinkPowerShell 或 az sql mi link create Azure CLI 指令來建立連結,例如本節的 PowerShell 範例。 目前 Azure CLI 不支援從 SQL 受管理執行個體 主節點建立連結。
警告
只有在每個 SQL Server 複本都具有sys.sp_multidb_milink,且您已透過 MultiDatabase 在每個複本上啟用多重資料庫連結模式時,才指定 連結模式。 若未進行必要的更新或選擇加入,僅指定此模式可能導致 SQL Server 行為異常。 如果你符合這些要求,請依照 擴充 Always On 可用性群組 中的說明,並在 PowerShell 中使用包含 --link-mode MultiDatabase 的建立命令,或在 Azure CLI 中使用包含 -LinkMode MultiDatabase 的建立命令。 將所有資料庫納入可用性群組。 不要使用本文中的單一資料庫範例。
如果你需要查看受管理實例上的所有連結,可以使用 Get-AzSqlInstanceLink PowerShell 命令或 az sql mi link show Azure CLI 命令在 Azure Cloud Shell 中執行。
若要製作符合您環境的腳本,請使用 SSMS 連結嚮導,並在摘要頁面選擇腳本。 檢視產生的腳本並分別執行。
如果你使用 Azure Cloud Shell,請確保已選擇 PowerShell。
請依照下表描述配置輸入變數。 腳本會取得資源群組並建立端點,然後建立以 SQL 受管理執行個體 作為次要的連結,並加入 SQL Server 上的分散式可用性群組。 保持資源群組查找、端點建置和建立指令不變。
| Variable | 描述 |
|---|---|
$ManagedInstanceName |
你 SQL 管理實例的簡稱,例如 sqlmi1。 |
$AGNameOnSQLServer |
在 SQL Server 上建立的可用性群組名稱。 |
$AGNameOnSQLMI |
在 SQL 受管理執行個體 上建立的可用性群組名稱。 |
$DAGName |
在 SQL Server 上建立的分散式可用性群組名稱,同時也用作連結名稱。 |
$DatabaseName |
可用性群組中要複寫之資料庫的確切名稱。 |
$SQLServerIP |
SQL Server IP 位址可從 SQL 受管理執行個體 存取。 對於多節點可用性群組,請使用監聽者的 IP 位址。 |
$EndpointPort |
SQL Server 資料庫鏡像端點連接埠。 |
$ResourceGroup |
腳本檢索資源群組名稱。 不要替換這個任務。 |
$SourceIP |
連線端點由腳本從 IP 位址和埠口建立。 不要替換這個任務。 |
注意
如果您想要建立已存在可用性群組的連結,請在提供 <SQLServerIP> 參數時提供接聽程式的 IP 位址。 請確保所有可用性群組節點與SQL 受管理執行個體間已建立信任(參見 建立實例間信任章節)。
# Run in Azure Cloud Shell and select PowerShell.
# =============================================================================
# POWERSHELL SCRIPT TO CREATE MANAGED INSTANCE LINK
# Instructs Managed Instance to join distributed availability group on SQL Server
# ===== Enter user variables here ====
# Enter your SQL managed instance name, for example, "sqlmi1".
$ManagedInstanceName = "<ManagedInstanceName>"
# Enter the availability group name that was created on SQL Server.
$AGNameOnSQLServer = "<AGNameOnSQLServer>"
# Enter the availability group name that was created on SQL Managed Instance.
$AGNameOnSQLMI = "<AGNameOnSQLMI>"
# Enter the distributed availability group name that was created on SQL Server.
$DAGName = "<DAGName>"
# Enter the database name that was placed in the availability group for replication.
$DatabaseName = "<DatabaseName>"
# Enter the SQL Server IP.
$SQLServerIP = "<SQLServerIP>"
# Enter the SQL Server endpoint port.
$EndpointPort = "<EndpointPort>"
# ==== Do not customize the following cmdlet ====
# Find out the resource group name.
$ResourceGroup = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName
# Build the connection endpoint.
$SourceIP = "TCP://" + $SQLServerIP + ":"+$EndpointPort
# Create the link on SQL Managed Instance and join the distributed availability group on SQL Server.
New-AzSqlInstanceLink -ResourceGroupName $ResourceGroup -InstanceName $ManagedInstanceName -Name $DAGName -PartnerAvailabilityGroupName $AGNameOnSQLServer -InstanceAvailabilityGroupName $AGNameOnSQLMI -Database @($DatabaseName) -PartnerEndpoint $SourceIP -InstanceLinkRole "Secondary" -FailoverMode "Manual" -SeedingMode "Automatic" -LinkMode "SingleDatabase"
此作業的結果會是建立連結要求成功執行的時間戳記。
確認連結
要驗證 SQL 受管理執行個體 與 SQL Server 之間的連結,請在 SQL Server 上執行以下查詢。 連接不會立即完成。 DMV 最多可能需要一分鐘的時間才會開始顯示成功的連線。 持續刷新 DMV,直到 SQL 受管理執行個體 副本的連線狀態顯示為「CONNECTED」。
-- Run on SQL Server
SELECT
r.replica_server_name AS [Replica],
r.endpoint_url AS [Endpoint],
rs.connected_state_desc AS [Connected state],
rs.last_connect_error_description AS [Last connection error],
rs.last_connect_error_number AS [Last connection error No],
rs.last_connect_error_timestamp AS [Last error timestamp]
FROM
sys.dm_hadr_availability_replica_states rs
JOIN sys.availability_replicas r
ON rs.replica_id = r.replica_id
連線建立後,SSMS 中的
重要
- 除非 SQL Server 與 SQL 受管理執行個體 之間有網路連線,否則連結無法運作。 若要針對網路連線進行疑難排解,請執行測試網路連線中的步驟。
- 定期備份 SQL Server 上的日誌檔。 若使用日誌空間達到 100%,複製至 SQL 受管理執行個體 會停止,直到空間使用減少為止。 強烈建議您藉由設定每日作業來自動執行記錄備份。 如需詳細資訊,請參閱SQL Server 上的備份日誌檔案。
進行第一個交易記錄備份
當 SQL Server 作為主要複本時,如果您在受支援的組建版本上啟用 追蹤旗標 12381,就可以在植入期間繼續執行交易記錄備份。 如果你為了避免過早截斷而暫停日誌備份,請在初始播種結束後恢復備份。 如果你還沒開始日誌備份,建議在初始做種結束後先做第一次 交易日誌備份 。 在您建立的所有連結都完成植入後,如果您已啟用該旗標,請將其停用,並在 SQL Server 仍為主要複本時定期備份 SQL Server 交易記錄。
如果 SQL 受管理執行個體 是你的主要備份,你不需要採取任何操作,因為 Azure SQL 受控執行個體 會自動備份日誌。
卸除連結
要移除你不再需要或無法修復的連結,首先在 SQL 受管理執行個體 上使用 PowerShell 或 Azure CLI 移除它。 然後用 T-SQL 移除 SQL Server 上的分散式可用性群組。 如果你需要重新連結,完成兩個移除步驟後再重新建立。
使用 Remove-AzSqlInstanceLink PowerShell 指令,搭配建立時的資源群組、實例和 link-name 變數:
Remove-AzSqlInstanceLink -ResourceGroupName $ResourceGroup -InstanceName $ManagedInstanceName -Name $DAGName -Force
或者,也可以在 Azure CLI 中使用 az sql mi link delete。 只執行其中一個移除指令。 如果您使用 Azure Cloud Shell,請確認已為 CLI 範例選取 Bash。
請依照下表描述配置輸入變數。 使用建立時所使用的相同資源群組、受管理執行個體和連結名稱。
| Variable | 描述 |
|---|---|
ResourceGroupName |
包含 SQL 管理實例的資源群組。 |
ManagedInstanceName |
承載連結的 SQL 管理實例名稱。 |
DAGName |
現有連結名稱,與建立時使用的分散式可用性群組名稱相符。 |
# Enter the resource group that contains the SQL managed instance.
ResourceGroupName="<ResourceGroupName>"
# Enter the managed instance name.
ManagedInstanceName="<ManagedInstanceName>"
# Enter the existing link name, matching the distributed availability group name.
DAGName="<DAGName>"
az sql mi link delete --resource-group "$ResourceGroupName" --instance-name "$ManagedInstanceName" --name "$DAGName" --yes
接著,在 SQL Server 上執行以下 T-SQL 腳本,移除分散式可用性群組。 使用分散式可用性群組 (用來建立連結的群組) 的名稱取代 <DAGName>:
USE MASTER
GO
DROP AVAILABILITY GROUP <DAGName>
GO
最後,如果您不再使用可用性群組,您可以選擇移除它。 若執行此動作,請使用可用性群組的名稱取代 <AGName>,然後在相應執行個體上執行:
DROP AVAILABILITY GROUP <AGName>
GO
疑難排解
如果您在建立連結時遇到錯誤訊息,則請檢閱查詢輸出視窗中的錯誤訊息以取得詳細資訊。 如需更多資訊,請檢閱 並檢查連結的故障排除資訊。
相關內容
若要使用連結:
若要進一步了解這個連結,請參閱以下內容:
針對其他複寫和移轉案例,請考慮: