トランザクション レプリケーションを構成するときのエラー 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_subscriptions
は 4,294,967,296 までになります。 rowcount 値をチェックするには、次のいずれかの方法を使用します。
方法 1: SQL Server Management Studioを使用します。
SQL Server Management Studioを使用してシステム テーブルの行数値をチェックするには、次の手順に
MSreplication_subscriptions
従います。- SQL Server Management Studioを開始し、サブスクライバー サーバー インスタンスに接続します。
- [ データベース] を展開し、サブスクライバー データベースを展開します。
- [ テーブル] を展開し、[ システム テーブル] を展開します。
- dbo を右クリックします 。MSreplication_subscriptionsし、[プロパティ] を選択 します。
- [ ストレージ] を選択し、[行数] フィールドで 行 数の値を確認します。
方法 2: クエリ ステートメントを使用します。
システム テーブルの rowcount 値
MSreplication_subscriptions
をチェックするには、次のクエリを実行します。SELECT rows, * FROM sys.partitions WHERE object_id = object_id('MSreplication_subscriptions')
関連情報
- デッドロックの検出と終了の詳細については、「デッドロックの検出と終了」を参照してください。
- ステートメントの
ALTER
詳細については、「Transact-SQL ステートメント」を参照してください。 - コマンドの
DBCC UPDATEUSAGE
詳細については、DBCC UPDATEUSAGE (Transact-SQL) を参照してください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示