SQL Serverのトランザクションレプリケーションは、複数の宛先にデータをコピーまたは配布するために最も一般的に使用されるレプリケーション手法の1つです。以前の記事では、SQLServerレプリケーションとレプリケーションが内部でどのように機能するかについて説明しました。ここでの目標は、バックアップアプローチを使用してSQL Serverでトランザクションレプリケーションを構成する方法と、レプリケーションに記事を適切に追加または削除する方法を確認することです。適切な対策がないと、スナップショットが無効になるリスクがあり、レプリケーションを再構成する必要があります。
トランザクションレプリケーション管理
以前の記事では、以下の項目について段階的に説明しました。
- 配布の構成
- スナップショットオプションを使用してパブリケーションを構成する
- スナップショットオプションを使用してサブスクリプションを構成する
レプリケーションを構成する際、最初にディストリビューターを構成しました。次に、パブリケーションとサブスクリプションの作成に進みました。レプリケーションを削除またはクリーンアップするには、逆のプロセスを実行する必要があります。まず、サブスクリプションを削除し、次にパブリケーションを削除し、最後にディストリビューターまたはディストリビューションデータベースを削除する必要があります。
この記事では、以前に構成したSQLServerでトランザクションレプリケーションを削除してみます。バックアップアプローチを使用し、次の方法でレプリケーションに記事を追加またはレプリケーションから削除します。
- サブスクリプションの削除
- ドロップパブリケーション
- ディストリビューターまたはディストリビューションデータベースを削除する
- 上記の手順のいずれかが正しく機能しない場合は、レプリケーションを完全にクリーンアップします
- データベースバックアップを使用したレプリケーションの構成
- ウィザードとT-SQLの両方のアプローチを使用してレプリケーションから記事を削除する
- ウィザードとT-SQLの両方のアプローチを使用してレプリケーションに新しい記事を追加する
- ストアドプロシージャの記事を追加し、テーブルの記事とストアドプロシージャの記事の違いを調べます
サブスクリプションの削除
構成済みのレプリケーションを削除するには、最初にサブスクリプションを削除する必要があります。
SSMSで、パブリッシャーインスタンスに接続します>レプリケーション >ローカル出版物 。サブスクリプションを右クリック>削除 またはドロップ サブスクリプション:

SQL Serverは、アクションの確認を求めます:

はいをクリックします サブスクリプションを削除します。これにより、サブスクリプションが完全に削除されます。
私の現在の設定では、パブリッシャーとサブスクライバーの両方が同じインスタンス上にあります。したがって、検証のためにサブスクライバーインスタンスに接続するための要求は送信されませんでした。 SQL Serverの別のインスタンスにある場合は、サブスクライバーを削除する前に、サブスクライバーインスタンスに接続して検証するように求められます。

ドロップパブリケーションは内部でsp_droppublicationを使用します この手順を使用して、T-SQLアプローチを介してパブリケーションを手動で削除できます
ドロップパブリケーション
サブスクリプションが削除されたら、先に進んでパブリケーションを削除できます 。 AdventureWorks_Pubを右クリックします 削除を選択します メニューから:

そのアクションを確認するように求めるメッセージが表示されます。パブリケーションを削除することに注意してください。ただし、サブスクライバデータベースに複製されたすべてのレコードが削除されるわけではありません。これらの複製されたレコードをクリーンアップするには、データベースを手動で削除する必要があります。 はいをクリックします 。


パブリケーションをドロップすると、 sp_droppublicationが内部的に適用されます 手順。
ディストリビューターまたはディストリビューションデータベースを削除する
先ほど、ディストリビューションデータベースはシステムデータベースであると述べました。したがって、データベースを右クリックして、ユーザーデータベースのように削除オプションを選択しても、データベースを削除することはできません。ディストリビューションデータベースを右クリックすると、次のオプションしか表示されません。

ディストリビューションデータベースを削除する必要がある場合は、最初にレプリケーションを右クリックする必要があります。 ノード>無効 公開と配布 。

