共用方式為


教程:設定 Azure SQL 受控執行個體與 SQL Server 之間的事務性複寫

適用於:Azure SQL 受控執行個體

異動複寫可讓您將資料從某個資料庫複寫至裝載於 SQL Server 或 Azure SQL 受控執行個體上的另一個資料庫。 SQL 受控執行個體可以是複寫拓撲中的發行者、散發者或訂閱者。 如需可用設定的相關資訊,請參閱異動複寫設定

在本教學課程中,您會了解如何:

  • 將 SQL 受控執行個體設定為複寫發行者。
  • 將 SQL 受控執行個體設定為複寫散發者。
  • 將 SQL Server 設定為訂閱者。

顯示 SQL 管理實例發布者、SQL 實例管理分發者與 SQL Server 訂閱者之間的複寫圖。

本教學課程適用於有經驗的物件,並假設使用者熟悉在 Azure 內部署和連線到 SQL 受控執行個體和 SQL Server VM。

註解

本文說明如何在 Azure SQL 受控執行個體中使用異動複寫。 它與 容錯移轉群組無關,容錯移轉群組是一項 Azure SQL 受控執行個體功能,可讓您建立個別執行個體的完整可讀取複本。 在設定與容錯移轉群組相關的異動複寫時,還需考慮其他事項。

必要條件

若要完成本教學課程,請確定您具有下列必要條件:

必要名稱與網路設定

本教學使用以下資源名稱與設定:

Resource 名稱 註釋
發佈者 SQL 管理實例 sql-mi-publisher 附加隨機字元以增加獨特性
出版商虛擬網路 vnet-sql-mi-publisher 託管出版商實例
Distributor SQL 受控執行個體 sql-mi-distributor 必須與發行商位於同一個 VNet 內
SQL Server VM(訂閱者) sql-vm-subscriber 依照可支援性矩陣使用支援的 SQL Server 版本
用戶虛擬網路 sql-vm-subscriber-vnet 需要將 VNet 與發佈者 VNet 進行對等連接
私人 DNS 區域 repldns.com DNS 路由的任意名稱
所需連接埠 445(中小企業)、1433(SQL) 必須在 Azure 防火牆和 Windows 防火牆上開啟

建立資源群組

請使用以下 PowerShell 程式碼片段來建立一個新的資源群組。

設定你的變數:

$ResourceGroupName = "SQLMI-Repl"
$Location = "East US 2"

建立資源小組:

New-AzResourceGroup -Name $ResourceGroupName -Location $Location

確認資源群組已被建立:

Get-AzResourceGroup -Name $ResourceGroupName | Select-Object ResourceGroupName, Location

建立兩個 SQL 受控執行個體

使用 Azure 入口網站,在此新的資源群組內建立兩個 SQL 受控執行個體。

  • 發行者 SQL 受控執行個體的名稱應該是 sql-mi-publisher (以及一些用於隨機化的字元),而虛擬網路的名稱應該是 vnet-sql-mi-publisher

  • 散發者 SQL 受控執行個體的名稱應該是 sql-mi-distributor (以及一些用於隨機化的字元),而且它應該與 發行者 SQL 受控執行個體位於相同的虛擬網路中

    截圖顯示 VNet 作為分發者使用的情況。

欲了解更多關於建立 SQL 管理實例的資訊,請參閱 快速入門:建立 Azure SQL 受管理實例

註解

為了簡化起見,這個教學將分發商 SQL 管理的實例置於與發佈者相同的虛擬網路中。 不過,你可以在另一個虛擬網路中建立分發器,並搭配適當的 VNet 對等連線。

建立 SQL Server VM

使用 Azure 入口網站建立 SQL Server 虛擬機器。 SQL Server 虛擬機器應具有下列特性:

  • 名稱:sql-vm-subscriber
  • 圖片:根據支援性矩陣,支援使用 Azure SQL 管理執行個體的事務性複寫的 SQL Server 版本
  • 資源群組:與 SQL 受控執行個體相同
  • 虛擬網路:sql-vm-subscriber-vnet

欲了解更多關於部署 SQL Server VM 至 Azure 的資訊,請參閱 Azure 入口網站中的快速入門:在 Windows 虛擬機上建立 SQL Server

設定 VNet 對等互連

設定 VNet 對等互連,以啟用兩個 SQL 受控執行個體的虛擬網路與 SQL Server 的虛擬網路之間的通訊。

