チュートリアル:Azure SQL Managed Instance と SQL Server の間にトランザクション レプリケーションを構成する

適用対象:Azure SQL Managed Instance

トランザクション レプリケーションを使用すると、1 つのデータベースから SQL Server または Azure SQL Managed Instance でホストされている別のデータベースにデータをレプリケートできます。 SQL Managed Instance には、レプリケーション トポロジのパブリッシャー、ディストリビューター、またはサブスクライバーを指定できます。 使用可能な構成については、トランザクション レプリケーションの構成に関する記事をご覧ください。

このチュートリアルでは、以下の内容を学習します。

  • レプリケーション パブリッシャーとしてマネージド インスタンスを構成する。
  • レプリケーション ディストリビューターとしてマネージド インスタンスを構成する。
  • サブスクライバーとして SQL Server を構成する。

Replication between a managed instance publisher, managed instance distributor, and SQL Server subscriber

このチュートリアルは経験豊富なユーザーを対象としたもので、ユーザーは Azure でのマネージド インスタンスと SQL Server VM の両方のデプロイと接続について理解していることを前提としています。

Note

この記事では、Azure SQL Managed Instance でのトランザクション レプリケーションの使用方法について説明します。 これは、個々のインスタンスを完全に読み取れるレプリカを作成する Azure SQL Managed Instance の機能である、フェールオーバー グループとは無関係です。 フェールオーバー グループを使用してトランザクション レプリケーションを構成する場合は、追加の考慮事項があります。

前提条件

このチュートリアルを完了するには、前提条件として次のものが必要です。

  • Azure サブスクリプション
  • 同じ仮想ネットワーク内に 2 つのマネージド インスタンスをデプロイした経験。
  • オンプレミスまたは Azure VM 上の SQL Server サブスクライバー。 このチュートリアルでは Azure VM を使用します。
  • SQL Server Management Studio (SSMS) 18.0 以降
  • 最新バージョンの Azure PowerShell
  • ポート 445 および 1433 は、Azure ファイアウォールと Windows ファイアウォールの両方で SQL トラフィックを許可します。

リソース グループを作成する

次の PowerShell コード スニペットを使用して、新しいリソース グループを作成します。

# set variables
$ResourceGroupName = "SQLMI-Repl"
$Location = "East US 2"

# Create a new resource group
New-AzResourceGroup -Name  $ResourceGroupName -Location $Location

マネージド インスタンスを 2 つ作成する

Azure portal を使用して、この新しいリソース グループ内に 2 つのマネージド インスタンスを作成します。

  • パブリッシャー マネージド インスタンスの名前は sql-mi-publisher (およびランダム化のためのいくつかの文字) にして、仮想ネットワークの名前は vnet-sql-mi-publisher にする必要があります。

  • ディストリビューター マネージド インスタンスの名前は sql-mi-distributor (およびランダム化のためのいくつかの文字) にして、"パブリッシャー マネージド インスタンスと同じ仮想ネットワークに配置する" 必要があります。

    Use the publisher VNet for the distributor

マネージド インスタンスの作成の詳細については、ポータルでのマネージド インスタンスの作成に関するページを参照してください。

Note

わかりやすくするため、また最も一般的な構成であるため、このチュートリアルでは、ディストリビューター マネージド インスタンスをパブリッシャーと同じ仮想ネットワーク内に配置することを推奨しています。 ただし、別の仮想ネットワークにディストリビューターを作成することもできます。 そのためには、パブリッシャーとディストリビューターの仮想ネットワークの間に VNet ピアリングを構成してから、ディストリビューターとサブスクライバーの仮想ネットワークの間に VNet ピアリングを構成する必要があります。

SQL Server VM の作成

Azure portal を使用して SQL Server の仮想マシンを作成します。 SQL Server の仮想マシンは次のように設定する必要があります。

  • 名前: sql-vm-sub
  • イメージ: SQL Server 2016 以降
  • リソース グループ: マネージド インスタンスと同じ
  • 仮想ネットワーク: sql-vm-sub-vnet

Azure に SQL Server の VM をデプロイする方法について詳しくは、SQL Server VM の作成に関するページを参照してください。

VNet ピアリングの構成

