適用対象:Azure SQL Managed Instance
トランザクション レプリケーションを使用すると、SQL Server または Azure SQL Managed Instance でホストされている別のデータベースにデータをレプリケートできます。 SQL Managed Instanceは、レプリケーション トポロジのパブリッシャー、ディストリビューター、またはサブスクライバーにすることができます。 使用可能な構成については、トランザクション レプリケーションの構成に関する記事をご覧ください。
このチュートリアルでは、以下の内容を学習します。
- SQL マネージド インスタンスをレプリケーション パブリッシャーとして構成します。
- SQL マネージド インスタンスをレプリケーション ディストリビューターとして構成します。
- サブスクライバーとしてSQL Serverを構成します。
&c1&c0&sb0 SQL マネージド インスタンス パブリッシャー、SQL マネージド インスタンス ディストリビューター、および SQL Server サブスクライバーの間のレプリケーションを示す図 </sb0></c0></c1>
このチュートリアルは、経験豊富な対象ユーザーを対象としており、ユーザーは SQL マネージド インスタンスと SQL Server VM の両方を Azure 内にデプロイして接続することに慣れているものとします。
注意
この記事では、Azure SQL Managed Instanceでの transactional replication の使用について説明します。 failover グループとは関係ありません。これは、個々のインスタンスの完全な読み取り可能なレプリカを作成できる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 | 名前 | 注記 |
|---|---|---|
| Publisher SQLマネージドインスタンス | sql-mi-publisher |
一意性のためにランダムな文字を追加する |
| Publisher仮想ネットワーク | vnet-sql-mi-publisher |
パブリッシャー インスタンスをホストします |
| ディストリビューター SQL マネージド インスタンス | sql-mi-distributor |
パブリッシャーと同じ VNet に存在する必要があります |
| SQL SERVER VM (サブスクライバー) | sql-vm-subscriber |
サポートされているSQL Serverバージョンは、サポートマトリックスに従って使用します。 |
| サブスクライバー仮想ネットワーク | sql-vm-subscriber-vnet |
パブリッシャー VNet への VNet ピアリングが必要 |
| Private 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 ポータルを使用して、この新しいリソース グループ内に 2 つの SQL マネージド インスタンスを作成します。
パブリッシャー SQL マネージド インスタンスの名前は
sql-mi-publisherし (ランダム化のために数文字)、仮想ネットワークの名前をvnet-sql-mi-publisherする必要があります。ディストリビューター SQL マネージド インスタンスの名前は
sql-mi-distributor(ランダム化用の数文字) にする必要があり、 パブリッシャー SQL マネージド インスタンスと同じ仮想ネットワーク内に存在する必要があります。
SQL マネージド インスタンスの作成の詳細については、「Quickstart: create Azure SQL Managed Instance」を参照してください。
注意
わかりやすくするために、このチュートリアルではパブリッシャーと同じ仮想ネットワークにディストリビューター SQL マネージド インスタンスを配置します。 ただし、適切な VNet ピアリングを使用して、別の仮想ネットワークにディストリビューターを作成できます。
SQL Server VM を作成する
Azure ポータルを使用してSQL Server仮想マシンを作成します。 SQL Server仮想マシンには、次の特性が必要です。
- 名前:
sql-vm-subscriber - 図: Azure SQL Managed Instanceを使用したトランザクション レプリケーションをサポートするSQL Serverバージョン、サポート可能マトリックスに従い
- リソース グループ: SQL マネージド インスタンスと同じ
- 仮想ネットワーク:
sql-vm-subscriber-vnet
SQL Server VM をAzureにデプロイする方法の詳細については、「Quickstart: Azure ポータルで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 managed instanceへの接続の詳細については、「
プライベート DNS ゾーンの作成
プライベート DNS ゾーンでは、SQL マネージド インスタンスとSQL Server間の DNS ルーティングが許可されます。
プライベート ゾーンを作成する
Azure ポータルにサインインします。
リソースの作成を選択して、新しいAzure リソースを作成します。
Azure Marketplaceで
private dns zoneを検索します。Microsoftによって発行された Private DNS ゾーン リソースを選択し、 Create を選択して DNS ゾーンを作成します。
ドロップダウン リストからサブスクリプションとリソース グループを選択します。
DNS ゾーンに任意の名前を指定します (例:
repldns.com)。[Review + create](レビュー + 作成) を選択します。 プライベート DNS ゾーンのパラメーターを確認し、[ 作成 ] を選択してリソースを作成します。
A レコードを作成する
新しい Private DNS ゾーンに移動し、Overview を選択します。
[+ レコード セット] を選択して、新しい A レコードを作成します。
SQL Server VM の名前とプライベート内部 IP アドレスを指定します。
[OK] を選択して A レコードを作成します。
仮想ネットワークのリンク
新しい Private DNS ゾーンに移動し、仮想ネットワーク リンク を選択します。
[+ 追加] を選択します。
リンクの名前を指定します (例:
Pub-link)。ドロップダウン リストからサブスクリプションを選択し、パブリッシャー SQL マネージド インスタンスの仮想ネットワークを選択します。
[自動登録を有効にする] のチェック ボックスをオンにします。
[OK] を選択して、仮想ネットワークをリンクします。
以上の手順を繰り返し、
Sub-linkのような名前でサブスクライバー仮想ネットワークのリンクを追加します。
Azure ストレージ アカウントを作成する
作業ディレクトリのAzureストレージ アカウントを作成し、ストレージ アカウント内に file 共有を作成します。
ストレージ構成の値
ディストリビューションを構成するときは、次の値が必要です。
-
作業ディレクトリ パスの形式:
\\<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';
注意
\ パラメーターには円記号 (@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) に接続します。Object Explorer で、Replication ノードを展開し、Local Publication フォルダーを右クリックします。 [新しいパブリケーション...] を選択します。
[次へ] を選択して、ようこそページの後まで移動します。
[パブリケーション データベース] ページで、前に作成した
ReplTutorialデータベースを選択します。 [次へ] を選択します。[パブリケーションの種類] ページで、 [トランザクション パブリケーション] を選択します。 [次へ] を選択します。
[アーティクル] ページで、 [テーブル] のチェック ボックスをオンにします。 [次へ] を選択します。
[テーブル行のフィルター選択] ページで、フィルターを追加せずに [次へ] を選択します。
Snapshot Agent ページで、Create スナップショットの横にあるチェック ボックスをオンにして、スナップショットをサブスクリプションの初期化に使用できるようにします。 [次へ] を選択します。
Agent Security ページで、Security Settings...を選択します。Snapshot Agent とパブリッシャーに接続するために使用する SQL Server ログイン資格情報を指定します。 OK を選択して、Snapshot Agent Security ページを閉じます。 [次へ] を選択します。
[ウィザードのアクション] ページで [パブリケーションを作成する] を選択し、後のためにこのスクリプトを保存する場合は [パブリケーションを作成するためのステップを含むスクリプト ファイルを生成する] を選択します (省略可能)。
[ ウィザードの完了 ] ページで、文書に
ReplTest名前を付け、[ 次へ ] を選択して文書を作成します。文書が作成されたら、Object Explorer の Replication ノードを更新し、Local Publications を展開して新しいパブリケーションを表示します。
サブスクリプションを作成する
パブリケーションを作成した後は、サブスクリプションを作成できます。 これを行うには、次のステップに従います。
- SQL ServerでSQL Server Management Studioを起動します。
- パブリッシャー SQL マネージド インスタンス (
sql-mi-publisher) に接続します。 - 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;
予想される出力: 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 ポータルでリソース グループに移動します。
- 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 ログインへのログイン資格情報の変更には、Publication プロパティのエージェント セキュリティページを使用します。
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 以降にアップグレードしてみてください。
関連コンテンツ
- Azure SQL Managed Instanceは何ですか?
- Azure SQL マネージド インスタンスにおける SQL Server 監査
- 常に暗号化
- Azure SQL Managed Instance にて Advanced Threat Protection を構成する
- 動的データ マスク
- 行レベルのセキュリティ
- 透過的なデータ暗号化 (TDE)