設定你的變數:

$SubscriptionId = '<SubscriptionID>'
$resourceGroup = 'SQLMI-Repl'
$pubvNet = 'sql-mi-publisher-vnet'
$subvNet = 'sql-vm-subscriber-vnet'
$pubsubName = 'Pub-to-Sub-Peer'
$subpubName = 'Sub-to-Pub-Peer'

擷取虛擬網路:

$virtualNetwork1 = Get-AzVirtualNetwork -ResourceGroupName $resourceGroup -Name $pubvNet
$virtualNetwork2 = Get-AzVirtualNetwork -ResourceGroupName $resourceGroup -Name $subvNet

設定從發佈者到訂閱者的 VNet 對等互連:

Add-AzVirtualNetworkPeering `
  -Name $pubsubName `
  -VirtualNetwork $virtualNetwork1 `
  -RemoteVirtualNetworkId $virtualNetwork2.Id

設定從訂閱者到發布者的 VNet 對等連線:

Add-AzVirtualNetworkPeering `
  -Name $subpubName `
  -VirtualNetwork $virtualNetwork2 `
  -RemoteVirtualNetworkId $virtualNetwork1.Id

確認發佈商 VNet 的對等狀態(應該會回傳 Connected):

Get-AzVirtualNetworkPeering -ResourceGroupName $resourceGroup -VirtualNetworkName $pubvNet | Select-Object PeeringState

確認用戶 VNet 的對等連線狀態(應該回傳 Connected):

Get-AzVirtualNetworkPeering -ResourceGroupName $resourceGroup -VirtualNetworkName $subvNet | Select-Object PeeringState

建立 VNet 對等互連之後,請在 SQL Server 主機上啟動 SQL Server Management Studio (SSMS) 並連線到這兩個 SQL 受控執行個體,以測試連線能力。 如需使用 SSMS 連線到 SQL 受控執行個體的詳細資訊,請參閱 使用 SSMS 連線到 SQL 受控執行個體

截圖顯示如何測試與 SQL 管理實例的連線。

建立私人 DNS 區域

私人 DNS 區域允許在 SQL 受控執行個體與 SQL Server 之間進行 DNS 路由。

建立私人區域

  1. 登入 Azure 入口網站

  2. 選取 [建立資源] 以建立 Azure 資源。

  3. 在 Azure Marketplace 上搜尋 private dns zone

  4. 選擇 Microsoft 發佈的 私人 DNS 區域 資源,然後選取 [ 建立] 以建立 DNS 區域。

  5. 從下拉式清單中選擇訂用帳戶和資源群組。

  6. 為 DNS 區域提供任意名稱,例如 repldns.com

    截圖顯示 Azure 入口網站中建立私有 DNS 區域。

  7. 選取 [檢閱 + 建立]。 檢閱私人 DNS 區域的參數,然後選取 [ 建立 ] 以建立您的資源。

建立 A 記錄

  1. 移至新的私人 DNS 區域,然後選取 [概觀]。

  2. 選擇 + 記錄集 以建立新的 A 記錄。

  3. 提供 SQL Server VM 的名稱,以及私人內部 IP 位址。

    截圖顯示如何設定 A 紀錄。

  4. 選取 [確定] 以建立 A 記錄。

  1. 移至新的私人 DNS 區域,然後選取 [虛擬網路連結]。

  2. 選取 + 新增

  3. 提供連結的名稱,例如 Pub-link

  4. 從下拉式清單中選取您的訂用帳戶,然後選取發行者 SQL 受控執行個體的虛擬網路。

  5. 核取 [啟用自動註冊] 旁的方塊。

    截圖示範如何建立 VNet 連結。

  6. 選取 [確定] 以連結您的虛擬網路。

  7. 重複上述步驟,為訂閱者虛擬網路新增連結 (具有 Sub-link 之類的名稱)。

建立 Azure 儲存體帳戶

為工作目錄建立 Azure 儲存體帳戶,然後在儲存體帳戶內建立檔案共用

儲存配置值

在設定分配時,你需要以下數值:

  • 工作目錄路徑格式\\<storage-account-name>.file.core.windows.net\<file-share-name>
  • 儲存連接字串格式DefaultEndpointsProtocol=https;AccountName=<Storage-Account-Name>;AccountKey=<key>;EndpointSuffix=core.windows.net

