使用腳本配置連接 - Azure SQL 托管執行個體

適用於:Azure SQL Managed Instance

本文教你如何用 Transact-SQL 和 PowerShell 或 Azure CLI 腳本在 SQL Server 和 Azure SQL Managed Instance 之間配置 link。 透過連結,來自初始主要複本的資料庫會以近乎即時的方式複寫到次要複本。

在建立連結之後,您就可以容錯移轉至次要複本,以便進行移轉或災害復原。

注意

概觀

使用連結功能,將資料庫從初始主複本複寫到次要複本。 對於 SQL Server 2022,初始的主要節點可以是 SQL Server 或 Azure SQL Managed Instance。 對於 SQL Server 2019 及更早版本,首字母必須是 SQL Server。 在設定連結之後,會將初始主要複本的資料庫複寫到次要複本。

你可以選擇保留連線,以便在主副本與次要副本之間的混合環境中持續進行資料複製,或者將資料庫故障移轉到次要副本,將系統遷移到 Azure 或進行災難復原。 在 SQL Server 2019 及更早版本中,切換到 Azure SQL Managed Instance 會斷開連結,且不支援回傳。 在 SQL Server 2022 中,你可以選擇維持連結,並在兩個副本之間互相切換。

如果您打算僅使用次要受控執行個體進行災害復原,您可藉由啟用混合式容錯移轉權益來節省授權成本。

請依照本文說明手動設定 SQL Server 與 Azure SQL Managed Instance 之間的連結。 在建立連結之後,您的來源資料庫會在目標次要複本上生成一個唯讀副本。

提示

為了簡化使用 T-SQL 腳本並符合您環境的正確參數,我們強烈建議使用 SQL Server Management Studio (SSMS) 中的 Managed Instance 連結嚮導,產生建立連結的腳本。 在New Managed Instance link視窗的Summary頁面,選擇Script,而非Finish

必要條件

若要複寫您的資料庫,必須符合下列必要條件:

請考慮下列事項:

  • 連結功能針對每個連結支援一個資料庫。 若要複寫一個執行個體上的多個資料庫,請針對每個資料庫建立一個連結。 例如,要將 10 個資料庫複製到 SQL Managed Instance,請建立 10 個獨立連結。
  • SQL Server 和 SQL Managed Instance 之間的整合應該是一樣的。 整合不符可能導致伺服器名稱外殼不符,阻礙 SQL Server 與 SQL Managed Instance 的成功連線。
  • 你在初始 SQL Server 主伺服器上出現錯誤 1475,表示你需要建立一份完整備份,且未使用 COPY ONLY 選項來啟動新的備份鏈。
  • 若要在 SQL 托管實例和 SQL Server 2025 之間建立連結或執行故障轉移,您的 SQL 托管實例必須設定為適用 SQL Server 2025 的更新政策。 由於更新政策不匹配配置的實例,不支援資料複製與故障轉移從 SQL Managed Instance 到 SQL Server 2025。
  • 若要建立連結或進行故障轉移 SQL 管理實例到 SQL Server 2022,您的 SQL 管理實例必須配置為 SQL Server 2022 更新策略。 資料複寫與故障移轉從 SQL Managed Instance 到 SQL Server 2022,若實例的更新政策配置不匹配,不支援。
  • 雖然您可以從支援版本的 SQL Server 建立連結到設定為 Always-up-to-date 更新策略的 SQL 受控執行個體,但在 SQL 受控執行個體發生故障轉移後,您將無法再複製資料或將服務恢復到您的 SQL Server 實例。

權限

SQL Server方面,你應該有 sysadmin 權限。

Azure SQL Managed Instance方面,你應該是 SQL Managed Instance 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 Managed Instance 名稱誤認為完全限定的網域名稱(FQDN)。 下表說明各種名稱確切代表的意思,以及如何取得其值:

詞彙 描述 如何查詢
初始主要項目 1 SQL Server 或 SQL Managed Instance 是你最初建立連結,將資料庫複製到次要副本的地方。
主要副本 當前承載主要資料庫的 SQL Server 或 SQL Managed Instance。
次要副本 接收來自目前主要複本的近即時複製資料的 SQL Server 或 SQL Managed Instance。
SQL Server 名稱 簡短、單字的 SQL Server 名稱。 例如:sqlserver1 從 T-SQL 執行 SELECT @@SERVERNAME
SQL Server FQDN SQL Server 的完全限定網域名稱(FQDN)。 例如:sqlserver1.domain.com 查看你本地的網路(DNS)設定,或者如果你使用Azure虛擬機(VM),請查看伺服器名稱。
SQL Managed Instance 名稱 短且為單一單字的 SQL Managed Instance 名稱。 例如:managedinstance1 在 Azure 入口網站查看你所管理實例的名稱。
SQL 托管實例完整域名 (FQDN) 你的 SQL Managed Instance 的完全限定網域名稱(FQDN)。 例如:managedinstance1.6d710bcf372b.database.windows.net 請參閱 Azure 入口網站中 SQL Managed Instance 概覽頁面上的主機名稱。
可解析的網域名稱 可解析為 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 Managed Instance 設定為初始主體是從 SQL Server 2022 CU10 開始。