VNet ピアリングを構成して、2 つのマネージド インスタンスの仮想ネットワークと SQL Server の仮想ネットワークの間の通信を有効にします。 これを行うには、次の PowerShell コード スニペットを使用します。

# Set variables
$SubscriptionId = '<SubscriptionID>'
$resourceGroup = 'SQLMI-Repl'
$pubvNet = 'sql-mi-publisher-vnet'
$subvNet = 'sql-vm-sub-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  

# Configure VNet peering from publisher to subscriber
Add-AzVirtualNetworkPeering `
  -Name $pubsubName `
  -VirtualNetwork $virtualNetwork1 `
  -RemoteVirtualNetworkId $virtualNetwork2.Id

# Configure VNet peering from subscriber to publisher
Add-AzVirtualNetworkPeering `
  -Name $subpubName `
  -VirtualNetwork $virtualNetwork2 `
  -RemoteVirtualNetworkId $virtualNetwork1.Id

# Check status of peering on the publisher VNet; should say connected
Get-AzVirtualNetworkPeering `
 -ResourceGroupName $resourceGroup `
 -VirtualNetworkName $pubvNet `
 | Select PeeringState

# Check status of peering on the subscriber VNet; should say connected
Get-AzVirtualNetworkPeering `
 -ResourceGroupName $resourceGroup `
 -VirtualNetworkName $subvNet `
 | Select PeeringState

VNet ピアリングを確立した後、SQL Server で SQL Server Management Studio (SSMS) を起動し、両方のマネージド インスタンスに接続して、接続をテストします。 SSMS を使用してマネージド インスタンスに接続する方法の詳細については、SSMS を使用した SQL Managed Instance への接続に関するページを参照してください。

Test connectivity to the managed instances

プライベート DNS ゾーンの作成

プライベート DNS ゾーンを使用すると、マネージド インスタンスと SQL Server の間の DNS ルーティングが可能になります。

プライベート DNS ゾーンの作成

  1. Azure Portal にサインインします。

  2. [リソースの作成] を選択して、新しい Azure リソースを作成します。

  3. Azure Marketplace で private dns zone を探します。

  4. Microsoft によって発行された [プライベート DNS ゾーン] リソースを選択し、 [作成] を選択して DNS ゾーンを作成します。

  5. ドロップダウンからサブスクリプションとリソース グループを選択します

  6. DNS ゾーンに任意の名前を指定します (例: repldns.com)。

    Create private DNS zone

  7. [Review + create](レビュー + 作成) を選択します。 プライベート DNS ゾーンのパラメーターを確認し、 [作成] を選択してリソースを作成します。

A レコードを作成する

  1. 新しいプライベート DNS ゾーンに移動して、 [概要] を選択します。

  2. [+ レコード セット] を選択して、新しい A レコードを作成します。

  3. SQL Server VM の名前と、プライベート内部 IP アドレスを指定します。

    Configure an A record

  4. [OK] を選択して A レコードを作成します。

  1. 新しいプライベート DNS ゾーンに移動して、 [仮想ネットワーク リンク] を選択します。

  2. [+ 追加] を選択します。

  3. リンクの名前を指定します (例: Pub-link)。

  4. ドロップダウンからサブスクリプションを選択し、パブリッシャー マネージド インスタンスの仮想ネットワークを選択します。

  5. [自動登録を有効にする] のチェック ボックスをオンにします。

    Create VNet link

  6. [OK] を選択して、仮想ネットワークをリンクします。

  7. 以上の手順を繰り返し、Sub-link のような名前でサブスクライバー仮想ネットワークのリンクを追加します。

Azure のストレージ アカウントの作成

作業ディレクトリ用に Azure ストレージ アカウントを作成し、そのストレージ アカウント内にファイル共有を作成します。

\\storage-account-name.file.core.windows.net\file-share-name の形式のファイル共有パスをコピーします。

例: \\replstorage.file.core.windows.net\replshare

次の形式でストレージ アクセス キーの接続文字列をコピーします: DefaultEndpointsProtocol=https;AccountName=<Storage-Account-Name>;AccountKey=****;EndpointSuffix=core.windows.net

例: DefaultEndpointsProtocol=https;AccountName=replstorage;AccountKey=dYT5hHZVu9aTgIteGfpYE64cfis0mpKTmmc8+EP53GxuRg6TCwe5eTYWrQM4AmQSG5lb3OBskhg==;EndpointSuffix=core.windows.net