這很重要

工作目錄路徑中只使用反斜線(\)。 前斜線(/)會導致連接錯誤。

本教學中使用的範例數值

參數 範例值
工作目錄 \\replstorage.file.core.windows.net\replshare
連線字串 DefaultEndpointsProtocol=https;AccountName=replstorage;AccountKey=123456789aBcDeFgHiJkLmNoPqRsTuVwXyZ==;EndpointSuffix=core.windows.net

如需詳細資訊,請參閱管理儲存體帳戶存取金鑰

建立資料庫

在發行者 SQL 受控執行個體上建立新的資料庫。 若要這樣做,請依照下列步驟執行:

  1. 啟動 SQL Server 上的 SQL Server Management Studio。
  2. 連線到發行者 SQL 受控執行個體 (sql-mi-publisher)。
  3. 開啟 新查詢 視窗,並執行以下 T-SQL 查詢。

如果資料庫存在,請刪除,並建立一個新的資料庫:

USE [master];
GO

IF EXISTS (SELECT * FROM sys.sysdatabases WHERE name = 'ReplTutorial')
BEGIN
    DROP DATABASE ReplTutorial;
END
GO

CREATE DATABASE [ReplTutorial];
GO

建立複製測試表:

USE [ReplTutorial];
GO

CREATE TABLE ReplTest (
   ID INT NOT NULL PRIMARY KEY,
   c1 VARCHAR(100) NOT NULL,
   dt1 DATETIME NOT NULL DEFAULT getdate()
);
GO

插入範例資料:

USE [ReplTutorial];
GO

INSERT INTO ReplTest (ID, c1) VALUES (6, 'pub');
INSERT INTO ReplTest (ID, c1) VALUES (2, 'pub');
INSERT INTO ReplTest (ID, c1) VALUES (3, 'pub');
INSERT INTO ReplTest (ID, c1) VALUES (4, 'pub');
INSERT INTO ReplTest (ID, c1) VALUES (5, 'pub');
GO

確認資料是否已插入:

SELECT * FROM ReplTest;
GO

預期輸出:5 列,ID 為 2、3、4、5 和 6。

設定分佈

建立連線能力且您有範例資料庫之後,您可以在散發者 SQL 受控執行個體 ()sql-mi-distributor 上設定散發。

分配配置參數

在設定分配前,請收集以下數值:

參數 Description Example
分發商 DNS 名稱 分發器實例的 FQDN sql-mi-distributor.b6bf57.database.windows.net
發佈者 DNS 名稱 發佈者實例的 FQDN sql-mi-publisher.b6bf57.database.windows.net
@working_directory Azure Files 共享路徑(僅使用反斜線) \\replstorage.file.core.windows.net\replshare
@storage_connection_string 儲存帳戶連線字串 DefaultEndpointsProtocol=https;AccountName=replstorage;...
@security_mode 認證模式(0 = SQL 認證) 0
@login / @password SQL 登入憑證 azureuser

設定分發器實例

  1. 啟動 SQL Server 上的 SQL Server Management Studio。
  2. 連線到散發者 SQL 受控執行個體 (sql-mi-distributor)。
  3. 開啟 新查詢 視窗並執行以下指令。

新增分銷商:

EXECUTE sp_adddistributor
    @distributor = 'sql-mi-distributor.b6bf57.database.windows.net',
    @password = '<distributor_admin_password>';

建立分配資料庫:

EXECUTE sp_adddistributiondb @database = N'distribution';

確認分銷資料庫的建立:

SELECT name FROM sys.databases WHERE name = 'distribution';

將出版商加入經銷商:

EXECUTE sp_adddistpublisher
    @publisher = 'sql-mi-publisher.b6bf57.database.windows.net',
    @distribution_db = N'distribution',
    @security_mode = 0,
    @login = N'azureuser',
    @password = N'<publisher_password>',
    @working_directory = N'\\replstorage.file.core.windows.net\replshare',
    @storage_connection_string = N'DefaultEndpointsProtocol=https;AccountName=replstorage;AccountKey=123456789aBcDeFgHiJkLmNoPqRsTuVwXyZ==;EndpointSuffix=core.windows.net';

註解