設定資料庫復原和備份

如果 SQL Server 是你的初始主要伺服器,那麼透過連結複製的資料庫必須完整恢復模式,且至少有一個備份。 由於 Azure SQL Managed Instance 會自動備份,如果 SQL Managed Instance 是你的初始主要備份,可以跳過這一步。

當您建立連結時,主副本和次副本之間的初始化種子是透過完整備份主副本的資料庫,將其轉移到次副本,然後在次副本上還原該資料庫。 當您進行完整備份時,我們建議您使用 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

如需詳細資訊,請參閱建立完整資料庫備份

注意

此連結僅支援使用者資料庫的複寫。 不支援系統資料庫的複寫。 若要複寫執行個體層級物件 (儲存在 mastermsdb 資料庫中),建議您透過指令碼找出這些物件,並在目的地執行個體上執行 T-SQL 指令碼。

在執行個體之間建立信任

首先,您必須在兩個執行個體之間建立信任,並保護用來跨網路通訊和加密資料的端點。 分散式可用性群組會使用現有可用性群組的資料庫鏡像端點,而不是擁有自己的專用端點。 因此,必須透過可用性群組資料庫鏡像端點,在兩個執行個體之間設定安全性和信任。

注意

基於“Always On”可用性群組技術的連結。 資料庫鏡像端點是供可用性群組使用的特殊目的端點,用於接收來自其他伺服器執行個體的連線。 資料庫鏡像端點這個詞不應與舊有的 SQL Server 資料庫鏡像功能混淆。

憑證式信任是唯一支援保護 SQL Server 與 SQL Managed Instance 資料庫鏡像端點的方法。 如果你已有使用 Windows authentication 的可用性群組,你需要在現有的鏡像端點新增憑證信任作為次要認證選項。 如本文稍後所示,您可以使用 ALTER ENDPOINT 陳述式來完成這項作業。

重要

系統會產生具有到期日期和時間的憑證。 這些憑證必須在到期前更新並輪替。

以下列出保護 SQL Server 與 SQL Managed Instance 資料庫鏡像端點的流程概述:

  1. 在 SQL Server 上產生憑證並取得其公鑰。
  2. 取得 SQL Managed Instance 憑證的公開金鑰。
  3. 在 SQL Server 與 SQL Managed Instance 之間交換公鑰。
  4. 將 Azure 信任的根憑證授權機構的密鑰匯入 SQL Server

下列各節會詳細描述這些步驟。

在 SQL Server 建立憑證,並將其公鑰匯入 SQL Managed Instance

首先,如果 master 資料庫中還沒有資料庫主要金鑰,請建立一個。 在以下指令碼中插入您的密碼代替 <strong_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 = '<strong_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;

儲存輸出中的 SQLServerCertNameSQLServerPublicKey 值,因為您將在下一個步驟匯入憑證時需要這項資訊。

首先,確保你已登入 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 Managed Instance 取得憑證公鑰並匯入 SQL Server

保護連結端點的憑證會在 Azure SQL Managed Instance 自動產生。 從 SQL Managed Instance 取得憑證公鑰,並使用 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 Managed Instance FQDN,且不得被修改。 如果使用自訂名稱,連結將無法運作。

-- Run on SQL Server
USE MASTER
CREATE CERTIFICATE [<ManagedInstanceFQDN>]
FROM BINARY = <PublicKey> 

將 Azure 信任的根憑證授權機構的密鑰匯入 SQL Server

將您的 Azure 受信任根憑證授權機構(CA)金鑰匯入 SQL Server 是必須的,這樣 SQL Server 才能信任由 Azure 頒發的 SQL Managed Instance 公鑰憑證。

你可以從 Azure憑證授權機構詳情下載必要的根 CA 金鑰。 至少,下載DigiCert Global Root G2 以及 Microsoft RSA 根憑證授權機構 2017 憑證,並匯入到你的 SQL Server 實例。 不過,如果你打算讓這個連結持續超過幾個月,請下載並匯入 Root Certificate Authorities 區塊中列出的所有 7 張憑證,以避免 Azure 更新其受信任憑證清單時可能造成的干擾。

注意

SQL Managed Instance 公鑰憑證路徑中的根憑證是由 Azure 受信任的根憑證授權機構(CA)發出的。 隨著 Azure 更新其受信任的 CA 清單,特定的根 CA 可能會隨時間改變。 為了簡化設定,安裝在Azure根憑證授權機構中列出的所有根憑證。 你可以只安裝所需的 CA 金鑰,方法是識別先前匯入的 SQL Managed Instance 公鑰的發行者。