詳細については、ストレージ アカウントのアクセス キーの管理に関するページを参照してください。

データベースを作成する

パブリッシャー マネージド インスタンス上に新しいデータベースを作成します。 これを行うには、次のステップに従います。

  1. SQL Server 上で SQL Server Management Studio を起動します。
  2. sql-mi-publisher マネージド インスタンスに接続します。
  3. [新しいクエリ] ウィンドウを開き、次の T-SQL クエリを実行してデータベースを作成します。
-- Create the databases
USE [master]
GO

-- Drop database if it exists
IF EXISTS (SELECT * FROM sys.sysdatabases WHERE name = 'ReplTutorial')
BEGIN
    DROP DATABASE ReplTutorial
END
GO

-- Create new database
CREATE DATABASE [ReplTutorial]
GO

-- Create table
USE [ReplTutorial]
GO
CREATE TABLE ReplTest (
   ID INT NOT NULL PRIMARY KEY,
   c1 VARCHAR(100) NOT NULL,
   dt1 DATETIME NOT NULL DEFAULT getdate()
)
GO

-- Populate table with data
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

ディストリビューションを構成する

接続を確立し、サンプル データベースを作成したら、sql-mi-distributor マネージド インスタンスでディストリビューションを構成できます。 これを行うには、次のステップに従います。

  1. SQL Server 上で SQL Server Management Studio を起動します。

  2. sql-mi-distributor マネージド インスタンスに接続します。

  3. [新しいクエリ] ウィンドウを開き、次の Transact-SQL コードを実行して、ディストリビューター マネージド インスタンス上にディストリビューションを構成します。

    EXEC sp_adddistributor @distributor = 'sql-mi-distributor.b6bf57.database.windows.net', @password = '<distributor_admin_password>'
    
    EXEC sp_adddistributiondb @database = N'distribution'
    
    EXEC sp_adddistpublisher @publisher = 'sql-mi-publisher.b6bf57.database.windows.net', -- primary publisher
         @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'<storage_connection_string>'
         -- example: @storage_connection_string = N'DefaultEndpointsProtocol=https;AccountName=replstorage;AccountKey=dYT5hHZVu9aTgIteGfpYE64cfis0mpKTmmc8+EP53GxuRg6TCwe5eTYWrQM4AmQSG5lb3OBskhg==;EndpointSuffix=core.windows.net'
    
    

    Note

    @working_directory パラメーターには、円記号 (\) のみを使用してください。 スラッシュ (/) を使用すると、ファイル共有への接続時にエラーが発生する可能性があります。

  4. sql-mi-publisher マネージド インスタンスに接続します。

  5. [新しいクエリ] ウィンドウを開き、次の Transact-SQL コードを実行して、パブリッシャーにディストリビューターを登録します。

    Use MASTER
    EXEC sys.sp_adddistributor @distributor = 'sql-mi-distributor.b6bf57.database.windows.net', @password = '<distributor_admin_password>'
    

パブリケーションの作成

ディストリビューションの構成が済むと、パブリケーションを作成できるようになります。 これを行うには、次のステップに従います。

  1. SQL Server 上で SQL Server Management Studio を起動します。

  2. sql-mi-publisher マネージド インスタンスに接続します。

  3. オブジェクト エクスプローラー[レプリケーション] ノードを展開し、 [ローカル パブリケーション] フォルダーを右クリックします。 [新しいパブリケーション...] を選択します。

  4. [次へ] を選択して、ようこそページの後まで移動します。

  5. [パブリケーション データベース] ページで、前に作成した ReplTutorial データベースを選択します。 [次へ] を選択します。

  6. [パブリケーションの種類] ページで、 [トランザクション パブリケーション] を選択します。 [次へ] を選択します。

  7. [アーティクル] ページで、 [テーブル] のチェック ボックスをオンにします。 [次へ] を選択します。

  8. [テーブル行のフィルター選択] ページで、フィルターを追加せずに [次へ] を選択します。

  9. [スナップショット エージェント] ページで、 [スナップショットをすぐに作成し、サブスクリプションを初期化できるようにそのスナップショットを保持する] のチェック ボックスをオンにします。 [次へ] を選択します。

  10. [エージェント セキュリティ] ページで、 [セキュリティの設定] を選択します。スナップショット エージェントに使用する SQL Server ログイン資格情報と、パブリッシャーに接続するための SQL Server ログイン資格情報を指定します。 [OK] を選択して、 [スナップショット エージェントのセキュリティ] ページを閉じます。 [次へ] を選択します。

    Configure Snapshot Agent security

  11. [ウィザードのアクション] ページで [パブリケーションを作成する] を選択し、後のためにこのスクリプトを保存する場合は [パブリケーションを作成するためのステップを含むスクリプト ファイルを生成する] を選択します (省略可能)。

  12. [ウィザードの完了] ページで、パブリケーションに ReplTest という名前を指定し、 [次へ] を選択してパブリケーションを作成します。

  13. パブリケーションが作成されたら、オブジェクト エクスプローラー[レプリケーション] ノードを更新し、 [ローカル パブリケーション] を展開して、新しいパブリケーションを確認します。

