次の方法で共有


チュートリアル: 2 つの SQL マネージド インスタンス間のレプリケーションを構成する

適用対象:Azure SQL Managed Instance

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

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

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

2 つの SQL マネージド インスタンス間のレプリケーションを示す図。

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

Note

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

必要条件

SQL Managed Instance をパブリッシャー、ディストリビューター、またはその両方として機能するよう構成するには、以下の要件があります。

  • パブリッシャー SQL マネージド インスタンスは、ディストリビューターとサブスクライバーと同じ仮想ネットワーク上にあります。または、3 つのエンティティすべての仮想ネットワーク間で VNet ピアリング または VPN ゲートウェイ が構成されています。
  • 接続では、レプリケーション参加者間で SQL 認証を使用します。
  • レプリケーションの作業ディレクトリとしての Azure ストレージ アカウント共有。
  • ポート 445 (TCP 送信) は、SQL マネージド インスタンスが Azure ファイル共有にアクセスするための NSG のセキュリティ規則で開かれています。 エラー failed to connect to azure storage <storage account name> with os error 53が発生した場合は、適切な SQL Managed Instance サブネットの NSG に送信規則を追加する必要があります。

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

Azure portal を使用して SQLMI-Repl という名前のリソース グループを作成します。

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

Azure portal を使用して、同じ仮想ネットワークとサブネット上に 2 つの SQL マネージド インスタンスを作成します。 たとえば、次の 2 つの SQL マネージド インスタンスに名前を付けます。

  • sql-mi-publisher (ランダム化のためのいくつかの文字を付加する)
  • sql-mi-subscriber (ランダム化のためのいくつかの文字を付加する)

また、SQL マネージド インスタンスに 接続するように Azure VM を構成 する必要もあります。

3 ‐ 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

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

4 - パブリッシャー データベースを作成する

SQL Server Management Studio を使用してパブリッシャー SQL マネージド インスタンス (sql-mi-publisher) に接続し、次の Transact-SQL (T-SQL) コードを実行してパブリッシャー データベースを作成します。

USE [master]
GO

CREATE DATABASE [ReplTran_PUB]
GO

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

USE [ReplTran_PUB]
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 - サブスクライバー データベースを作成する

SQL Server Management Studio を使用してサブスクライバー SQL マネージド インスタンス (sql-mi-subscriber) に接続し、次の T-SQL コードを実行して空のサブスクライバー データベースを作成します。

USE [master]
GO

CREATE DATABASE [ReplTran_SUB]
GO

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

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

SQL Server Management Studio を使用してパブリッシャー SQL マネージド インスタンス (sql-mi-publisher) に接続し、次の T-SQL コードを実行してディストリビューション データベースを構成します。

USE [master]
GO

EXEC sp_adddistributor @distributor = @@ServerName;
EXEC sp_adddistributiondb @database = N'distribution';
GO

7 - ディストリビューターを使用するようにパブリッシャーを構成する

パブリッシャー SQL マネージド インスタンス (sql-mi-publisher) で、クエリの実行を SQLCMD モードに変更し、次のコードを実行して新しいディストリビューターをパブリッシャーに登録します。

:setvar username loginUsedToAccessSourceManagedInstance
:setvar password passwordUsedToAccessSourceManagedInstance
:setvar file_storage "\\storage-account-name.file.core.windows.net\file-share-name"
-- example: file_storage "\\replstorage.file.core.windows.net\replshare"
:setvar file_storage_key "DefaultEndpointsProtocol=https;AccountName=<Storage-Account-Name>;AccountKey=****;EndpointSuffix=core.windows.net"
-- example: file_storage_key "DefaultEndpointsProtocol=https;AccountName=replstorage;AccountKey=123456789aBcDeFgHiJkLmNoPqRsTuVwXyZ==;EndpointSuffix=core.windows.net"

USE [master]
EXEC sp_adddistpublisher
  @publisher = @@ServerName,
  @distribution_db = N'distribution',
  @security_mode = 0,
  @login = N'$(username)',
  @password = N'$(password)',
  @working_directory = N'$(file_storage)',
  @storage_connection_string = N'$(file_storage_key)'; -- Remove this parameter for on-premises publishers

Note

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

このスクリプトは、SQL マネージド インスタンスでローカル パブリッシャーを構成し、リンク サーバーを追加して、SQL Server エージェントのジョブのセットを作成します。