將憑證儲存在SQL Server實例本地,例如範例C:\Path\To\<name of certificate>.crt路徑,然後使用以下Transact-SQL腳本從該路徑匯入憑證。 將<name of certificate>替換為證書名稱,例如DigiCert Global Root G2Microsoft 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 加密。

更改現有的端點

注意

如果您剛建立新的鏡像端點,請略過此步驟。 只有當您使用現有的可用性群組以及現有的資料庫鏡像端點時,才採用此步驟。

如果您針對連結使用現有的可用性群組,或如果有現有的資料庫鏡像端點,請先驗證其符合連結的下列必要條件:

  • 類型必須是 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 Managed Instance。

同樣地,如果加密不包含 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 Managed Instance 連結。

在 SQL Server 建立可用性群組

如果你沒有現有的可用性群組,下一步就是在 SQL Server 上建立一個,不管哪個會是初始的主要伺服器。

注意

如果您已經有現有的可用性群組,請略過本節。

如果你的SQL Managed Instance是初始主節點,建立可用性群組的指令會不同,且該指令只支援從 SQL Server 2022 CU10 開始。

雖然可以為同一個資料庫建立多個連結,但連結只支援每個連結複寫一個資料庫。 如果你想為同一資料庫建立多個連結,請使用同一個可用群組,然後為 SQL Server 與 SQL Managed Instance 之間的每個資料庫連結建立新的分散式可用性群組。

如果 SQL Server 是你的初始主要伺服器,請建立一個包含以下參數的可用性群組作為連結:

  • 初始主要伺服器名稱
  • 資料庫名稱
  • MANUAL 的容錯移轉模式
  • AUTOMATIC 的播種模式

首先,透過執行以下 T-SQL 陳述式來找出你的 SQL Server 名稱:

-- Run on the initial primary
SELECT @@SERVERNAME AS SQLServerName 

接著,使用以下腳本在 SQL Server 上建立可用性群組。 取代:

  • <AGNameOnSQLServer>,並標示你SQL Server可用群組名稱。 Managed Instance 連結需要每個可用性群組擁有一個資料庫。 針對多個資料庫,您必須建立多個可用性群組。 請考慮命名每個可用性群組,使其名稱反映對應的資料庫 (例如 AG_<db_name>)。
  • <DatabaseName> 取代為您要複寫的資料庫名稱。
  • <SQLServerName> 並以您在上一個步驟取得的 SQL Server 實例名稱。
  • <SQLServerIP>,SQL Server IP 位址。 你可以使用可解析的 SQL Server 主機名稱作為替代方案,但必須確保該名稱能從 SQL Managed Instance 虛擬網路中解析。
