レプリケーションの管理者に関してよく寄せられる質問

ここでは、レプリケートされたデータベースの管理者が行うさまざまなタスクについての指針となるような質問と回答を掲載します。

レプリケーションの構成

データベースをパブリッシュするときに、データベースに対する操作を停止する必要がありますか。

いいえ。パブリケーションの作成中でもデータベースの操作を継続することができます。ただし、スナップショットの生成には大量のリソースが必要な点に注意してください。そのため、スナップショットはデータベースでの操作が少ない時間帯に生成することをお勧めします (既定では、パブリケーションの新規作成ウィザードを終了するとスナップショットが生成されます)。

テーブルはスナップショット生成中にロックされますか。

ロックが設定される時間の長さは、使用するレプリケーションの種類によって以下のように異なります。

  • マージ パブリケーションの場合、スナップショット エージェントはロックを設定しません。

  • トランザクション パブリケーションの場合、既定では、スナップショット エージェントによりスナップショット生成の初期フェーズの間だけロックが設定されます。

  • スナップショット パブリケーションの場合、スナップショット エージェントがスナップショット生成処理の間中、ロックを設定します。

ロックが設定されると他のユーザーがテーブルを更新できなくなるため、特にスナップショット パブリケーションの場合、データベースに対する操作が少ない時間帯にスナップショット エージェントを起動するようにスケジュールを設定することをお勧めします。

サブスクリプションはいつ利用可能になりますか。また、サブスクリプション データベースはいつ利用可能になりますか。

サブスクリプションは、スナップショットがサブスクリプション データベースに適用された後で利用可能になります。それ以前にもサブスクリプション データベースにアクセスできますが、スナップショットの適用が完了するまではデータベースを使用しないでください。スナップショットの生成と適用の状態を確認するには、レプリケーション モニターを使用します。

ディストリビューション エージェントまたはマージ エージェントの開始時にスナップショット エージェントが完了していなかったらどうなりますか。

ディストリビューション エージェントまたはマージ エージェントがスナップショット エージェントと同時に実行されてもエラーになることはありません。ただし、以下の点に注意してください。

レプリケーションの構成をスクリプト化する必要がありますか。

はい。レプリケーション構成をスクリプト化するのは、レプリケーション トポロジの障害復旧計画の重要な部分です。スクリプト作成の詳細については、「レプリケーションのスクリプト作成」を参照してください。

レプリケートされたデータベースでは、どの復旧モデルが必要ですか。

単純復旧モデル、一括ログ復旧モデル、完全復旧モデルのいずれの復旧モデルでも、レプリケーションは正常に機能します。マージ レプリケーションでは、メタデータ テーブルに情報を格納することで変更が追跡されます。トランザクション レプリケーションでは、トランザクション ログにマークを付けることにより変更が追跡されますが、復旧モデルによってこのマーク設定処理が影響を受けることはありません。

レプリケーションによって列が追加されるのはなぜですか。この列は、テーブルのパブリッシュをやめると削除されますか。

変更を追跡するため、マージ レプリケーションとキュー更新サブスクリプションを使用したトランザクション レプリケーションでは、パブリッシュされたすべてのテーブルのすべての行を一意に識別できる必要があります。これには、以下を行う必要があります。

  • マージ レプリケーションでは、列 rowguid がすべてのテーブルに追加されます。ただし、データ型が uniqueidentifierROWGUIDCOL プロパティが設定されている列が、テーブルに既にある場合を除きます (このような列がある場合は、その列が使用されます)。テーブルがパブリケーションから削除されると、rowguid 列も削除されます。既存の列を追跡に使用していた場合は、その列は削除されません。

  • トランザクション パブリケーションがキュー更新サブスクリプションをサポートしている場合は、レプリケーションによってすべてのテーブルに msrepl_tran_version 列が追加されます。テーブルがパブリケーションから削除されても、msrepl_tran_version 列は削除されません。

  • レプリケーションで行を識別するために使用される rowguidcol はフィルターに含めないでください。既定では、これは、マージ レプリケーションの設定時に追加された列で、rowguid という名前が付いています。

パブリッシュされたテーブルの制約はどのように管理すればよいですか。

パブリッシュされたテーブル上の制約については、注意すべき問題がいくつかあります。

  • トランザクション レプリケーションでは、パブリッシュされた各テーブルで主キー制約が必要です。マージ レプリケーションでは主キーは不要ですが、もし主キーがある場合には、レプリケートする必要があります。スナップショット レプリケーションでは主キーは不要です。

  • 既定では、主キー制約、インデックス、および CHECK 制約がサブスクライバーにレプリケートされます。

  • 外部キー制約と CHECK 制約に対しては、NOT FOR REPLICATION オプションが既定で指定されます。この制約は、ユーザー操作に対しては適用されますが、エージェント操作には適用されません。詳細については、「NOT FOR REPLICATION を使用した制約、ID、およびトリガの制御」を参照してください。

