トランザクション レプリケーションに関する注意点

トランザクション レプリケーションについては、多くの注意事項があります。

  • トランザクション ログの領域。

  • ディストリビューション データベース用のディスク領域。

  • パブリッシュされた各テーブルの主キー。

  • トリガ。

  • Large Object (LOB) データ型。

  • 更新可能なサブスクリプション (使用される場合のみ)。更新可能なサブスクリプションに関する注意事項の詳細については、「トランザクション レプリケーションの更新可能なサブスクリプション」を参照してください。

トランザクション ログの領域

トランザクション レプリケーションを使用してパブリッシュされるデータベースごとに、そのトランザクション ログの領域を十分に割り当てる必要があります。ログ レコードはディストリビューション データベースに移動されるまで切り捨てられないため、パブリッシュされたデータベースのトランザクション ログは、同一のパブリッシュされていないデータベースのログよりも多くの領域を必要とする可能性があります。

ディストリビューション データベースが使用できない場合や、ログ リーダー エージェントが動作していない場合は、パブリケーション データベースのトランザクション ログは増加し続けます。ディストリビューション データベースに配信されていない、パブリッシュされた最も古いトランザクションより前のログを切り捨てることはできません。このような状況にログが対応できるように、トランザクション ログ ファイルを自動拡張するように設定することをお勧めします。詳細については、「CREATE DATABASE (Transact-SQL)」および「ALTER DATABASE (Transact-SQL)」を参照してください。

ディストリビューション データベースで "sync with backup" オプションを設定することをお勧めします。この設定により、ディストリビューション データベース内の対応するトランザクションがバックアップされるまで、パブリケーション データベースでのログの切り捨てが遅延されます。この結果、パブリケーション データベースのトランザクション ログのサイズが増加する可能性があります。このオプションの詳細については、「スナップショット レプリケーションおよびトランザクション レプリケーションのバックアップと復元の方式」を参照してください。

ディストリビューション データベースのディスク領域

ディストリビューション データベースにレプリケートされたトランザクションを格納できるだけのディスク領域があることを確認します。

  • スナップショット ファイルをサブスクライバですぐに使用できるようにしない場合 (既定の動作) は、トランザクションがすべてのサブスクライバにレプリケートされるまでの期間、または保有期間が終了するまでの期間のどちらか短い方の間、トランザクションは格納されます。

  • トランザクション パブリケーションを作成し、スナップショット ファイルをサブスクライバですぐに使用できるようにする場合は、トランザクションがすべてのサブスクライバにレプリケートされるまでの期間、またはスナップショット エージェントが実行されて新しいスナップショットが作成されるまでの期間のどちらか長い方の間、トランザクションは格納されます。スナップショット エージェントが実行される間隔の時間が、パブリケーションの最大ディストリビューション保有期間 (既定値は 72 時間) よりも長い場合、保有期間よりも古いトランザクションはディストリビューション データベースから削除されます。詳細については、「サブスクリプションの有効期限と非アクティブ化」を参照してください。

サブスクライバで利用できるスナップショットを作成すると、新しいサブスクライバのパブリケーションへのアクセス速度をすぐに上げられます。ただし、このオプションを使用した場合、ディストリビューション データベースにはより大きなディスク ストレージが必要になる可能性があります。これは、スナップショット エージェントが実行されるたびに新しいスナップショットが生成されることも意味します。このオプションを使用しない場合は、新しいサブスクリプションがある場合にのみ、新しいスナップショットが生成されます。

パブリッシュされた各テーブルの主キー

トランザクション レプリケーションのパブリッシュされたすべてのテーブルは、宣言された主キーを保持する必要があります。Transact-SQL ステートメントの ALTER TABLE (Transact-SQL) を使用して主キーを追加することにより、既存のテーブルをパブリッシュ用に準備できます。

トリガ