-- 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 Managed Instance上可用群組名稱。 此名稱在 SQL MI 中必須是唯一的。 請考慮命名每個可用性群組,使其名稱反映對應的資料庫 (例如 AG_<db_name>_MI)。
  • 使用前一步驟取得的 SQL Server 的 IP 位址,替換 <SQLServerIP>。 你可以用可解析的 SQL Server 主機名稱作為替代,但請確保名稱能從 SQL Managed Instance 虛擬網路解析(這需要為受管理實例的子網設定自訂 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

驗證可用性群組

請使用以下腳本列出 SQL Server 實例上的所有可用性群組及分散式可用性群組。 此時,可用性群組的狀態必須是 connected,而分散式可用性群組的狀態必須是 disconnected。 分散式可用性群組的狀態只有在與 SQL Managed Instance 合併後才會移到 connected

-- 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 Object Explorer 來尋找可用性群組和分散式可用性群組。 展開 [Always On 高可用性] 資料夾,然後展開 [可用性群組] 資料夾。

最後,您可以建立連結。 命令會依據作為初始主伺服器的實例而有所不同。 請使用 New-AzSqlInstanceLinkPowerShell 或 az sql mi link create Azure CLI 指令來建立連結,例如本節的 PowerShell 範例。 目前 Azure CLI 不支援從 SQL Managed Instance 主節點建立連結。

如果你需要查看受管理實例上的所有連結,可以使用 Get-AzSqlInstanceLink PowerShell 命令或 az sql mi link show Azure CLI 命令在 Azure Cloud Shell 中執行。

為了簡化流程,請登入 Azure 入口網站,並從 Azure Cloud Shell 執行以下腳本。 取代:

  • 請將<ManagedInstanceName>替換為您的受控執行個體的簡短名稱。
  • <AGNameOnSQLServer>是SQL Server上建立的可用性群組名稱。
  • <AGNameOnSQLMI> 並以在 SQL Managed Instance 上建立的可用性群組的名稱命名。
  • <DAGName>的名稱是在 SQL Server 上建立的分散式可用性群組的名稱。
  • <DatabaseName>,資料庫已在 SQL Server 的可用性群組中進行複製。
  • <SQLServerIP> 並使用您的 SQL Server 的 IP 位址。 提供的 IP 位址必須可由受控執行個體存取。

注意

如果您想要建立已存在可用性群組的連結,請在提供 <SQLServerIP> 參數時提供接聽程式的 IP 位址。 請確保所有可用性群組節點與SQL Managed Instance間已建立信任(參見 建立實例間信任章節)。

#  Run in Azure Cloud Shell (select PowerShell console)
# =============================================================================
# POWERSHELL SCRIPT TO CREATE MANAGED INSTANCE LINK
# Instructs Managed Instance to join distributed availability group on SQL Server
# ===== Enter user variables here ====

# Enter your 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>"

# ==== Do not customize the following cmdlet ====

# Find out the resource group name
$ResourceGroup = (Get-AzSqlInstance -InstanceName $ManagedInstanceName).ResourceGroupName

# Build properly formatted connection endpoint
$SourceIP = "TCP://" + $SQLServerIP + ":<EndpointPort>"

# Create link on managed instance. Join distributed availability group on SQL Server.
New-AzSqlInstanceLink -ResourceGroupName $ResourceGroup -InstanceName $ManagedInstanceName -Name $DAGName |
-PartnerAvailabilityGroupName $AGNameOnSQLServer -InstanceAvailabilityGroupName $AGNameOnSQLMI |
-Database @($DatabaseName) -PartnerEndpoint $SourceIP -InstanceLinkRole Secondary

此作業的結果會是建立連結要求成功執行的時間戳記。

要驗證 SQL Managed Instance 與 SQL Server 之間的連結,請在 SQL Server 上執行以下查詢。 連接不會立即完成。 DMV 最多可能需要一分鐘的時間才會開始顯示成功的連線。 持續刷新 DMV,直到 SQL Managed Instance 副本的連線狀態顯示為「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 中的 Object Explorer 可能會在次要副本上以 Restoring 狀態顯示複製資料庫,因為初始種子階段會進行並還原資料庫的完整備份。 還原資料庫之後,複寫必須更新以讓兩個資料庫處於同步狀態。 初始植入完成之後,資料庫將不再處於 [還原中] 狀態。 初始化小型資料庫的速度可能會快到讓您無法在 SSMS 中看到[還原中]的初始狀態。

重要

  • 除非 SQL Server 與 SQL Managed Instance 之間有網路連線,否則連結無法運作。 若要針對網路連線進行疑難排解,請執行測試網路連線中的步驟。
  • 定期備份 SQL Server 上的日誌檔。 若使用日誌空間達到 100%,複製至 SQL Managed Instance 會停止,直到空間使用減少為止。 強烈建議您藉由設定每日作業來自動執行記錄備份。 如需詳細資訊,請參閱SQL Server 上的備份日誌檔案

進行第一個交易記錄備份

如果 SQL Server 是您的初始主要伺服器,重要的是在完成初始種子後,當資料庫不再在 Azure SQL 託管執行個體上處於修復中...狀態時,在 SQL Server 上執行第一次交易日誌備份。 接著定期備份 SQL Server 交易日誌,以減少在 SQL Server 擔任主要角色時日誌過度膨脹的風險。

如果 SQL Managed Instance 是你的主要備份,你不需要採取任何操作,因為 Azure SQL Managed Instance 會自動備份日誌。

如果您想卸除連結,可能是因為不再需要連結,或因為連結處於無法修復的狀態且需要重新建立連結,您可以使用 PowerShell 和 T-SQL 來執行此動作。

首先,使用 Remove-AzSqlInstanceLink PowerShell 命令卸除連結,類似以下範例:

Remove-AzSqlInstanceLink -ResourceGroupName $ResourceGroup -InstanceName $managedInstanceName -Name $DAGName -Force 

接著,在 SQL Server 上執行以下 T-SQL 腳本,移除分散式可用性群組。 使用分散式可用性群組 (用來建立連結的群組) 的名稱取代 <DAGName>

USE MASTER 
GO 

DROP AVAILABILITY GROUP <DAGName>  
GO 

最後,如果您不再使用可用性群組,您可以選擇移除它。 若執行此動作,請使用可用性群組的名稱取代 <AGName>,然後在相應執行個體上執行:

DROP AVAILABILITY GROUP <AGName>  
GO 

疑難排解

如果您在建立連結時遇到錯誤訊息,則請檢閱查詢輸出視窗中的錯誤訊息以取得詳細資訊。 如需更多資訊,請檢閱 並檢查連結的故障排除資訊。

若要使用連結:

若要進一步了解這個連結,請參閱以下內容:

針對其他複寫和移轉案例,請考慮: