オンラインの方法を使用して Azure SQL Database に移行する

完了

移行プロセス中にユーザーに対してデータベースをオンラインのままにしておく必要がある場合は、トランザクション レプリケーションを使用してデータを移動できます。 トランザクション レプリケーションは、Azure SQL Database への移行に使用できる唯一のオンラインの方法です。

自転車製造会社のシナリオでは、倉庫は週 7 日、24 時間稼働しており、非アクティブな期間はありません。 取締役会は、Azure SQL Database への移行中でも、在庫データベースが常に使用可能であることを確認したいと考えています。

Diagram showing the replication topology involving SQL Server and Azure SQL Database.

トランザクション レプリケーションとは?

トランザクション レプリケーションは、常時接続データベース サーバー間でデータを移動する方法です。

プロセスは、パブリケーションのデータベース オブジェクトとデータのスナップショットで開始されます。 最初のスナップショットが取得されると、パブリッシャーのデータまたはスキーマに対する以降の変更はすべて、通常はその都度、ほぼリアルタイムで Azure SQL Database に配信されます。

Diagram showing the key components in a transactional replication.

Azure SQL Database では、トランザクションとスナップショット レプリケーションの両方がプッシュ サブスクライバーとしてサポートされます。 つまり、Azure SQL Database では、トランザクションまたはスナップショット レプリケーションを使用して、パブリッシャーから変更を受信して適用できます。

パブリッシャーまたはディストリビューターは、オンプレミスで、またはクラウド内の Azure 仮想マシンで実行されている SQL Server のインスタンス、あるいは Azure SQL Managed Instance にすることができます。

トランザクション レプリケーションの構成は、SQL Server Management Studio を介して、またはパブリッシャーで Transact-SQL ステートメントを実行することで行うことができます。 Azure portal からトランザクション レプリケーションを構成することはできません。

トランザクション レプリケーションには、次のコンポーネントが必要です。

Role 定義
発行元 レプリケートするデータをホストするデータベース インスタンス (ソース)。
サブスクライバー ''パブリッシャー'' によってレプリケートされるデータが受信されます (ターゲット)。
ディストリビューター ''パブリッシャー'' からアーティクル内の変更が収集され、''サブスクライバー'' に配布されます。
記事 データベース オブジェクト。たとえば、''パブリケーション'' に含まれているテーブルなどです。
Publication レプリケートされるデータベースの 1 つまたは複数のアーティクルのコレクション。
サブスクリプション ''パブリケーション'' の ''サブスクライバー'' からの要求。

トランザクション レプリケーションを設定する

以下の手順に従って、ダウンタイムなしで AdventureWorks データベースから Azure SQL Database にテーブル [Person].[Person] を移行します。 トランザクション レプリケーションで Azure SQL Database に接続するために使用できるのは、SQL Server 認証ログインのみです。

パラメーター 定義
@distributor ソース インスタンス名。
@publisher ソース インスタンス名。
@subscriber <server>.database.windows.net という形式の Azure SQL Database。 スクリプトを実行する前に、Azure SQL Database が存在している必要があります。
@dbname ソースのデータベース名。
@publisher_login ソースで必要なアクセス許可を持つ SQL ユーザー。
@publisher_password SQL ユーザーのパスワード。
@destination_db ターゲットのデータベース名。
@subscriber_login ターゲットで必要なアクセス許可を持つ SQL ユーザー。
@subscriber_password SQL ユーザーのパスワード。
@working_directory レプリケーション作業ディレクトリ。必要に応じて、この場所を変更します。

スクリプトの実行時に、独自の環境に応じて上記のパラメーターを調整します。

ディストリビューターを作成する

次のスクリプトでは、ディストリビューター データベース、ディストリビューター パブリッシャー、およびエージェントを作成します。

USE [master]
GO

EXEC sp_adddistributor @distributor = N'CONTOSO-SRV', @password = N''
GO

EXEC sp_adddistributiondb 
		@database = N'distribution', 
		@data_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Data', 
		@data_file = N'distribution.MDF', 
		@data_file_size = 13, 
		@log_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Data', 
		@log_file = N'distribution.LDF', 
		@log_file_size = 9, 
		@min_distretention = 0, 
		@max_distretention = 72, 
		@history_retention = 48, 
		@deletebatchsize_xact = 5000, 
		@deletebatchsize_cmd = 2000, 
		@security_mode = 1
GO

-- Adding the distribution publishers
exec sp_adddistpublisher 
	@publisher = N'CONTOSO-SRV', 
	@distribution_db = N'distribution',
	@security_mode = 1, 
	@working_directory = N'C:\REPL', 
	@trusted = N'false', 
	@thirdparty_flag = 0, 
	@publisher_type = N'MSSQLSERVER'
GO

exec sp_addsubscriber 
	@subscriber = N'contoso.database.windows.net', 
	@type = 0, 
	@description = N'Azure SQL Database (target)'
GO

-- Enabling the replication database
use master
exec sp_replicationdboption 
	@dbname = N'AdventureWorks', 
	@optname = N'publish', 
	@value = N'true'
GO

--Adds a Log Reader agent for the AdventureWorks database. 
exec [AdventureWorks].sys.sp_addlogreader_agent 
	@publisher_security_mode = 1
GO

--Adds a Queue Reader agent for the distributor.
exec [AdventureWorks].sys.sp_addqreader_agent 
	@frompublisher = 1
GO