ウィザードが開きます。
デフォルトでは、2番目のオプション( いいえ、引き続きこのサーバーをパブリッシャーとして使用します )は、サーバー上のすべてのパブリケーションを誤ってドロップしないように選択されています。
この場合、パブリケーションは1つしかないので、クリーンアップしたいと思います。したがって、最初のオプションを選択します– はい、このサーバーでの公開を無効にします 。ディストリビューターを無効にするとともにまだ削除されていない場合は、サブスクリプションとともにすべてのパブリケーションを削除します。
サーバーにレプリケーションが1つだけ構成されている場合は、このウィザード自体を使用してすべてをクリーンアップできます。ただし、複数のレプリケーションが構成されている場合は、上記で共有されている標準の手順に従って、SQLServerでトランザクションレプリケーションを削除します。
次に、最初のオプションを選択する必要がありますはい、このサーバーでの公開を無効にします 、[次へ]をクリックします 。

新しいウィンドウで、次の両方のオプションをオンにします。公開と配布を無効にする および手順を含むスクリプトファイルを生成します…

スクリプトファイルを生成するには、ファイルを保存するパスを指定する必要があります。

次へをクリックします ウィザードで選択したオプションを表示します。すべてが正しく選択されていることを確認してください。

完了をクリックします 。

ディストリビューションデータベースを内部的に削除するには、 sp_dropdistributorを使用します 手順。
ディストリビューターを無効にすると、ディストリビューションデータベースがシステムデータベースから削除されていることがわかります。

上記の手順のいずれかが正しく機能しない場合は、レプリケーションを完全にクリーンアップします
サブスクリプションまたはパブリケーションが他のアプローチで削除された場合、SQL Serverでのトランザクションレプリケーションの削除に一貫性がなくなり、多くのエラーが発生します。サブスクリプションまたはパブリケーションのすべての残留物をクリーンアップするには、システムプロシージャ sp_removedbreplicationを使用できます。 。
exec_spremovedbreplication
上記の他のすべてのアプローチを試した後もレプリケーションの問題がまだある場合にのみ、この手順を実行してください。ストアドプロシージャsp_removedbreplication パブリッシャーデータベースまたはマスターデータベースから実行し、@dbnameをパブリッシャーデータベースの名前に置き換えた後に以下のコマンドを使用する必要があります。
exec_spremovedbreplication @dbname
バックアップアプローチを使用してレプリケーションを構成する
レプリケーションを完全に削除した後、バックアップアプローチを使用してSQLServerでトランザクションレプリケーションを再構成しましょう。以下の手順が含まれます:
- ディストリビューターを構成する
- パブリケーションを作成する
- パブリケーションのプロパティを変更して、フルバックアップまたは差分バックアップからサブスクリプションを作成できるようにします。
- パブリッシャーの完全バックアップを取り、サブスクライバーとして復元します。
- サブスクリプションを構成し、バックアップから初期化を開始します。
レプリケーションを構成するときに、ほとんどの手順をすでに実行しました。したがって、ここではこれらの手順について詳しく説明しません。
ディストリビューターとパブリケーションの構成
パブリケーションの作成ウィザードを使用して配布とパブリケーションの両方を構成する方法については、前の記事のステップバイステップの説明を参照してください。ウィザードが配布とパブリケーションを作成するために使用するT-SQLスクリプトを学習するには、ウィザードの最後のステップでスクリプトをファイルに生成し、以下に示すように[パブリケーションの作成]オプションをオフにしてスクリプトを実行しないでください。 。

次に、新しいクエリウィンドウに保存されたスクリプトファイルを開き、それらのスクリプトを使用してディストリビューターとパブリケーションを作成します。

コメントされた2行目に注意してください。これは、ウィザードに入力したすべてのパスワード値が、セキュリティ上の理由からNULLまたは空の文字列に変換されたことを示しています。 @password=空白の値で強調表示された行を見てください。これを正しいパスワード値に置き換え、パスワードを使用する他のセクションでも同じことを行い、スクリプトを実行します。


