適用対象:Linux 上の SQL Server
このチュートリアルでは、Transact-SQL (T-SQL) を使用して、SQL Server の 2 つのインスタンスにより、Linux 上で SQL Server スナップショット レプリケーションを構成します。 パブリッシャーとディストリビューターは同じインスタンスになり、サブスクライバーは別のインスタンスに展開されます。
- Linux 上で SQL Server レプリケーション エージェントを有効にする
- サンプル データベースの作成
- SQL Server エージェントのアクセス用にスナップショット フォルダーを構成する
- ディストリビューターを構成する
- パブリッシャーを構成する
- パブリケーションとアーティクルを構成する
- サブスクライバーを構成する
- レプリケーション ジョブを実行する
すべてのレプリケーション構成は、レプリケーション ストアド プロシージャを使用して構成できます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
最新バージョンの SQL Server on Linux を使用した SQL Server の 2 つのインスタンス
sqlcmd や SQL Server Management Studio (SSMS) などのレプリケーションを設定するために T-SQL クエリを発行するツール
「Windows で SQL Server Management Studio を使用して SQL Server on Linux を管理する」を参照してください。
Note
SQL Server レプリケーションは、SQL Server 2017 (14.x) (CU 18) 以降のバージョンの Linux でサポートされています。
詳細な手順
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 スナップショット レプリケーションを構成しました。
- Linux 上で SQL Server レプリケーション エージェントを有効にする
- サンプル データベースの作成
- SQL Server エージェントのアクセス用にスナップショット フォルダーを構成する
- ディストリビューターを構成する
- パブリッシャーを構成する
- パブリケーションとアーティクルを構成する
- サブスクライバーを構成する
- レプリケーション ジョブを実行する