8 - パブリケーションとサブスクライバーを作成する

SQLCMD モードを使用して、次の T-SQL スクリプトを実行してデータベースのレプリケーションを有効にし、パブリッシャー、ディストリビューター、およびサブスクライバー間のレプリケーションを構成します。

-- Set variables
:setvar username sourceLogin
:setvar password sourcePassword
:setvar source_db ReplTran_PUB
:setvar publication_name PublishData
:setvar object ReplTest
:setvar schema dbo
:setvar target_server "sql-mi-subscriber.wdec33262scj9dr27.database.windows.net"
:setvar target_username targetLogin
:setvar target_password targetPassword
:setvar target_db ReplTran_SUB

-- Enable replication for your source database
USE [$(source_db)]
EXEC sp_replicationdboption
  @dbname = N'$(source_db)',
  @optname = N'publish',
  @value = N'true';

-- Create your publication
EXEC sp_addpublication
  @publication = N'$(publication_name)',
  @status = N'active';

-- Configure your log reader agent
EXEC sp_changelogreader_agent
  @publisher_security_mode = 0,
  @publisher_login = N'$(username)',
  @publisher_password = N'$(password)',
  @job_login = N'$(username)',
  @job_password = N'$(password)';

-- Add the publication snapshot
EXEC sp_addpublication_snapshot
  @publication = N'$(publication_name)',
  @frequency_type = 1,
  @publisher_security_mode = 0,
  @publisher_login = N'$(username)',
  @publisher_password = N'$(password)',
  @job_login = N'$(username)',
  @job_password = N'$(password)';

-- Add the ReplTest table to the publication
EXEC sp_addarticle
  @publication = N'$(publication_name)',
  @type = N'logbased',
  @article = N'$(object)',
  @source_object = N'$(object)',
  @source_owner = N'$(schema)';

-- Add the subscriber
EXEC sp_addsubscription
  @publication = N'$(publication_name)',
  @subscriber = N'$(target_server)',
  @destination_db = N'$(target_db)',
  @subscription_type = N'Push';

-- Create the push subscription agent
EXEC sp_addpushsubscription_agent
  @publication = N'$(publication_name)',
  @subscriber = N'$(target_server)',
  @subscriber_db = N'$(target_db)',
  @subscriber_security_mode = 0,
  @subscriber_login = N'$(target_username)',
  @subscriber_password = N'$(target_password)',
  @job_login = N'$(username)',
  @job_password = N'$(password)';

-- Initialize the snapshot
EXEC sp_startpublication_snapshot
@publication = N'$(publication_name)';

9 - エージェントのパラメーターを変更する

現在、Azure SQL Managed Instance では、レプリケーション エージェントとの接続でバックエンドの問題がいくつか発生しています。 この問題には現在対応していますが、レプリケーション エージェントのログイン タイムアウト値を増やすことで解決することができます。

パブリッシャー上で次の T-SQL コマンドを実行してログイン タイムアウトを増やします。

-- Increase login timeout to 150s
update msdb..sysjobsteps set command = command + N' -LoginTimeout 150'
where subsystem in ('Distribution','LogReader','Snapshot') and command not like '%-LoginTimeout %'

ログイン タイムアウトを既定値に戻すために必要な場合は、次の T-SQL コマンドを再度実行します。

-- Increase login timeout to 30
update msdb..sysjobsteps set command = command + N' -LoginTimeout 30'
where subsystem in ('Distribution','LogReader','Snapshot') and command not like '%-LoginTimeout %'

これらの変更を適用するには、3 つのエージェントをすべて再起動します。

10 - テスト レプリケーション

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

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

select * from dbo.ReplTest

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

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

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

パブリケーションをドロップするには、次の T-SQL コマンドを実行します。

-- Drops the publication
USE [ReplTran_PUB]
EXEC sp_droppublication @publication = N'PublishData'
GO

データベースからレプリケーション オプションを削除するには、次の T-SQL コマンドを実行します。

-- Disables publishing of the database
USE [ReplTran_PUB]
EXEC sp_removedbreplication
GO

パブリッシングとディストリビューションを無効にするには、次の T-SQL コマンドを実行します。

-- Drops the distributor
USE [master]
EXEC sp_dropdistributor @no_checks = 1
GO

リソース グループから SQL Managed Instance リソースを削除してからリソース グループ SQLMI-Repl を削除することで、ご自分の Azure リソースをクリーンアップできます。