サブスクリプションを作成する

パブリケーションを作成した後は、サブスクリプションを作成できます。 これを行うには、次のステップに従います。

  1. SQL Server 上で SQL Server Management Studio を起動します。
  2. sql-mi-publisher マネージド インスタンスに接続します。
  3. [新しいクエリ] ウィンドウを開き、次の Transact-SQL コードを実行して、サブスクリプションとディストリビューション エージェントを追加します。 サブスクライバー名の一部として DNS を使用します。
use [ReplTutorial]
exec sp_addsubscription
@publication = N'ReplTest',
@subscriber = N'sql-vm-sub.repldns.com', -- include the DNS configured in the private DNS zone
@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-sub.repldns.com', -- include the DNS configured in the private DNS zone
@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

レプリケーションのテスト

レプリケーションが構成されたら、パブリッシャーに新しい項目を挿入し、変更がサブスクライバーに反映されることを確認することでテストできます。

次の T-SQL スニペットを実行してサブスクライバー上に行を表示します。

Use ReplSub
select * from dbo.ReplTest

次の T-SQL スニペットを実行してパブリッシャーに追加の行を挿入し、サブスクライバー上でその行をもう一度確認します。

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

リソースをクリーンアップする

  1. Azure Portal で、リソース グループに移動します。
  2. マネージド インスタンスを選び、 [削除] を選択します。 テキスト ボックスに「yes」と入力して、リソースを削除することを確認し、yes を選択します。 このプロセスは、バックグラウンドで完了するまでに時間がかかる場合があります。完了するまでは、"仮想クラスター" やその他の依存リソースを削除することはできません。 [アクティビティ] タブで削除を監視して、マネージド インスタンスが削除されたことを確認します。
  3. マネージド インスタンスが削除されたら、"仮想クラスター" を削除します。そのためには、リソース グループでそれを選び、 [削除] を選択します。 テキスト ボックスに「yes」と入力して、リソースを削除することを確認し、yes を選択します。
  4. 残りのリソースを削除します。 テキスト ボックスに「yes」と入力して、リソースを削除することを確認し、yes を選択します。
  5. リソース グループを削除するには、 [リソース グループの削除] を選択し、リソース グループの名前 (myResourceGroup) を入力して、 [削除] を選びます。

既知のエラー

Windows ログインはサポートされていません

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

エージェントは Windows ログインを使用して構成されており、代わりに SQL Server ログインを使用する必要があります。 ログイン資格情報を 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 replstorage で取得された Azure Storage 接続文字列 2019-11-19 02:21:05.07 Azure Files Storage '\replstorage.file.core.windows.net\replshare' に接続しています 2019-11-19 02:21:31.21 Azure Storage '' への接続に失敗しました。OS エラー: 53。

これは、おそらく、Azure Firewall と 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
  • これは、OS 55 エラーが発生する可能性があります: '\\replstorage.file.core.windows.net/replshare'

サブスクライバーに接続できませんでした

The process could not connect to Subscriber 'SQL-VM-SUB 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 以降にアップグレードしてみてください。

次のステップ

セキュリティ機能の有効化

データベースをセキュリティで保護する方法の包括的な一覧については、SQL Managed Instance の概要に関する記事を参照してください。 次のセキュリティ機能について説明しています。

SQL Managed Instance の機能

マネージド インスタンスの機能全体の概要については、以下を参照してください。