このチュートリアルでは、Transact-SQL (T-SQL) を使用して、SQL Server の 2 つのインスタンスにより、Linux 上で SQL Server スナップショット レプリケーションを構成します。 パブリッシャーとディストリビューターは同じインスタンスになり、サブスクライバーは別のインスタンスに展開されます。
Linux 上で SQL Server レプリケーション エージェントを有効にします。 両方のホスト マシン上のターミナルで次のコマンドを実行します。
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
sudo systemctl restart mssql-server
サンプル データベースとテーブルを作成します。 パブリッシャーで、パブリケーションのアーティクルとして機能するサンプル データベースとテーブルを作成します。
CREATE DATABASE Sales;
GO
USE [Sales];
GO
CREATE TABLE Customer
(
[CustomerID] INT NOT NULL,
[SalesAmount] DECIMAL NOT NULL
);
GO
INSERT INTO Customer (CustomerID, SalesAmount)
VALUES (1, 100),
(2, 200),
(3, 300);
GO
他の SQL Server インスタンスであるサブスクライバーで、アーティクルを受け取るデータベースを作成します。
CREATE DATABASE Sales;
GO
SQL Server エージェントの読み取り用および書き込み用のスナップショット フォルダーを作成します。ディストリビューターで、スナップショット フォルダーを作成し、'mssql' ユーザーにアクセス権を付与します。
sudo mkdir /var/opt/mssql/data/ReplData/
sudo chown mssql /var/opt/mssql/data/ReplData/
sudo chgrp mssql /var/opt/mssql/data/ReplData/
ディストリビューターを構成します。 この例では、パブリッシャーはディストリビューターでもあります。 パブリッシャーで次のコマンドを実行して、ディストリビューション用にもインスタンスを構成します。
DECLARE @distributor AS SYSNAME;
DECLARE @distributorlogin AS SYSNAME;
DECLARE @distributorpassword AS SYSNAME;
-- Specify the distributor name. Use 'hostname' command on in terminal to find the hostname
SET @distributor = N'<distributor instance name>'; -- In this example, it will be the name of the publisher
SET @distributorlogin = N'<distributor login>';
SET @distributorpassword = N'<distributor password>';
-- Specify the distribution database.
USE master;
EXECUTE sp_adddistributor
@distributor = @distributor; -- this should be the hostname
-- Log into distributor and create Distribution Database.
-- In this example, our publisher and distributor is on the same host
EXECUTE sp_adddistributiondb
@database = N'distribution',
@log_file_size = 2,
@deletebatchsize_xact = 5000,
@deletebatchsize_cmd = 2000,
@security_mode = 0,
@login = @distributorlogin,
@password = @distributorpassword;
GO
DECLARE @snapshotdirectory AS NVARCHAR (500);
SET @snapshotdirectory = N'/var/opt/mssql/data/ReplData/';
-- Log into distributor and create Distribution Database.
-- In this example, our publisher and distributor is on the same host
USE [distribution];
GO
IF (NOT EXISTS (SELECT *
FROM sysobjects
WHERE name = 'UIProperties'
AND type = 'U'))
CREATE TABLE UIProperties
(
id INT
);
IF (EXISTS (SELECT *
FROM ::fn_listextendedproperty ('SnapshotFolder', 'user', 'dbo', 'table', 'UIProperties', NULL, NULL)))
EXECUTE sp_updateextendedproperty N'SnapshotFolder', @snapshotdirectory, 'user', dbo, 'table', 'UIProperties';
ELSE
EXECUTE sp_addextendedproperty N'SnapshotFolder', @snapshotdirectory, 'user', dbo, 'table', 'UIProperties';
GO
パブリッシャーを構成します。 パブリッシャーで次の T-SQL コマンドを実行します。
DECLARE @publisher AS SYSNAME;
DECLARE @distributorlogin AS SYSNAME;
DECLARE @distributorpassword AS SYSNAME;
-- Specify the distributor name. Use 'hostname' command on in terminal to find the hostname
SET @publisher = N'<instance name>';
SET @distributorlogin = N'<distributor login>';
SET @distributorpassword = N'<distributor password>';
-- Specify the distribution database.
-- Adding the distribution publishers
EXECUTE sp_adddistpublisher
@publisher = @publisher,
@distribution_db = N'distribution',
@security_mode = 0,
@login = @distributorlogin,
@password = @distributorpassword,
@working_directory = N'/var/opt/mssql/data/ReplData',
@trusted = N'false',
@thirdparty_flag = 0,
@publisher_type = N'MSSQLSERVER';
GO
パブリケーション ジョブを設定する。 パブリッシャーで次の T-SQL コマンドを実行します。
DECLARE @replicationdb AS SYSNAME;
DECLARE @publisherlogin AS SYSNAME;
DECLARE @publisherpassword AS SYSNAME;
SET @replicationdb = N'Sales';
SET @publisherlogin = N'<Publisher login>';
SET @publisherpassword = N'<Publisher Password>';
USE [Sales];
GO
EXECUTE sp_replicationdboption
@dbname = N'Sales',
@optname = N'publish',
@value = N'true';
-- Add the snapshot publication
EXECUTE sp_addpublication
@publication = N'SnapshotRepl',
@description = N'Snapshot publication of database ''Sales'' from Publisher ''<PUBLISHER HOSTNAME>''.',
@retention = 0,
@allow_push = N'true',
@repl_freq = N'snapshot',
@status = N'active',
@independent_agent = N'true';
EXECUTE sp_addpublication_snapshot
@publication = N'SnapshotRepl',
@frequency_type = 1,
@frequency_interval = 1,
@frequency_relative_interval = 1,
@frequency_recurrence_factor = 0,
@frequency_subday = 8,
@frequency_subday_interval = 1,
@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 = @publisherlogin,
@publisher_password = @publisherpassword;
Sales テーブルから記事を作成します。
パブリッシャーで次の T-SQL コマンドを実行します。
USE [Sales];
GO
EXECUTE sp_addarticle
@publication = N'SnapshotRepl',
@article = N'customer',
@source_owner = N'dbo',
@source_object = N'customer',
@type = N'logbased',
@description = NULL,
@creation_script = NULL,
@pre_creation_cmd = N'drop',
@schema_option = 0x000000000803509D,
@identityrangemanagementoption = N'manual',
@destination_table = N'customer',
@destination_owner = N'dbo',
@vertical_partition = N'false';
サブスクリプションを構成します。 パブリッシャーで次の T-SQL コマンドを実行します。
DECLARE @subscriber AS SYSNAME;
DECLARE @subscriber_db AS SYSNAME;
DECLARE @subscriberLogin AS SYSNAME;
DECLARE @subscriberPassword AS SYSNAME;
SET @subscriber = N'<Instance Name>'; -- for example, MSSQLSERVER
SET @subscriber_db = N'Sales';
SET @subscriberLogin = N'<Subscriber Login>';
SET @subscriberPassword = N'<Subscriber Password>';
USE [Sales];
GO
EXECUTE sp_addsubscription
@publication = N'SnapshotRepl',
@subscriber = @subscriber,
@destination_db = @subscriber_db,
@subscription_type = N'Push',
@sync_type = N'automatic',
@article = N'all',
@update_mode = N'read only',
@subscriber_type = 0;
EXECUTE sp_addpushsubscription_agent
@publication = N'SnapshotRepl',
@subscriber = @subscriber,
@subscriber_db = @subscriber_db,
@subscriber_security_mode = 0,
@subscriber_login = @subscriberLogin,
@subscriber_password = @subscriberPassword,
@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 = 0,
@active_start_date = 0,
@active_end_date = 19950101;
GO
レプリケーション エージェント ジョブを実行します。 次のクエリを実行してジョブの一覧を取得します。
SELECT name,
date_modified
FROM msdb.dbo.sysjobs
ORDER BY date_modified DESC;
スナップショット レプリケーション ジョブを実行してスナップショットを生成します。
USE msdb;
GO
--generate snapshot of publications, for example
EXECUTE dbo.sp_start_job N'PUBLISHER-PUBLICATION-SnapshotRepl-1';
GO
スナップショット レプリケーション ジョブを実行してスナップショットを生成します。
USE msdb;
GO
--distribute the publication to subscriber, for example
EXECUTE dbo.sp_start_job N'DISTRIBUTOR-PUBLICATION-SnapshotRepl-SUBSCRIBER';
GO
サブスクライバーに接続し、レプリケートされたデータを照会します。
サブスクライバーで、次のクエリを実行してレプリケーションが機能していることを確認します。
SELECT *
FROM [Sales].[dbo].[Customer];
このチュートリアルでは、T-SQL を使用して、SQL Server の 2 つのインスタンスにより、Linux 上で SQL Server スナップショット レプリケーションを構成しました。