適用対象:Azure SQL Managed Instance
トランザクション レプリケーションを使用すると、1 つのデータベースから SQL Server または Azure SQL Managed Instance でホストされている別のデータベースにデータをレプリケートできます。 SQL Managed Instance は、レプリケーション トポロジのパブリッシャー、ディストリビューター、またはサブスクライバーにすることができます。 使用可能な構成については、トランザクション レプリケーションの構成に関する記事をご覧ください。
このチュートリアルでは、以下の内容を学習します。
- 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 トラフィックを許可します。
必要な名前とネットワーク設定
このチュートリアルでは、次のリソース名と設定を使用します。
| Resource | 名前 | 注記 |
|---|---|---|
| パブリッシャー SQL マネージド インスタンス | sql-mi-publisher |
一意性のためにランダムな文字を追加する |
| パブリッシャー仮想ネットワーク | vnet-sql-mi-publisher |
パブリッシャー インスタンスをホストします |
| ディストリビューター SQL マネージド インスタンス | sql-mi-distributor |
パブリッシャーと同じ VNet に存在する必要があります |
| SQL Server VM (サブスクライバー) | sql-vm-subscriber |
サポート可能性マトリックスごとにサポートされている SQL Server バージョンを使用する |
| サブスクライバー仮想ネットワーク | sql-vm-subscriber-vnet |
パブリッシャー VNet への VNet ピアリングが必要 |
| プライベート DNS ゾーン | repldns.com |
DNS ルーティングの任意の名前 |
| 必要なポート | 445 (SMB)、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
2 つの SQL マネージド インスタンスを作成する
Azure portal を使用して、この新しいリソース グループ内に 2 つの SQL マネージド インスタンスを作成します。
パブリッシャー SQL マネージド インスタンスの名前は
sql-mi-publisherし (ランダム化のために数文字)、仮想ネットワークの名前をvnet-sql-mi-publisherする必要があります。ディストリビューター SQL マネージド インスタンスの名前は
sql-mi-distributor(ランダム化用の数文字) にする必要があり、 パブリッシャー SQL マネージド インスタンスと同じ仮想ネットワーク内に存在する必要があります。
SQL マネージド インスタンスの作成の詳細については、「 クイック スタート: Azure SQL Managed Instance の作成」を参照してください。
Note
わかりやすくするために、このチュートリアルではパブリッシャーと同じ仮想ネットワークにディストリビューター SQL マネージド インスタンスを配置します。 ただし、適切な VNet ピアリングを使用して、別の仮想ネットワークにディストリビューターを作成できます。
SQL Server VM の作成
Azure portal を使用して SQL Server の仮想マシンを作成します。 SQL Server の仮想マシンは次のように設定する必要があります。
- 名前:
sql-vm-subscriber - 画像: Azure SQL Managed Instance でのトランザクション レプリケーションをサポートする SQL Server バージョン (サポート可能性マトリックスに従う)
- リソース グループ: SQL マネージド インスタンスと同じ
- 仮想ネットワーク:
sql-vm-subscriber-vnet
Azure への SQL Server VM のデプロイの詳細については、「 クイック スタート: Azure portal の Windows 仮想マシンに SQL Server を作成する」を参照してください。
VNet ピアリングの構成
2 つの SQL マネージド インスタンスの仮想ネットワークと SQL Server の仮想ネットワーク間の通信を有効にするように VNet ピアリングを構成します。
変数を設定します。
$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 Managed Instance に接続する」を参照してください。
プライベート DNS ゾーンの作成
プライベート DNS ゾーンでは、SQL マネージド インスタンスと SQL Server の間の DNS ルーティングが許可されます。
プライベート ゾーンを作成する
Azure Portal にサインインします。
[リソースの作成] を選択して、新しい Azure リソースを作成します。
Azure Marketplace で
private dns zoneを探します。Microsoft によって発行された プライベート DNS ゾーン リソースを選択し、[ 作成 ] を選択して DNS ゾーンを作成します。
ドロップダウン リストからサブスクリプションとリソース グループを選択します。
DNS ゾーンに任意の名前を指定します (例:
repldns.com)。[Review + create](レビュー + 作成) を選択します。 プライベート DNS ゾーンのパラメーターを確認し、[ 作成 ] を選択してリソースを作成します。
A レコードを作成する
新しいプライベート DNS ゾーンに移動して、 [概要] を選択します。
[+ レコード セット] を選択して、新しい A レコードを作成します。
SQL Server VM の名前と、プライベート内部 IP アドレスを指定します。
[OK] を選択して A レコードを作成します。
仮想ネットワークのリンク
新しいプライベート DNS ゾーンに移動して、 [仮想ネットワーク リンク] を選択します。
[+ 追加] を選択します。
リンクの名前を指定します (例:
Pub-link)。ドロップダウン リストからサブスクリプションを選択し、パブリッシャー SQL マネージド インスタンスの仮想ネットワークを選択します。
[自動登録を有効にする] のチェック ボックスをオンにします。
[OK] を選択して、仮想ネットワークをリンクします。
以上の手順を繰り返し、
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
Important
作業ディレクトリ パスには円記号 (\) のみを使用します。 フォワードスラッシュ (/) によって接続エラーが発生します。
このチュートリアルで使用する値の例:
| パラメーター | 値の例 |
|---|---|
| 作業ディレクトリ | \\replstorage.file.core.windows.net\replshare |
| 接続文字列 | DefaultEndpointsProtocol=https;AccountName=replstorage;AccountKey=123456789aBcDeFgHiJkLmNoPqRsTuVwXyZ==;EndpointSuffix=core.windows.net |
詳細については、ストレージ アカウントのアクセス キーの管理に関するページを参照してください。
データベースを作成する
パブリッシャー SQL マネージド インスタンスに新しいデータベースを作成します。 これを行うには、次のステップに従います。
- SQL Server 上で SQL Server Management Studio を起動します。
- パブリッシャー SQL マネージド インスタンス (
sql-mi-publisher) に接続します。 - [新しいクエリ] ウィンドウを開き、次の 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
予想される出力: ID が 2、3、4、5、6 の 5 行。
ディストリビューションを構成する
接続が確立され、サンプル データベースが作成されたら、ディストリビューター 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 |
ディストリビューター インスタンスを構成する
- SQL Server 上で SQL Server Management Studio を起動します。
- ディストリビューター SQL マネージド インスタンス (
sql-mi-distributor) に接続します。 - [新しいクエリ] ウィンドウを開き、次のコマンドを実行します。
ディストリビューターを追加します。
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';
Note
\ パラメーターには円記号 (@working_directory) のみを使用します。 フォワードスラッシュ (/) によって接続エラーが発生します。
パブリッシャーでディストリビューターを登録する
- パブリッシャー SQL マネージド インスタンス (
sql-mi-publisher) に接続します。 - [新しいクエリ] ウィンドウを開き、次のコマンドを実行してディストリビューターを登録します。
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;
パブリケーションの作成
ディストリビューションを構成したら、パブリケーションを作成できます。 これを行うには、次のステップに従います。
SQL Server 上で SQL Server Management Studio を起動します。
パブリッシャー SQL マネージド インスタンス (
sql-mi-publisher) に接続します。オブジェクト エクスプローラーで [レプリケーション] ノードを展開し、 [ローカル パブリケーション] フォルダーを右クリックします。 [新しいパブリケーション...] を選択します。
[次へ] を選択して、ようこそページの後まで移動します。
[パブリケーション データベース] ページで、前に作成した
ReplTutorialデータベースを選択します。 [次へ] を選択します。[パブリケーションの種類] ページで、 [トランザクション パブリケーション] を選択します。 [次へ] を選択します。
[アーティクル] ページで、 [テーブル] のチェック ボックスをオンにします。 [次へ] を選択します。
[テーブル行のフィルター選択] ページで、フィルターを追加せずに [次へ] を選択します。
[スナップショット エージェント] ページで、 [スナップショットをすぐに作成し、サブスクリプションを初期化できるようにそのスナップショットを保持する] のチェック ボックスをオンにします。 [次へ] を選択します。
[ エージェントのセキュリティ ] ページで、[ セキュリティ設定...] を選択します。スナップショット エージェントに使用し、パブリッシャーに接続するための SQL Server ログイン資格情報を指定します。 [OK] を選択して、 [スナップショット エージェントのセキュリティ] ページを閉じます。 [次へ] を選択します。
[ウィザードのアクション] ページで [パブリケーションを作成する] を選択し、後のためにこのスクリプトを保存する場合は [パブリケーションを作成するためのステップを含むスクリプト ファイルを生成する] を選択します (省略可能)。
[ ウィザードの完了 ] ページで、文書に
ReplTest名前を付け、[ 次へ ] を選択して文書を作成します。パブリケーションが作成されたら、オブジェクト エクスプローラーの [レプリケーション] ノードを更新し、 [ローカル パブリケーション] を展開して、新しいパブリケーションを確認します。
サブスクリプションを作成する
パブリケーションを作成した後は、サブスクリプションを作成できます。 これを行うには、次のステップに従います。
- SQL Server 上で SQL Server Management Studio を起動します。
- パブリッシャー SQL マネージド インスタンス (
sql-mi-publisher) に接続します。 - [新しいクエリ] ウィンドウを開き、次の 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;
予想される出力: ID が 2、3、4、5、6 の 5 行 (パブリッシャーからの初期データ)。
パブリッシャーに新しいデータを挿入する
パブリッシャー 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;
予期される出力: ID 15 と c1 値 'pub' を持つ 1 行。
リソースをクリーンアップする
- Azure Portal で、リソース グループに移動します。
- SQL マネージド インスタンスを選択し、[削除] を選択 します。 テキスト ボックスに「
yes」と入力して、リソースを削除することを確認し、[削除] を選択 します。 このプロセスはバックグラウンドで完了するまでに時間がかかる場合があり、完了するまで 、仮想クラスター やその他の依存リソースを削除することはできません。 [アクティビティ] タブの削除を監視して、SQL マネージド インスタンスが削除されたことを確認します。 - SQL マネージド インスタンスが削除されたら、リソース グループで 仮想クラスター を選択し、[削除] を選択して、仮想クラスターを 削除します。 テキスト ボックスに「
yes」と入力して、リソースを削除することを確認し、[削除] を選択 します。 - 残りのリソースを削除します。 テキスト ボックスに「
yes」と入力して、リソースを削除することを確認し、[削除] を選択 します。 - [リソース グループの削除] を選択し、 リソース グループ
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 以降にアップグレードしてみてください。