スクリプトは正常に実行されました。スクリプトを実行すると、ディストリビューションデータベースとその中のすべてのシステムテーブルが作成されたことがわかります。メッセージの最後に、ログリーダーエージェントジョブが作成され、起動されていることがわかります。
必要に応じて、結果を保存して、ディストリビューションデータベース内のすべてのテーブル、ビュー、および重要な手順について学習できます。この情報は、さらなるトラブルシューティングに役立ちます。
スクリプトが正常に実行されると、ディストリビューションデータベースとパブリケーションが正常に作成されたことがわかります。

パブリケーションのプロパティを変更して、完全バックアップまたは差分バックアップからサブスクリプションを作成できるようにします
データベースのサイズが非常に小さい場合、初期スナップショットの送信に必要な時間が速くなります。
一方、スナップショットを使用してSQL Serverでトランザクションレプリケーションを作成することは、次の場合には効率的ではありません。
- データベースが巨大な場合(300 GB以上)。初期スナップショットの送信に必要な時間が長すぎます。
- 加入者がネットワーク帯域幅の低いさまざまな場所にいる場合。その後、最初のスナップショットプロセスが数日間行われます。
したがって、フルバックアップの作成、FTP経由または物理的に他の場所への転送、そのバックアップの復元、およびサブスクライバーの初期化は、スナップショットアプローチと比較して大幅に高速になります。
パブリケーションがバックアップからの初期化をサポートできるようにするには、パブリケーションのプロパティの1つを変更する必要があります。 SSMSまたはT-SQLのいずれかを介して実行できます。
SSMSアプローチ
AdventureWorks_pubを右クリックします パブリケーションを選択し、プロパティを選択します :

サブスクリプションオプションをクリックします :

Trueを設定します バックアップファイルからの初期化を許可する [OK]をクリックします 。これにより、フルバックアップと差分バックアップの両方から初期化できるようになります。
T-SQLアプローチ
T-SQLでは、プロシージャを sp_changepublicationと呼ぶことができます。 このプロパティを変更します。
このプロパティを変更するスクリプトは次のとおりです。
USE AdventureWorks
GO
exec sp_changepublication @publication = 'AdventureWorks_pub', @property = 'allow_initialize_from_backup', @value = 'true'
パブリッシャーの完全バックアップを取り、サブスクライバーとして復元します
上記のPublicationプロパティを実装した後、完全バックアップを取る必要があることに注意する重要な要素。データベースのサイズが大きい場合は、フルバックアップを作成してサブスクライバーインスタンスのRECOVERYモードで復元し、上記の構成変更を行った後に差分バックアップを作成して、NORECOVERYモードでサブスクライバーデータベースに復元できます。
サブスクリプションを構成し、バックアップから初期化を開始します
繰り返しになりますが、ステップバイステップの説明を参照してください。必要なスクリプトを生成する必要がありますが、実行しないでください。重要なのは、完全バックアップまたは差分バックアップからサブスクリプションを初期化する T-SQLスクリプトのみを使用します。前回のサブスクリプションの作成時にこれらのスクリプトを作成しました。以下の開いているファイルを参照してください。
注 :サブスクリプション作成のスクリプトは、パブリッシャーデータベースから実行する必要があります。したがって、Publisherインスタンスに接続しているクエリウィンドウを開きます。

サブスクリプションをバックアップから初期化するには、いくつかの変更を加える必要があります。
- @sync_typeを変更します 自動からの値 バックアップで初期化する
- NULLまたは空の文字列に置き換えられたパスワードに正しいパスワードを入力します。サーバー内でエージェントサービスアカウントを使用したので、パスワードを変更する必要はありません。
- パラメータを追加します@backupdevicetype および@backupdevicename パブリッシャーサーバーでの完全バックアップまたは差分バックアップへのパスを指定します(スクリプトはそのサーバーで実行されます)。
完了すると、スクリプトは次のようになります。

