教學:配置 Azure SQL Managed Instance 與 SQL Server 之間的交易複製

適用於:Azure SQL Managed Instance

交易複製允許你將資料從一個資料庫複製到另一個托管在 SQL Server 或 Azure SQL Managed Instance 上的資料庫。 SQL Managed Instance 可以是複製拓撲中的發佈者、分發者或訂閱者。 如需可用設定的相關資訊,請參閱異動複寫設定

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

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

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

本教學針對有經驗的觀眾設計,假設使用者熟悉部署及連接 Azure 內 SQL 管理實例與 SQL Server 虛擬機。

註解

本文說明交易複製在Azure SQL Managed Instance中的應用。 這和故障轉移群組無關,後者是一個Azure SQL Managed Instance功能,可以讓你建立完整且可讀的個別實例副本。 在設定與容錯移轉群組相關的異動複寫時,還需考慮其他事項。

必要條件

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

必要名稱與網路設定

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

Resource 名稱 註釋
Publisher SQL 管理實例 sql-mi-publisher 附加隨機字元以增加獨特性
Publisher 虛擬網路 vnet-sql-mi-publisher 託管出版商實例
Distributor SQL 受控執行個體 sql-mi-distributor 必須與發行商位於同一個 VNet 內
SQL Server 虛擬機(訂閱者) sql-vm-subscriber 依照支援性矩陣使用支援的 SQL Server 版本
用戶虛擬網路 sql-vm-subscriber-vnet 需要將 VNet 與發佈者 VNet 進行對等連接
Private DNS 區域 repldns.com DNS 路由的任意名稱
所需連接埠 445(中小企業)、1433(SQL) 必須在 Azure Firewall 和 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 portal 建立兩個 SQL 管理的實例。

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

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

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

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

註解

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

建立一個 SQL Server 虛擬機

使用 Azure portal 建立一台SQL Server虛擬機。 SQL Server 虛擬機器應具備以下特性:

  • 名稱:sql-vm-subscriber
  • 圖片:依據支援性矩陣,SQL Server 的版本支援進行與 Azure SQL Managed Instance 的交易複製。
  • 資源群組:與 SQL 受控執行個體相同
  • 虛擬網路:sql-vm-subscriber-vnet

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

設定 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 managed instance的資訊,請參見 使用 SSMS 連接至 SQL Managed Instance

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

建立私人 DNS 區域

私有 DNS 區域允許 SQL 管理的實例與 SQL Server 之間進行 DNS 路由。

建立私人區域

  1. 請登入Azure入口

  2. 選擇 Create a resource 以建立新的 Azure 資源。

  3. 在Azure Marketplace上搜尋private dns zone

  4. 選擇由 Microsoft 發布的 Private DNS zone 資源,然後選擇 Create 來建立 DNS 區域。

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

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

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

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

建立 A 記錄

  1. 前往你的新 Private DNS 區域,選擇 Overview

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

  3. 提供你的 SQL Server 虛擬機名稱以及私有內部 IP 位址。

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

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

  1. 前往你的新 Private DNS zone,選擇 Virtual network links

  2. 選取 + 新增

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

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

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

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

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

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

建立一個 Azure 儲存帳戶

為工作目錄建立一個Azure儲存帳號,然後在儲存帳號內建立檔案共享

儲存配置值

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

  • 工作目錄路徑格式\\<storage-account-name>.file.core.windows.net\<file-share-name>
  • Storage connection string formatDefaultEndpointsProtocol=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
Publisher DNS 名稱 發佈者實例的 FQDN sql-mi-publisher.b6bf57.database.windows.net
@working_directory Azure Files share path (只使用反斜線) \\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. Object Explorer 中,展開 Replication 節點,右鍵點擊 Local Publication 資料夾。 選取 [新增出版物...]。

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

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

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

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

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

  9. Snapshot Agent 頁面,立即勾選 Create snapshot 旁邊的方塊,並保持快照可用以初始化訂閱。 選取 [下一步] 。

  10. Agent Security 頁面,選擇 Security Settings...。提供 SQL Server 登入憑證,用於 Snapshot Agent 並連接發佈者。 選擇 OK 以關閉 Snapshot Agent Security 頁面。 選取 [下一步] 。

    截圖示範如何設定 Snapshot Agent 的安全性。

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

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

  13. 一旦您的出版物建立完成,請刷新Object Explorer中的Replication節點,並展開Local Publications以查看您的新出版物。

建立訂用帳戶

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

  1. 在 SQL Server 上啟動 SQL Server Management Studio。
  2. 連線到發行者 SQL 管理的實例 (sql-mi-publisher)。
  3. 開啟一個 New Query 視窗,執行以下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 portal 中前往你的資源群組。
  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 登入。 請使用 Publication propertiesAgent Security 頁面,將登入憑證改為 SQL Server 登入。

無法連接到 Azure Storage

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.

這很可能是因為 Azure 防火牆、Windows 防火牆或兩者的 445 埠都關閉了。

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 或更新版本,以排除這個問題的根本原因。