制約がレプリケートされるかどうかを制御するスキーマ オプションの設定の詳細については、「スキーマ オプションを指定する方法 (SQL Server Management Studio)」および「スキーマ オプションを指定する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。

ID 列はどのように管理すればよいですか。

サブスクライバーでの更新を含むレプリケーション トポロジでは、自動 ID 範囲管理が提供されます。詳細については、「ID 列のレプリケート」を参照してください。

同じオブジェクトを複数のパブリケーションでパブリッシュすることはできますか。

はい。ただし、制限があります。詳細については、「データとデータベース オブジェクトのパブリッシュ」の「複数のパブリケーションでのテーブルのパブリッシュ」を参照してください。

複数のパブリケーションで同じディストリビューション データベースを使用できますか。

できます。同じディストリビューション データベースを使用するパブリケーションの数や種類に制限はありません。指定されたパブリッシャーのすべてのパブリケーションで、同じディストリビューターとディストリビューション データベースを使用する必要があります。

複数のパブリケーションがある場合は、ディストリビューターで複数のディストリビューション データベースを構成することにより、各ディストリビューション データベースのデータ フローを、単一のパブリケーションから渡すことができます。ディストリビューション データベースを追加するには、[ディストリビューターのプロパティ] ダイアログ ボックスか sp_adddistributiondb (Transact-SQL) を使用します。このダイアログ ボックスへのアクセスの詳細については、「ディストリビュータのプロパティを表示および変更する方法 (SQL Server Management Studio)」を参照してください。

データベース内のどのオブジェクトがパブリッシュされているかなどの、ディストリビューターとパブリッシャーについての情報は、どうすれば参照できますか。

この情報は、SQL Server Management Studio およびいくつかのレプリケーション ストアド プロシージャを使用して参照できます。詳細については、「レプリケーションのプロパティ」および「ディストリビューターおよびパブリッシャーの情報スクリプト」を参照してください。

レプリケーションではデータが暗号化されますか。

いいえ。レプリケーションでは、データベースに格納されるデータやネットワーク経由で転送されるデータは暗号化されません。詳細については、「セキュリティの概要 (レプリケーション)」の「暗号化」を参照してください。

インターネット経由でデータをレプリケートするにはどうすればよいですか。

インターネット経由のデータのレプリケーションでは、以下を使用します。

すべての種類の Microsoft SQL Server レプリケーションは VPN 経由でデータをレプリケートできますが、マージ レプリケーションを使用している場合は Web 同期を検討してください。

接続が切断された場合にレプリケーションは再開されますか。

はい。接続が切断された場合には、中断した時点からレプリケーション処理が再開されます。不安定なネットワーク経由でマージ レプリケーションを使用している場合は、論理レコードの利用を検討してください。これにより、関連する変更が 1 つの単位として処理されるようになります。詳細については、「論理レコードによる関連行への変更のグループ化」を参照してください。

低帯域接続経由でもレプリケーションは機能しますか。圧縮は行われますか。

はい。低帯域接続経由でもレプリケーションは機能します。TCP/IP 経由の接続では、プロトコルによって提供される圧縮を利用しますが、それ以外の圧縮は行われません。HTTPS 経由の Web 同期接続の場合は、プロトコルで提供される圧縮に加え、変更をレプリケートするために使用する XML ファイルの圧縮も使用されます。低帯域接続経由でのレプリケーションの詳細については、「低速ネットワークが引き起こす問題」を参照してください。

ログインとオブジェクトの所有権

ログインとパスワードはレプリケートされますか。

いいえ。ただし、DTS パッケージを作成することで、ログインとパスワードをパブリッシャーから 1 つ以上のサブスクライバーに転送することができます。詳細については、「パッケージの設計と実装 (Integration Services)」を参照してください。

スキーマとは何ですか。また、スキーマはどのようにレプリケートされますか。