スクリプトを実行してサブスクリプション構成を完了すると、以下に示すようにスクリプトが正常に完了します。

ステータスが示すように、サブスクリプションの作成中に配布エージェントSQLServerエージェントジョブが作成されて起動されました。
したがって、バックアップアプローチを使用してレプリケーションを正常に作成しました。これで、利用可能なサブスクリプションを確認できます。

レプリケーションモニターを起動し、サブスクライバーを右クリックします。レプリケーションステータスが表示されます:


ご覧のとおり、Snapshot Agentジョブを実行しなくても、すべてのデータがバックアップから正常に初期化されています。データベースでアクティブなトランザクションが発生していないため、現時点でレプリケーションモニターに「レプリケートされたトランザクションは利用できません」というメッセージが表示されます。
レプリケーションから記事を削除
レプリケーションウィザードまたはT-SQLスクリプトを使用してSQLServerでトランザクションレプリケーションを構成する方法を学習したので、これらの両方の方法を使用してレプリケーションから記事を削除する方法を確認できます。
ウィザードの使用
AdventureWorks_pubを右クリックします 出版物>プロパティ 。 記事をクリックします レプリケーションに含まれる記事のリストを表示します。

デフォルトでは、データベースオブジェクトは OBJECT_NAME(SCHEMA_NAME)の形式で一覧表示されます。 テストのために、Person.ContactTypeテーブルを削除しましょう。 レプリケーションから。
そのためには、 ContactTypeの前にあるチェックボックスをオフにします。 (人)。 SQL Serverは、警告または確認メッセージを表示します:

説明しているように、現在利用可能なスナップショットがある場合、記事の変更によりそれらのスナップショットは無効になります。
バックアップアプローチを使用して初期化し、スナップショットを使用していないため、このメッセージを無視してはいをクリックしても問題ありません。 このテーブルArticleをレプリケーションから削除します。 OKをクリックします レプリケーションからの記事の削除を完了します。
次に、 Person.ContactType テーブルがレプリケーションから削除されます。パブリッシャーで発生した変更は、サブスクライバーデータベースに送信されません。これは、 Person.ContactTypeのINSERT/UPDATE/DELETEレコードでテストできます。 テーブル。
T-SQLの使用
もう1つの方法は、 sp_droparticle を使用して、レプリケーションから記事を削除することです。 手順。
USE [AdventureWorks]
GO
EXEC sp_droparticle
@publication = N'AdventureWorks_pub',
@article = N'ContactType',
@force_invalidate_snapshot = 1;
GO
ウィザードまたはTSQLアプローチを介してレプリケーションに新しい記事を追加する
場合によっては(テーブルのメンテナンスなど)、メンテナンスの完了後にいくつかの記事を削除してレプリケーションに追加し直す必要がある場合があります。
レプリケーションから記事を削除する方法を正常に学習しました。レプリケーションに新しい記事を追加する方法を考えてみましょう。 Person.ContactTypeを追加します テーブル 以前にレプリケーションに戻しました。
ウィザードの使用
テーブル記事をレプリケーションに戻すには、パブリケーションを右クリックします。 >プロパティ >記事 。出版物で利用可能な記事のリストが表示されます。

Person.ContactTypeが見つかりませんでした テーブル–画面には、レプリケーションの一部であったテーブルのみが表示されます。 Publisherデータベースで使用可能なすべてのテーブルを表示するには、チェックを外します リストから選択した記事のみを表示する すべてのテーブルを表示します。

これで、 Person.ContactTypeが表示されます。 表がリストされています。
前に説明したように、主キーのないすべてのテーブルには赤い円があります。 ウィザードまたはT-SQLアプローチのいずれかを介してこれらのテーブルをレプリケーションに含めることができないことを示すアイコン。
ContactType(Person)を確認してください テーブルを使用してレプリケーションに追加し直し、[ OK]をクリックします 。