サブスクリプション データベースでトリガを使用する際は、以下の問題点に注意してください。

  • 既定では、トリガは、XACT_ABORT 設定が ON になった状態で実行されます。ディストリビューション エージェントがサブスクライバでの変更を適用している間に、トリガ内のステートメントによってエラーが発生した場合は、個別のステートメントではなく変更部分のバッチ全体が失敗します。トランザクション レプリケーションでは、ディストリビューション エージェントの -SkipErrors パラメータを使用して、エラーの原因になっているステートメントをスキップできます。XACT_ABORT が ON の状態で -SkipErrors が使用される場合は、ステートメントによってエラーが発生すると、変更部分のバッチ全体がスキップされます。トリガ内で XACT_ABORT を ON に設定する必要がない場合は、-SkipErrors パラメータを使用する際に XACT_ABORT を OFF に設定することをお勧めします。オプションをオフに設定するには、トリガの定義で SET XACT_ABORT OFF を指定します。XACT_ABORT の詳細については、「SET XACT_ABORT (Transact-SQL)」を参照してください。-SkipErrors パラメータの詳細については、「トランザクション レプリケーションでのエラーのスキップ」を参照してください。

  • サブスクライバでは、トリガ内に明示的なトランザクションを含めないことをお勧めします。トランザクション レプリケーションによって、トランザクション バッチ処理の使用によるネットワークのラウンドトリップ数が削減され、これによってパフォーマンスが向上します。ROLLBACK ステートメントを含むトリガがサブスクライバで追加された場合、トランザクションのバッチがキャンセルされ、サーバー エラー 266 が生成されることがあります ("EXECUTE 後のトランザクション数は、COMMIT TRANSACTION または ROLLBACK TRANSACTION ステートメントがないことを示しています。以前の数 = %ld、現在の数 = %ld")。バッチは、複数のトランザクションからのコマンドが含まれたり、パブリッシャにおける大きなトランザクションの一部になる可能性があります。このため、トランザクションのロールバックによって、トランザクション整合性が損なわれることがあります。

    明示的にトランザクションを含める場合は、トリガ内のすべての COMMIT ステートメントに対応する BEGIN TRANSACTION ステートメントがあることを確認してください。COMMIT に対応する BEGIN TRANSACTION がない場合、サブスクライバへの行の変更は非トランザクション処理となります。また、ディストリビューション エージェントでサーバー エラー 266 が発生し、トランザクションまたはコマンドのバッチをロールバックして、それらの再適用を試行した場合、さらにエラーが発生することがあります。エージェントが既に適用済みのコマンドを適用しようとすると、重複キーによるエラーになります。

トリガの詳細については、「NOT FOR REPLICATION を使用した制約、ID、およびトリガの制御」を参照してください。

Large Object (LOB) データ型

トランザクション レプリケーションでは、LOB のパブリッシュをサポートし、LOB 列上で一部の更新を実行します。LOB 列が更新されると、列内のすべてのデータではなく、変更されたデータの部分のみがレプリケートされます。

パブリッシュされたテーブルに LOB が含まれている場合、ディストリビューション エージェントのパラメータ -UseOledbStreaming-OledbStreamThreshold、および -PacketSize の使用を検討してください。これらのパラメータの最も簡単な設定方法は、[OLE DB ストリーム用ディストリビューション プロファイル] という名前のディストリビューション エージェント プロファイルを使用することです。詳細については、「レプリケーション エージェント プロファイル」を参照してください。これらの事前定義済みのプロファイル以外に、作成または変更したエージェント プロファイルで、またはコマンド ラインで、パラメータを指定できます。詳細については、以下のトピックを参照してください。

text、ntext、および image の各データ型

トランザクション パブリケーションで text、ntext、および image の各データ型をレプリケートする処理については、多くの注意事項があります。text、ntext、image の各データ型ではなく、データ型 varchar(max)、nvarchar(max)、および varbinary(max) を使用することをお勧めします。