Microsoft SQL Server 2005 以降では、スキーマには次の 2 つの意味があります。

  • CREATE TABLE ステートメントなどの、オブジェクトの定義。既定では、レプリケートされるすべてのオブジェクトの定義がサブスクライバーにコピーされます。

  • オブジェクトが作成される名前空間 <Database>.<Schema>.<Object>。スキーマは、CREATE SCHEMA ステートメントで定義します。スキーマの詳細については、「スキーマ (データベース エンジン)」を参照してください。

  • 既定では、パブリケーションの新規作成ウィザードは、スキーマとオブジェクトの所有権に関して、以下のように動作します。

  • 互換性レベル 90 以上のマージ パブリケーションと、スナップショット パブリケーション、およびトランザクション パブリケーションのアーティクルの場合、既定では、サブスクライバーでのオブジェクト所有者は、パブリッシャーでの対応するオブジェクトの所有者と同じになります。オブジェクトを所有するスキーマがサブスクライバーに存在しない場合は、スキーマが自動的に作成されます。

  • 互換性が 90 未満のマージ パブリケーションのアーティクルの場合は、既定で所有者は空白になり、サブスクライバー上でのオブジェクトの作成中に dbo として指定されます。

  • Oracle パブリケーションのアーティクルの場合。既定では、所有者名が dbo と指定されます。

  • キャラクター モードのスナップショット (SQL Server 以外のバージョンのサブスクライバーや SQL Server Compact 3.5 SP2 サブスクライバーで使用されます) を使用するパブリケーションのアーティクルの場合。既定では、所有者は空白のままになります。既定では、サブスクライバーに接続したディストリビューション エージェントまたはマージ エージェントが使用するアカウントに関連付けられた所有者になります。

オブジェクトの所有者は、[アーティクルのプロパティ - <Article>] ダイアログ ボックスと、ストアド プロシージャ sp_addarticlesp_addmergearticlesp_changearticle、および sp_changemergearticle で変更できます。詳細については、「パブリケーションとアーティクルのプロパティを表示および変更する方法 (SQL Server Management Studio)」、「アーティクルを定義する方法 (レプリケーション Transact-SQL プログラミング)」および「アーティクルのプロパティを表示および変更する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。

サブスクリプション データベースの権限をパブリケーション データベースの権限に一致させるには、どのように構成すればよいですか。

既定では、レプリケーションではサブスクリプション データベース上で GRANT ステートメントは実行されません。サブスクリプション データベース上の権限をパブリケーション データベース上の権限に一致させる場合は、次のいずれかの方法を使用します。

サブスクリプションを再初期化すると、サブスクリプション データベースに付与された権限はどうなりますか。

既定では、サブスクリプションを再初期化すると、サブスクライバーのオブジェクトは削除され、その後、再作成されます。それらのオブジェクトに対して付与された権限は削除されます。これに対処するには、2 つの方法があります。

  • 再初期化後に、前のセクションで説明した方法を使用して、権限を再適用します。

  • サブスクリプションを再初期化するときに、オブジェクトを削除しないように指定します。再初期化の前に、次のいずれかを実行します。

    • sp_changearticle または sp_changemergearticle を実行します。@property パラメーターの値として「pre_creation_cmd」 (sp_changearticle) または「pre_creation_command」 (sp_changemergearticle) を指定し、@value パラメーターの値として「none」、「delete」、または「truncate」を指定します。

    • [アーティクルのプロパティ - <Article>] ダイアログ ボックスの [対象オブジェクト] セクションで、[既存のオブジェクトを変更せずに保持します][データを削除します。アーティクルに行フィルターがある場合は、フィルターに一致するデータのみを削除します。]、または [名前が使用中である場合のアクション] オプションの [既存のオブジェクト内にあるすべてのデータを切り捨てます] の値を選択します。このダイアログ ボックスへのアクセスの詳細については、「パブリケーションとアーティクルのプロパティを表示および変更する方法 (SQL Server Management Studio)」を参照してください。

データベースのメンテナンス

パブリッシュされたテーブルで TRUNCATE TABLE を実行できないのはなぜですか。

TRUNCATE TABLE はログに記録されない操作であり、トリガーも起動されません。操作による変更を追跡できないため、TRUNCATE TABLE は許可されていません。トランザクション レプリケーションでは、トランザクション ログを通じて変更が追跡され、マージ レプリケーションでは、パブリッシュされたテーブルのトリガーを通じて変更が追跡されます。

レプリケートされたデータベース上で一括挿入コマンドを実行するとどのような影響がありますか。

トランザクション レプリケーションの場合、他の挿入と同様に一括挿入も追跡およびレプリケートされます。マージ レプリケーションでは、変更を追跡するメタデータが正しく更新されるようにする必要があります。詳細については、「マージ レプリケーションに関する注意点」の「パブリッシュされたテーブルへのデータの一括挿入」を参照してください。