參數只使用反斜線(\@working_directory 表示。 前斜線(/)會導致連接錯誤。

在出版商處註冊發行商

  1. 連線到發行者 SQL 受控執行個體 (sql-mi-publisher)。
  2. 開啟 一個新查詢 視窗,並執行以下指令來註冊發行商:
USE master;
GO

EXECUTE sys.sp_adddistributor
    @distributor = 'sql-mi-distributor.b6bf57.database.windows.net',
    @password = '<distributor_admin_password>';

確認經銷商是否已註冊:

SELECT * FROM sys.servers WHERE is_distributor = 1;

建立出版品

設定發佈之後,您可以建立發佈。 若要這樣做,請依照下列步驟執行:

  1. 啟動 SQL Server 上的 SQL Server Management Studio。

  2. 連線到發行者 SQL 受控執行個體 (sql-mi-publisher)。

  3. 在 [物件總管] 中展開 [複寫] 節點,然後以滑鼠右鍵按一下 [本機發行集] 資料夾。 選取 [新增出版物...]。

  4. 選取 [下一步],移出歡迎頁面。

  5. 在 [出版物資料庫] 頁面上,選取您先前建立的 資料庫。 選取 [下一步] 。

  6. 在 [發行集類型] 頁面中,選取 [交易式發行集]。 選取 [下一步] 。

  7. 在 [文章] 頁面上,勾選 [表格] 旁的方塊。 選取 [下一步] 。

  8. 在 [篩選資料表的資料列] 頁面上選取 [下一步],而不新增任何篩選。

  9. 在 [快照集代理程式] 頁面上,核取 [立即建立快照集,並保留快照集為可使用狀態,以初始化訂閱] 旁的方塊。 選取 [下一步] 。

  10. 代理程式安全性 頁面上,選取 安全性設定...。提供 SQL Server 登入認證,以用於快照集代理程式,並連線到發行者。 選取 [確定],以關閉 [快照集代理程式安全性] 頁面。 選取 [下一步] 。

    截圖顯示如何設定快照代理的安全。

  11. 在 [精靈動作] 頁面上,選擇 [建立發行集],並 (選擇性地) 選擇 [產生具建立發行集步驟的指令碼檔案] (如果您想要儲存此指令碼以供後續使用的話)。

  12. [ 完成精靈 ] 頁面上,為您的出版物 ReplTest命名 ,然後選取 [ 下一步 ] 以建立您的出版物。

  13. 發行集建立後,請在 [物件總管] 中重新整理 [複寫] 節點,然後展開 [本機發行集] 以查看新的發行集。

建立訂用帳戶

出版物建立後,您可以建立訂閱。 若要這樣做,請依照下列步驟執行:

  1. 啟動 SQL Server 上的 SQL Server Management Studio。
  2. 連線到發行者 SQL 受控執行個體 (sql-mi-publisher)。
  3. 開啟 一個新查詢 視窗,執行以下 Transact-SQL 指令。 使用在私有 DNS 區域中配置的 DNS 名稱作為訂閱者名稱的一部分。

訂閱參數

參數 價值觀 Description
@subscriber sql-vm-subscriber.repldns.com 用戶 DNS 名稱(來自私有 DNS 區域)
@destination_db ReplSub 訂閱者的資料庫
@subscription_type Push 發行商向訂戶推送變更
@sync_type automatic 自動初始同步

新增訂閱:

USE [ReplTutorial];
GO

EXEC sp_addsubscription
    @publication = N'ReplTest',
    @subscriber = N'sql-vm-subscriber.repldns.com',
    @destination_db = N'ReplSub',
    @subscription_type = N'Push',
    @sync_type = N'automatic',
    @article = N'all',
    @update_mode = N'read only',
    @subscriber_type = 0;

新增推送訂閱代理:

EXEC sp_addpushsubscription_agent
    @publication = N'ReplTest',
    @subscriber = N'sql-vm-subscriber.repldns.com',
    @subscriber_db = N'ReplSub',
    @job_login = N'azureuser',
    @job_password = '<Complex Password>',
    @subscriber_security_mode = 0,
    @subscriber_login = N'azureuser',
    @subscriber_password = '<Complex Password>',
    @dts_package_location = N'Distributor';
GO

確認訂閱是被創建的:

SELECT * FROM distribution.dbo.MSsubscriptions;

測試複寫

設定複寫後,您可以在發行者上插入新項目,觀察這些變更如何傳播到訂閱者,以便測試複寫。

查看訂閱者的初始資料

連接到 SQL Server 訂閱者並執行以下查詢:

USE ReplSub;
GO

SELECT * FROM dbo.ReplTest;

預期輸出:5 列,ID 為 2、3、4、5 和 6(發布者初始資料)。

新增出版商資料

連接到發佈者 SQL 管理的實例(sql-mi-publisher),並插入新一列:

USE ReplTutorial;
GO

INSERT INTO ReplTest (ID, c1) VALUES (15, 'pub');

請在出版商上確認內頁:

SELECT * FROM ReplTest WHERE ID = 15;

驗證訂閱者的資料同步

幾分鐘後,連接用戶並確認新列已複製:

USE ReplSub;
GO

SELECT * FROM dbo.ReplTest WHERE ID = 15;

預期輸出:1列,ID 15,c1 值為 'pub'。

清除資源

  1. 瀏覽至 Azure 入口網站中的資源群組。
  2. 選取 SQL 受控執行個體,然後選取 [刪除]。 在文字方塊中輸入 yes 以確認您要刪除資源,然後選取 [刪除]。 此程序可能需要一些時間才能在背景完成,在完成之前,您將無法刪除 虛擬叢集 或任何其他相依資源。 監視 [活動] 索引標籤中的刪除,以確認您的 SQL 受控執行個體已刪除。
  3. 刪除 SQL 受控執行個體之後,請在資源群組中選取 虛擬叢集 ,然後選擇 [刪除] 來刪除虛擬叢集。 在文字方塊中輸入 yes 以確認您要刪除資源,然後選取 [刪除]。
  4. 刪除任何剩餘的資源。 在文字方塊中輸入 yes 以確認您要刪除資源,然後選取 [刪除]。
  5. 選取 [刪除資源群組],輸入資源群組 myResourceGroup的名稱,然後選取 [刪除],以刪除資源群組。

已知錯誤

不支援 Windows 登入

Exception Message: Windows logins are not supported in this version of SQL Server.

代理程式已設定了 Windows 登入,必須改為使用 SQL Server 登入。 請使用發行集屬性的 [代理程式安全性] 頁面,將登入認證變更為 SQL Server 登入。

無法連線至 Azure 儲存體

Connecting to Azure Files Storage '\\replstorage.file.core.windows.net\replshare' Failed to connect to Azure Storage '' with OS error: 53.
2019-11-19 02:21:05.07 Obtained Azure Storage Connection String for replstorage
2019-11-19 02:21:05.07 Connecting to Azure Files Storage '\\replstorage.file.core.windows.net\replshare'
2019-11-19 02:21:31.21 Failed to connect to Azure Storage '' with OS error: 53.

這可能是因為埠 445 在 Azure 防火牆、Windows 防火牆或兩者中關閉。

Connecting to Azure Files Storage '\\replstorage.file.core.windows.net\replshare' Failed to connect to Azure Storage '' with OS error: 55.

在檔案共用的檔案路徑中使用正斜線而不是反斜線也可能導致此錯誤。

  • 這是可以接受的: \\replstorage.file.core.windows.net\replshare
  • 這可能會導致作業系統 55 錯誤:\\replstorage.file.core.windows.net/replshare

無法連線至訂閱者

The process could not connect to Subscriber 'SQL-VM-SUBSCRIBER
Could not open a connection to SQL Server [53].
A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections.

可能的解決方案:

  • 確定連接埠 1433 已開啟。
  • 確定已在訂閱者上啟用 TCP/IP。
  • 確認建立訂閱者時使用了 DNS 名稱。
  • 確認您的虛擬網路已在私人 DNS 區域中正確連結。
  • 請確認您的 A 記錄已正確設定。
  • 確認您的 VNet 對等互連已正確設定。

沒有可供訂閱的出版物

當您使用 [ 新增訂閱 ] 精靈新增訂用帳戶時,在 [發行集] 頁面上,您可能會發現沒有列為可用選項的資料庫和發行集,而且您可能會看到下列錯誤訊息:

There are no publications to which you can subscribe, either because this server has no publications or because you do not have sufficient privileges to access the publications.

雖然此錯誤訊息可能是正確的,而且您連線的發行者上確實沒有可用的發行集,或您缺少足夠的許可權,但舊版的 SQL Server Management Studio 也可能導致此錯誤。 請嘗試升級至 SQL Server Management Studio 18.0 或更新版本,以排除此根本原因。