次の方法で共有


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

適用対象:Azure SQL Managed Instance

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

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

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

SQL マネージド インスタンス パブリッシャー、SQL マネージド インスタンス ディストリビューター、および SQL Server サブスクライバー間のレプリケーションを示す図

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

Note

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

前提条件

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

  • Azure サブスクリプション
  • 同じ仮想ネットワーク内に 2 つの SQL マネージド インスタンスをデプロイした経験。
  • オンプレミスまたは 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 つの SQL マネージド インスタンスを作成する

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

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

  • ディストリビューター SQL マネージド インスタンスの名前は sql-mi-distributor (ランダム化用の数文字) にする必要があり、 パブリッシャー SQL マネージド インスタンスと同じ仮想ネットワーク内に存在する必要があります。

    ディストリビューターのパブリッシャー VNet の使用を示すスクリーンショット。

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

Note

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

SQL Server VM の作成

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

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

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

VNet ピアリングの構成

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

# Set variables
$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

# 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) を起動し、両方の SQL マネージド インスタンスに接続することで、接続をテストします。 SSMS を使用した SQL マネージド インスタンスへの接続の詳細については、「 SSMS を使用して SQL Managed Instance に接続する」を参照してください。

SQL マネージド インスタンスへの接続をテストする方法を示すスクリーンショット。

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

プライベート DNS ゾーンでは、SQL マネージド インスタンスと SQL Server の間の DNS ルーティングが許可されます。

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

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

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

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

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

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

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

    Azure portal の [プライベート DNS ゾーンの作成] を示すスクリーンショット。

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

A レコードを作成する

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

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

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

    A レコードを構成する方法を示すスクリーンショット。

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

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

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

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

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

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

    VNet リンクを作成する方法を示すスクリーンショット。

  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=123456789aBcDeFgHiJkLmNoPqRsTuVwXyZ==;EndpointSuffix=core.windows.net

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

データベースを作成する

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

  1. SQL Server 上で SQL Server Management Studio を起動します。
  2. パブリッシャー SQL マネージド インスタンス (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 マネージド インスタンス (sql-mi-distributor) でディストリビューションを構成できます。 これを行うには、次のステップに従います。

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

  2. ディストリビューター SQL マネージド インスタンス (sql-mi-distributor) に接続します。

  3. [新しいクエリ] ウィンドウを開き、次の Transact-SQL コードを実行して、ディストリビューター 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=123456789aBcDeFgHiJkLmNoPqRsTuVwXyZ==;EndpointSuffix=core.windows.net'
    

    Note

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

  4. パブリッシャー SQL マネージド インスタンス (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 マネージド インスタンス (sql-mi-publisher) に接続します。

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

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

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

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

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

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

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

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

    スナップショット エージェントのセキュリティを構成する方法を示すスクリーンショット。

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

  12. [ ウィザードの完了 ] ページで、文書に ReplTest名前を付け、[ 次へ ] を選択して文書を作成します。

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

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

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

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

これは、ポート 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
  • これは、OS 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 以降にアップグレードしてみてください。