バックアップと復元を行うときにレプリケーションに関する注意点はありますか。

はい。データベースのレプリケーションに関係する特別な注意点がいくつかあります。詳細については、「レプリケートされたデータベースのバックアップと復元」を参照してください。

レプリケーションはトランザクション ログの大きさに影響しますか。

マージ レプリケーションとスナップショット レプリケーションは、トランザクション ログのサイズには影響しません。ただし、トランザクション レプリケーションは影響する場合があります。データベースに 1 つ以上のトランザクション パブリケーションが含まれている場合、それらのパブリケーションに関連するすべてのトランザクションがディストリビューション データベースに配布されるまで、トランザクション ログの切り捨ては行われません。トランザクション ログが大きくなりすぎ、ログ リーダー エージェントをスケジュールによって実行している場合は、実行間隔を短くすることを検討してください。または、連続モードで実行するように設定してください。連続モードで実行するように設定されている場合は (既定値)、実行中であることを確認してください。ログ リーダー エージェントの状態を確認する方法の詳細については、「パブリケーションに関連付けられているエージェントの情報を表示したりタスクを実行する方法 (レプリケーション モニタ)」を参照してください。

また、パブリケーション データベースまたはディストリビューション データベース上で "sync with backup" オプションを設定している場合は、すべてのトランザクションのバックアップが完了するまでトランザクション ログの切り捨ては行われません。トランザクション ログが大きくなりすぎ、かつ、このオプションを設定している場合は、トランザクション ログのバックアップ間隔を短くしてください。トランザクション レプリケーションに関連するデータベースのバックアップと復元の詳細については、「スナップショット レプリケーションおよびトランザクション レプリケーションのバックアップと復元の方式」を参照してください。

レプリケートされたデータベースのインデックスやテーブルを再構築するにはどうすればよいですか。

インデックスの再構築にはいくつかのメカニズムがあります。どのメカニズムもレプリケーションに関して特別な注意をせずに使用できます。ただし、トランザクション パブリケーションのテーブルでは主キーが必要なため、主キーの削除や再作成を行うことはできません。

パブリケーション データベースとサブスクリプション データベース上でインデックスを追加または変更するにはどうすればよいですか。

レプリケーションに関して特別な注意をしなくても、パブリッシャーまたはサブスクライバーでインデックスを追加できます (インデックスがパフォーマンスに影響する点に注意してください)。CREATE INDEX および ALTER INDEX はレプリケートされないため、たとえばパブリッシャーでインデックスを追加または変更した場合、サブスクライバーに反映するためには、同じ追加または変更を行う必要があります。

レプリケーションに関連するデータベースのファイルは、どのように移動または名前の変更を行うのですか。

SQL Server 2005 より前のバージョンの SQL Server では、データベース ファイルの移動または名前の変更を行うには、データベースのデタッチと再アタッチが必要でした。レプリケートされたデータベースはデタッチできないため、まずデータベースからレプリケーションを削除する必要がありました。SQL Server 2005 以降では、データベースのデタッチと再アタッチを行わなくてもファイルの移動や名前の変更が行え、レプリケーションに影響を与えることもありません。ファイルの移動と名前変更の詳細については、「ALTER DATABASE (Transact-SQL)」を参照してください。

レプリケートされているテーブルを削除するにはどうすればよいですか。

まず sp_droparticlesp_dropmergearticle[パブリケーションのプロパティ - <Publication>] ダイアログ ボックスのいずれかを使用してパブリケーションからアーティクルを削除し、次に DROP <Object> を使用してデータベースからアーティクルを削除します。サブスクリプションを追加した後で、スナップショット パブリケーションまたはトランザクション パブリケーションからアーティクルを削除することはできません。まずサブスクリプションを削除する必要があります。詳細については、「既存のパブリケーションへのアーティクルの追加および削除」を参照してください。

パブリッシュされたテーブル上の列を追加または削除するにはどうすればよいですか。

SQL Server では、列の追加や削除などの、パブリッシュされたオブジェクトに対するスキーマのさまざまな変更がサポートされています。たとえば、パブリッシャーで ALTER TABLE ... DROP COLUMN を実行すると、ステートメントがサブスクライバーにレプリケートされて実行され、列が削除されます。SQL Server 2005 より前のバージョンの SQL Server が実行されているサブスクライバーでは、ストアド プロシージャ sp_repladdcolumn および sp_repldropcolumn で列の追加と削除がサポートされています。詳細については、「パブリケーション データベースでのスキーマの変更」を参照してください。

レプリケーションのメンテナンス

