トランザクション レプリケーションを構成するときのエラー 1205

この記事は、SQL Serverでトランザクション レプリケーションを構成するときに発生する問題を解決するのに役立ちます。

元の製品バージョン: SQL Server
元の KB 番号: 2674882

現象

次のような状況で問題が発生します。

  • トランザクション レプリケーションは、SQL Serverで構成します。
  • トランザクション レプリケーション トポロジは、複数のパブリッシャーで構成されます。
  • パブリッシャーは、同じサブスクライバー データベースにデータをレプリケートします。
  • ディストリビューション エージェントは継続的に実行されるか、頻繁なスケジュールで実行されます。 たとえば、ディストリビューション エージェントは 1 分ごとに実行されます。

このシナリオでは、ディストリビューション エージェントがデッドロック シナリオに関与し、デッドロックの対象として選択される可能性があります。 この問題が発生すると、次のようなエラー メッセージが表示されることがあります。

エラー 1205
トランザクション (プロセス ID %d) が別のプロセスで %.*ls リソースでデッドロックされ、デッドロックの対象として選択されました。 Rerun the transaction.

トレース フラグ 1222 を有効にしてデッドロック情報をSQL Serverエラー ログにリダイレクトすると、次のいずれかのエラー メッセージが表示されます。

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(case datalength(transaction_timestamp) when 16 then isnull(substring(transaction_timestamp, 16, 1), 0) else 0 end as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 および publication subscription_type = @P5 0

  • update MSreplication_subscriptions set transaction_timestamp = cast(@P1 as binary(15)) + cast(substring(transaction_timestamp, 16, 1) as binary(1)), "time" = @P2 where UPPER(publisher) = UPPER(@P3) and publisher_db = @P4 and publication = @P5 and subscription_type = 0 and (substring(transaction_timestamp, 16, 1) = 0 or datalength(transaction_timestamp) 16) <

原因

この問題は、数値 MSreplication_subscriptions システム テーブルの行数の見積もりが正しくない場合に発生します。 行数の見積もりが正しくない場合、データベース エンジンSQL Serverが正しくないメソッドを使用してデータベースを更新する可能性があります。

注:

通常、正しい行数の見積もりは、データベース内のサブスクリプションの数と等しくなります。 サブスクリプション ストリーム機能を使用する場合、行数の見積もりは、サブスクリプションの数に、サブスクリプションごとに構成されたストリームの数を乗算した数に等しくなります。

解決方法

この問題を解決するには、以下のいずれかの手順を実行します。

  • 方法 1: コマンドを DBCC UPDATEUSAGE 使用します。

    この問題を解決するには、正しくない行数の値を更新します。 このためには、次のコマンドを実行します。

    DBCC UPDATEUSAGE (**subscriber_database_name** **,**'MSreplication_subscriptions') WITH COUNT_ROWS
    

    注:

    コマンドは DBCC UPDATEUSAGE 、テーブル内の各パーティションの行、使用済みページ、予約ページ、リーフ ページ、およびデータ ページ数の正しい値を決定します。 これらの値が正しい場合、コマンドは DBCC UPDATEUSAGE データを返しません。 不正確な値が見つかり、修正された場合は、 DBCC UPDATEUSAGE 更新された行と列を返します。

  • 方法 2: ステートメントを使用します ALTER INDEX

    この問題を解決するには、テーブルに関連付けられているインデックスを MSreplication_subscriptions 再構築します。 これを行うには、次のステートメントを使用します。

    ALTER INDEX ALL ON [dbo].[MSreplication_subscriptions] REBUILD
    

詳細

「現象」セクションに記載されている問題が発生した場合、システム テーブルの行数の見積もりMSreplication_subscriptions4,294,967,296 までになります。 rowcount 値をチェックするには、次のいずれかの方法を使用します。

  • 方法 1: SQL Server Management Studioを使用します。

    SQL Server Management Studioを使用してシステム テーブルの行数値をチェックするには、次の手順にMSreplication_subscriptions従います。

    1. SQL Server Management Studioを開始し、サブスクライバー サーバー インスタンスに接続します。
    2. [ データベース] を展開し、サブスクライバー データベースを展開します。
    3. [ テーブル] を展開し、[ システム テーブル] を展開します。
    4. dbo を右クリックします 。MSreplication_subscriptionsし、[プロパティ] を選択 します
    5. [ ストレージ] を選択し、[行数] フィールドで 数の値を確認します。
  • 方法 2: クエリ ステートメントを使用します。

    システム テーブルの rowcount 値MSreplication_subscriptionsをチェックするには、次のクエリを実行します。

    SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
    

関連情報