カピバラ好きなエンジニアブログ

興味ある技術とか検証した内容を赴くままに書いていきます。カピバラの可愛さこそ至高。

SQL Serverレプリケーション(2017→2016)をやってみた(トランザクションレプリケーション)

はじめに

前回はトランザクションレプリケーション

で設定しましたが、今回は

というパブリッシャー側の方がバージョン上の場合にレプリケーションできるかを確認していきます。


また、サブスクライバーSQL Server 2016にはまだ前回のレプリケーション設定が残っており、パブリッシャー2台からサブスクライバー1台に対してレプリケーションが可能かも併せて確認する予定です。

  • 関連記事はこちら

capybara-engineer.hatenablog.com
capybara-engineer.hatenablog.com



実施内容


実施作業

サンプルDB作成

以下の記事を参考にパブリッシャーのSQL ServerにサンプルDBを作成します。
capybara-engineer.hatenablog.com


途中の手順は省略しますが、作成ができました。
f:id:live-your-life-dd18:20200214095448p:plain

レプリケーション事前設定

Windowsアカウント作成

レプリケーションに必要なアカウントを作成します。
レプリケーション先のアカウント作成は省略します。
f:id:live-your-life-dd18:20200214100441p:plain

スナップショットフォルダー準備

レプリケーション時に作成されるスナップショットの作成フォルダを作ります。
※設定内容は前回記事を参照
f:id:live-your-life-dd18:20200214101010p:plain

ディストリビューション構築

レプリケーション元DBでディストリビューションを構築していたところ、以下のエラーが発生しました。
f:id:live-your-life-dd18:20200214101803p:plain


以下のURLを見るとどうやらSQL Serverエージェントを自動起動するように設定する部分でエラーとなっているようです。
www.sqltact.com


一度ディストリビューションの設定を削除し、設定時にエージェントの起動方法を変更しない設定で再度作成することでエラーは発生しないようになりました。
f:id:live-your-life-dd18:20200214102620p:plain


※エラーが発生した場合の追加設定
SQL Serverエージェントのサービスを手動で自動起動するように設定します。
f:id:live-your-life-dd18:20200214102921p:plain


SSMSのSQLServer Agnetを起動させます。
f:id:live-your-life-dd18:20200214131330p:plain
f:id:live-your-life-dd18:20200214131510p:plain

DBアクセス許可設定

作成したWindowsアカウントとレプリケーションするDBの紐づけを実施します。
f:id:live-your-life-dd18:20200214103308p:plain

レプリケーション設定

パブリッシャー構成

今回のパブリッシュ対象のデータは全テーブルを対象とします。
f:id:live-your-life-dd18:20200214132245p:plain


フィルターも設定せずに全期間が対象です。
f:id:live-your-life-dd18:20200214132425p:plain


Local Publicationsフォルダ配下に作成されていれば完了です。
f:id:live-your-life-dd18:20200214142639p:plain

スナップショット生成の状態を表示

スナップショットエージェントが正常に実行されていることを確認します。
f:id:live-your-life-dd18:20200214142751p:plain


作成したスナップショットフォルダにもファイルが作成されていることが確認できます。
f:id:live-your-life-dd18:20200214142856p:plain

repl_distributionユーザのPAL追加

作成したパブリッシャーのPALにスナップショットやログを転送するユーザを追加します。
f:id:live-your-life-dd18:20200214143332p:plain

サブスクリプションの作成

サブスクライバーの設定をしていきます。
今回は設定をするSSMSのバージョンがサブスクライバー側より上なのでGUIでレプリカ用DBを新規作成します。
f:id:live-your-life-dd18:20200214144805p:plain


前回はTSQLで設定したDistribution Agentも今回はGUIで設定します。
f:id:live-your-life-dd18:20200214145148p:plain


問題なく作成ができました。
f:id:live-your-life-dd18:20200214145432p:plain

サブスクライバー側のデータベース権限を設定

db_ownerロールを設定します。
f:id:live-your-life-dd18:20200214145727p:plain

サブスクリプションの同期状態を表示

前回と同じエラーが発生しました。
f:id:live-your-life-dd18:20200214150018p:plain


前回記事の原因調査3で解決した、DBのownerを設定する手順を実施します。
f:id:live-your-life-dd18:20200214150144p:plain


LogReaderのジョブを再起動します。
f:id:live-your-life-dd18:20200214150354p:plain


それでもダメなようなので、調べたところCREATE TABLEでUser Defined Functionsを呼び出しているようなので、サブスクリプション対象に追加します。
f:id:live-your-life-dd18:20200214151641p:plain


今度は別のエラーが出ました。
f:id:live-your-life-dd18:20200214152649p:plain


ここら辺が原因なような気がしますが、今回は何かしらのデータが同期できれば良いので、同期対象を変更します。
stackoverflow.com


同期可能なデータのみ同期します。
f:id:live-your-life-dd18:20200214170822p:plain


SQL Server Agentを再起動したところ、問題なく同期されました。
f:id:live-your-life-dd18:20200214171134p:plain

レプリケーションの待機時間を計測

トレーサートークンで同期時間を確認します。
f:id:live-your-life-dd18:20200214171252p:plain

SQL実行確認

レプリケーション元DBでデータを更新します。
f:id:live-your-life-dd18:20200214171505p:plain


レプリケーション先DBでもほぼ遅延なく同期されていることが確認できました。
f:id:live-your-life-dd18:20200214171542p:plain

感想及び所感

複数のパブリッシャーから1つのサブスクライバーに対してのレプリケーションは無事にできることを確認しました。
f:id:live-your-life-dd18:20200214171857p:plain

ただし、今回のトランザクションレプリケーションだと作成済みのフルテキストインデックスまでは自動でレプリケーションしてくれないようなので、必要であればレプリケーション先で再作成する必要がありそうです。