サブスクライバーのデータがパブリッシャーのデータと同期していることはどうすれば判断できますか。

検証機能を使用します。検証では、指定したサブスクライバーがパブリッシャーと同期されているかどうかがレポートされます。詳細については、「レプリケートされたデータの検証」を参照してください。正しく同期されていない行がある場合、検証を行っても、同期されていない行についての情報が表示されませんが、tablediff ユーティリティでは表示されます。

既存のパブリケーションにテーブルを追加するにはどうすればよいですか。

テーブル (または他のオブジェクト) を追加するときに、パブリケーション データベースまたはサブスクリプション データベースに対する操作を停止する必要はありません。パブリケーションにテーブルを追加するには、[パブリケーションのプロパティ - <Publication>] ダイアログ ボックスか、ストアド プロシージャ sp_addarticle および sp_addmergearticle を使用します。詳細については、「既存のパブリケーションへのアーティクルの追加および削除」を参照してください。

パブリケーションからテーブルを削除するにはどうすればよいですか。

パブリケーションからテーブルを削除するには、sp_droparticlesp_dropmergearticle、または [パブリケーションのプロパティ - <Publication>] ダイアログ ボックスを使用します。サブスクリプションを追加した後で、スナップショット パブリケーションまたはトランザクション パブリケーションからアーティクルを削除することはできません。まずサブスクリプションを削除する必要があります。詳細については、「既存のパブリケーションへのアーティクルの追加および削除」を参照してください。

サブスクリプションの再初期化が必要となる操作にはどのようなものがありますか。

アーティクルやパブリケーションに対する変更の中には、サブスクリプションの再初期化が必要になるものがあります。詳細については、「パブリケーションおよびアーティクルのプロパティの変更」を参照してください。

スナップショットが無効になる操作にはどのようなものがありますか。

アーティクルやパブリケーションに対する変更の中には、スナップショットが無効になり、新しいスナップショットを生成する必要が生じるものがあります。詳細については、「パブリケーションおよびアーティクルのプロパティの変更」を参照してください。

レプリケーションを削除するにはどうすればよいですか。

データベースからレプリケーションを削除するために必要な操作は、データベースがパブリケーション データベースであるか、サブスクリプション データベースであるか、その両方であるかによって異なります。詳細については、「レプリケーションの削除」を参照してください。

レプリケートする必要のあるトランザクションまたは行があるかどうかはどうすれば判断できますか。

トランザクション レプリケーションの場合は、ストアド プロシージャか、レプリケーション モニターの [未配布のコマンド] タブを使用します。詳細については、「レプリケートされたコマンドなどディストリビューション データベースに格納されている情報を表示する方法 (レプリケーション Transact-SQL プログラミング)」および「サブスクリプションに関連付けられているエージェントの情報を表示し、タスクを実行する方法 (レプリケーション モニタ)」を参照してください。

マージ レプリケーションの場合は、ストアド プロシージャ sp_showpendingchanges を使用します。詳細については、「sp_showpendingchanges (Transact-SQL)」を参照してください。

ディストリビューション エージェントがどの程度遅れているのか、再初期化が必要かどうかを確認する方法はありますか。

ストアド プロシージャ sp_replmonitorsubscriptionpendingcmds か、レプリケーション モニターの [未配布のコマンド] タブを使用します。ストアド プロシージャとタブには、次の内容が表示されます。

  • ディストリビューション データベース内で、選択したサブスクライバーにまだ配信されていないコマンドの数。1 つのコマンドは、1 つの Transact-SQL データ操作言語 (DML) ステートメントか、1 つのデータ定義言語 (DDL) ステートメントから成ります。

  • コマンドをサブスクライバーに配信するのに必要な予測される時間。この値が、スナップショットを生成してサブスクライバーに適用するのに必要な時間より長い場合は、サブスクライバーの再初期化を検討してください。詳細については、「サブスクリプションの再初期化」を参照してください。

詳細については、「sp_replmonitorsubscriptionpendingcmds (Transact-SQL)」および「サブスクリプションに関連付けられているエージェントの情報を表示し、タスクを実行する方法 (レプリケーション モニタ)」を参照してください。

レプリケーションおよびその他のデータベース機能

レプリケーションはログ配布やデータベース ミラーリングと組み合わせて使用できますか。

はい。詳細については、「レプリケーションとログ配布」および「レプリケーションおよびデータベース ミラーリング」を参照してください。

レプリケーションはクラスタリングと組み合わせて使用できますか。

はい。データはすべてクラスターの 1 つのディスク セットに格納されるため、特別な注意は不要です。