テーブルがレプリケーションに再度追加されます。ただし、この新しく追加されたテーブル記事の初期スナップショットを送信する方法を検討する必要があります。
これまでの記事を読んだことがあれば、それは正しいと思います。スナップショットエージェントジョブを実行して、このテーブルの初期スナップショットを送信するだけです。
今すぐやってみましょう– Publicationを右クリックします >スナップショットエージェントを表示する ステータス。

開始をクリックします 適格な記事のスナップショットを送信します。これらのデータをディストリビューションデータベースに送信し、最後にサブスクライバーデータベースに送信します。
T-SQLアプローチ
sp_addarticle を使用して、同様のアクションを実行できます。 手順。
以下のスクリプトは、レプリケーションに記事を追加します。
use [AdventureWorks]
GO
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'ContactType', @source_owner = N'Person', @source_object = N'ContactType'
, @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F
, @identityrangemanagementoption = N'manual', @destination_table = N'ContactType', @destination_owner = N'Person', @vertical_partition = N'false'
, @ins_cmd = N'CALL sp_MSins_PersonContactType'
, @del_cmd = N'CALL sp_MSdel_PersonContactType'
, @upd_cmd = N'SCALL sp_MSupd_PersonContactType'
GO
サブスクライバデータベースで作成された3つのプロシージャを適用して、INSERT / UPDATEおよびDELETE操作を処理することにより、テーブル記事に対してレプリケーションがどのように機能するかを以前に確認しました。
T-SQLアプローチを使用すると、これらのプロシージャがどのように参照されるかがわかります。必要に応じて、オブジェクト、宛先テーブル名、またはデフォルトのプロシージャの名前を変更できます。そのために、 sp_addarticleに変更を加えます 手順。
注 :レプリケーションに変更を加える場合は、それらすべてを適切に文書化する必要があります。そうしないと、後で災害につながる可能性があります。
ストアドプロシージャの記事を追加し、テーブルの記事とストアドプロシージャの記事の違いを調べます
ストアドプロシージャをレプリケーションに追加するには、記事に移動する必要があります ページを作成し、必要なストアドプロシージャを確認して、複製を取得します。 ビューについても同じことができます 、インデックス付きビュー 、またはユーザー定義関数 同様に。
違いの詳細については テーブルアーティクルとビュー/ストアドプロシージャ/インデックス付きビュー/ユーザー定義関数の間で、T-SQLを使用してすべてのカテゴリに各アーティクルを1つずつ追加できます。
レプリケーションへの新しいストアドプロシージャの記事の追加
use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'uspGetBillOfMaterials', @source_owner = N'dbo'
, @source_object = N'uspGetBillOfMaterials', @type = N'proc schema only', @description = null, @creation_script = null
, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @force_invalidate_snapshot = 1
, @destination_table = N'uspGetBillOfMaterials', @destination_owner = N'dbo'
レプリケーションへの新しいビュー記事の追加
use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'vVendorWithContacts', @source_owner = N'Purchasing'
, @source_object = N'vVendorWithContacts', @type = N'view schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop'
, @schema_option = 0x0000000008000001, @destination_table = N'vVendorWithContacts', @destination_owner = N'Purchasing'
GO
新しいインデックス付きビュー記事をレプリケーションに追加する
use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'vStateProvinceCountryRegion', @source_owner = N'Person'
, @source_object = N'vStateProvinceCountryRegion', @type = N'indexed view schema only', @description = null, @creation_script = null
, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001, @force_invalidate_snapshot = 1
, @destination_table = N'vStateProvinceCountryRegion', @destination_owner = N'Person'
新しいユーザー定義関数の記事をレプリケーションに追加する
use [AdventureWorks]
exec sp_addarticle @publication = N'AdventureWorks_pub', @article = N'ufnGetStock', @source_owner = N'dbo', @source_object = N'ufnGetStock'
, @type = N'func schema only', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x0000000008000001
, @force_invalidate_snapshot = 1, @destination_table = N'ufnGetStock', @destination_owner = N'dbo'
sp_addarticleを使用します 含まれている@type を変更するために必要な入力パラメータとオプションを使用して、任意のタイプの記事をレプリケーションに追加する手順 パラメータ。
パブリケーションを右クリックして、これらの記事をパブリケーションに追加することもできます。 >プロパティ >記事 そしてそれらをパブリケーションに追加します。
テーブル記事のプロパティ
それでは、 Articlesを使用してArticleプロパティを変更しましょう。 出版物のメニュー プロパティ:

お気に入りのPerson.ContactTypeをクリックします 表>記事のプロパティ 。 記事のプロパティを変更するオプションがあります このテーブルのみ、またはレプリケーションに含まれるすべてのテーブル。テストには、強調表示されたテーブル記事のプロパティの設定を選択します。 Person.ContactTypeのプロパティを表示するには テーブル。

この表で利用可能なすべてのオプションを参照してください記事:


オブジェクトと設定をサブスクライバーにコピーする およびステートメントの配信 レプリケーションの最も重要な設定です。これらのパラメータを変更する場合は、細心の注意を払う必要があります。
INSERT \ UPDATE \ DELETE配信形式をクリックして、以下のオプションを取得します。
- INSERT \ UPDATE \ DELETEステートメントを複製しない–特定のコマンドをサブスクライバーデータベースに送信しないように複製をカスタマイズします
- INSERT \ UPDATE \ DELETEステートメント–トランザクションログからデータを再構築するのではなく、INSERT \ UPDATE\DELETEステートメントをサブスクライバーに直接送信します
- CALL<ストアドプロシージャ>–上記の sp_addarticleに示されている組み込みのストアドプロシージャを実行します。 データを複製します。
- XCALL<ストアドプロシージャ>–拡張ストアドプロシージャを実行して、変更を複製します。

ストアドプロシージャの記事のプロパティ
記事のプロパティをクリックします プロパティを表示するためのストアドプロシージャのいずれか

ストアドプロシージャの重要なプロパティの1つは、複製オプションです。 –以下の利用可能なオプションを参照してください:

- ストアドプロシージャの定義のみ –ストアドプロシージャのDDL構造の変更のみを複製します。これは、ストアドプロシージャのデフォルトオプションです。
- ストアドプロシージャの実行 –このオプションを使用して、レプリケーションの負荷を軽減します。個々のコマンドを送信せずに、サブスクライバーでのストアドプロシージャの実行を介してすべての変更を実行します。次の記事では、データの大幅な変更を複製しながら、パフォーマンスの問題を解決するためのこの機能について説明します。
- SPのシリアル化されたトランザクションでの実行 –ストアドプロシージャの実行を選択するハイブリッドオプション プロシージャがシリアル化されたトランザクション内で実行される場合のみ。それ以外の場合は、個別のDMLコマンドとして複製されます。
記事のプロパティを表示
記事のプロパティをクリックします プロパティを取得するための任意のビュー :

インデックス付きビュー記事のプロパティ
記事のプロパティをクリックします プロパティのインデックス付きビューのいずれか :

ユーザー定義関数の記事のプロパティ
記事のプロパティをクリックします プロパティのユーザー定義関数

ビュー、インデックス付きビュー、およびユーザー定義関数のプロパティはほとんど同じです。したがって、それらをあまりカスタマイズすることはできません。
結論
レプリケーションに関連する別の強力な記事を読んでいただきありがとうございます。本日、サブスクリプション、パブリケーション、ディストリビューションデータベースの削除、および問題が発生した場合のレプリケーションの完全なクリーンアップの詳細を明確にしました。
バックアップから新しく初期化されたレプリケーションを構成し、レプリケーションに新しい記事を追加する方法、またはレプリケーションから削除する方法をテストしました。データベースをさらに操作し、特にデータベース間の不一致を見つけることで、プロのツールから大きな恩恵を受けることができます。 SQLServer用のdbForgeCompareBundleは、そのようなすべての違いを識別および分析し、それらを報告します。
次の記事では、頻繁に直面するレプリケーションの問題と、それらを専門的に解決する方法について説明します。