トランザクション パブリケーションを作成する

次のスクリプトでは、パブリッシャーから AdventureWorks データベースのトランザクション パブリケーションを作成します。

USE [AdventureWorks]
GO

EXEC sp_addpublication 
	@publication = N'REPL-AdventureWorks', 
	@description = N'Transactional publication of database ''AdventureWorks'' from Publisher ''CONTOSO-SRV''.', 
	@sync_method = N'concurrent', 
	@retention = 0, 
	@allow_push = N'true', 
	@allow_pull = N'true', 
	@allow_anonymous = N'true', 
	@enabled_for_internet = N'false', 
	@snapshot_in_defaultfolder = N'false', 
	@alt_snapshot_folder = N'C:\REPL', 
	@compress_snapshot = N'true', 
	@ftp_port = 21,
	@ftp_login = N'anonymous', 
	@allow_subscription_copy = N'false', 
	@add_to_active_directory = N'false', 
	@repl_freq = N'continuous', 
	@status = N'active', 
	@independent_agent = N'true', 
	@immediate_sync = N'true', 
	@allow_sync_tran = N'false',
	@autogen_sync_procs = N'false', 
	@allow_queued_tran = N'false', 
	@allow_dts = N'false', 
	@replicate_ddl = 1, 
	@allow_initialize_from_backup = N'false', 
	@enabled_for_p2p = N'false',
	@enabled_for_het_sub = N'false'
GO

exec sp_addpublication_snapshot 
	@publication = N'REPL-AdventureWorks', 
	@frequency_type = 1, 
	@frequency_interval = 0, 
	@frequency_relative_interval = 0, 
	@frequency_recurrence_factor = 0, 
	@frequency_subday = 0, 
	@frequency_subday_interval = 0,
	@active_start_time_of_day = 0, 
	@active_end_time_of_day = 235959, 
	@active_start_date = 0,
	@active_end_date = 0, 
	@publisher_security_mode = 0,
	@publisher_login = N'sqladmin', 
	@publisher_password = N'<pwd>'

パブリケーションのアーティクルを作成する

次のスクリプトでは、[Person].[Person] テーブルのアーティクルを作成します。

USE [AdventureWorks]
GO

EXEC sp_addarticle 
	@publication = N'REPL-AdventureWorks', 
	@article = N'Person', 
	@source_owner = N'Person', 
	@source_object = N'Person',
	@type = N'logbased', 
	@description = N'', 
	@creation_script = N'',
	@pre_creation_cmd = N'drop', 
	@schema_option = 0x000000000803509F, 
	@identityrangemanagementoption = N'none', 
	@destination_table = N'Person',
	@destination_owner = N'Person',
	@status = 24, 
	@vertical_partition = N'false', 
	@ins_cmd = N'CALL [sp_MSins_PersonPerson]', 
	@del_cmd = N'CALL [sp_MSdel_PersonPerson]', 
	@upd_cmd = N'SCALL [sp_MSupd_PersonPerson]'
GO

サブスクリプションとサブスクリプション エージェントを作成する

次のスクリプトでは、Azure SQL Database サブスクライバーへのプッシュ サブスクリプションを作成します。

USE [AdventureWorks]
GO

EXEC sp_addsubscription 
	@publication = N'REPL-AdventureWorks', 
	@subscriber = N'contoso.database.windows.net', 
	@destination_db = N'my-db',
	@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'REPL-AdventureWorks', 
	@subscriber = N'contoso.database.windows.net', 
	@subscriber_db = N'my-db',
	@job_login = null, 
	@job_password = null, 
	@subscriber_security_mode = 0, 
	@subscriber_login = N'sqladmin',
	@subscriber_password = '<pwd>', 
	@frequency_type = 64, 
	@frequency_interval = 1, 
	@frequency_relative_interval = 1, 
	@frequency_recurrence_factor = 0,
	@frequency_subday = 4, 
	@frequency_subday_interval = 5,
	@active_start_time_of_day = 0, 
	@active_end_time_of_day = 235959, 
	@active_start_date = 0, 
	@active_end_date = 0, 
	@dts_package_location = N'Distributor'
GO

レプリケーションを開始して監視する

Azure SQL Database からのレプリケーションの管理と監視はサポートされていません。 代わりに、SQL Server からこれらのアクティビティを実行します。 レプリケーションを開始するには、スナップショット ジョブ、ログ リーダー ジョブ、ディストリビューター ジョブを開始します。

パブリケーションを右クリックし、適切なオプションを選択することで、スナップショット エージェントログ リーダー エージェントを監視できます。 エージェントが実行されていない場合は、起動します。

Screenshot showing how to launch the snapshot agent.

同期状態を表示するには、サブスクリプションを右クリックし、[同期状態の表示] を選択して、エージェントを起動します。 エラー メッセージが表示された場合は、SQL Server エージェントのエージェント ジョブ履歴を確認します。 エージェントが期待どおりに実行されている場合は、次の結果が表示されるはずです。

スナップショット エージェント:

Screenshot showing the snapshot agent status in a transactional replication.

ログ リーダー エージェント:

Screenshot showing the log reader status in a transactional replication.

同期の状態:

Diagram showing the synchronization status in a transactional replication.

データが Azure SQL Database に完全にレプリケートされた後、サブスクライバー データベースに接続を転送してから、レプリケーションを停止および削除できます。

サポートされている構成の詳細については、「Azure SQL Database へのレプリケーション」を参照してください。