text、ntext、または image を使用する場合は、以下の点に注意してください。

  • WRITETEXT と UPDATETEXT ステートメントは、明示的なトランザクションに含める必要があります。

  • パブリッシュされたテーブルで WITH LOG オプションと共に WRITETEXT と UPDATETEXT を使用することにより、ログに記録されるテキスト操作をレプリケートできます。トランザクション レプリケーションはトランザクション ログ内の変更を追跡するため、WITH LOG オプションが必要です。

  • UPDATETEXT 操作を使用できるのは、すべてのサブスクライバが SQL Server を実行している場合のみです。WRITETEXT 操作は UPDATE ステートメントとしてレプリケートされるため、これらは SQL Server 以外のサブスクライバと共に使用することもできます。

  • 構成可能パラメータ max text repl size は、text 型、ntext 型、varchar(max) 型、nvarchar(max) 型、および image 型データをレプリケートできる最大サイズをバイト単位で制御します。これにより、ODBC ドライバと OLE DB プロバイダ、これらのデータ型の大きな値を処理できない SQL Server データベース エンジンのインスタンス、およびシステム リソース (仮想メモリ) 制約があるディストリビュータのサポートが可能になります。これらのデータ型のいずれかを含む列がパブリッシュされ、構成された限度を超えて、INSERT、UPDATE、WRITETEXT、または UPDATETEXT 操作のいずれかが実行されると、その操作は失敗します。

    max text repl size パラメータを設定するには、sp_configure (Transact-SQL) システム ストアド プロシージャを使用します。

  • text、ntext、および image 列をパブリッシュするときは、UPDATETEXT または WRITETEXT 操作と同じトランザクション内で読み取りを繰り返し行って、テキスト ポインタを取得する必要があります。たとえば、あるトランザクションで取得したテキスト ポインタを別のトランザクションで使用しないでください。移動済みで無効になっていることがあります。

    さらに、テキスト ポインタを取得したときは、UPDATETEXT または WRITETEXT ステートメントを実行する前に、テキスト ポインタで示されるテキスト位置を変更する操作 (主キーの更新など) を実行しないでください。

    次に、レプリケートされるデータで UPDATETEXT および WRITETEXT 操作を使用する推奨方法を示します。

    1. トランザクションを開始します。

    2. TEXTPTR() 関数を使用して、テキスト ポインタを REPEATABLE READ 分離レベルで取得します。

    3. UPDATETEXT または WRITETEXT 操作で、テキスト ポインタを使用します。

    4. トランザクションをコミットします。

      注意注意

      同じトランザクションでテキスト ポインタを取得しない場合は、パブリッシャで変更は許可されますが、サブスクライバに変更がパブリッシュされることはありません。

    例 :

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
    BEGIN TRAN
    DECLARE @mytextptr varbinary(16)
    SELECT @mytextptr = textptr(Notes)
    FROM Employees 
    WHERE EmployeeID = '7'
    IF @mytextptr IS NOT NULL 
    BEGIN
    UPDATETEXT Employees.Notes @mytextptr 0 NULL 'Terrific job this review period.'
    -- Dummy update to fire trigger that will update metadata and ensure the update gets propagated to other Subscribers.
    UPDATE Employees 
    -- Set value equal to itself.
    SET Notes = Notes
    WHERE EmployeeID = '7' 
    END
    COMMIT TRAN 
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    
注意注意

この例は、既定ではインストールされない Northwind データベースに基づいています。このデータベースのインストール方法については、Microsoft ダウンロード センターで「Northwind および pubs サンプル データベース」を参照してください。

サブスクライバ データベースのサイズ変更には注意が必要です。レプリケートされた text、ntext、および image 列のテキスト ポインタは、パブリッシャで初期化されていない場合でも、サブスクライバ テーブルでは初期化する必要があります。その結果、ディストリビューション タスクによりサブスクライバ テーブルに追加される各 text、ntext、および image 列は、内容が空でも、少なくとも 43 バイトのデータベース領域を消費することになります。