KB2861456 - 修正: SQL Server トランザクション レプリケーションでのレプリケーションディストリビューション エージェントアクセス違反

適用先
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

現象

Microsoft SQL Server 2008 R2、SQL Server 2012、または SQL Server 2014 トランザクション レプリケーション環境があることを想定しています。 環境には SQL Server の複数のディストリビューション インスタンスがあります。 この場合、アクセス違反が発生し、SQL Server レプリケーション配布エージェントがクラッシュすることがあります。 さらに、ミニ ダンプ ファイルが生成されます。

解決策

修正プログラムを適用すると、エージェントはダンプ ファイルと共にクラッシュするのではなく、正常にシャットダウンします。 ディストリビューション エージェント ジョブにジョブ ステップを追加して、エージェントが停止し、"再起動がスケジュールされた" 状態のときにエージェントを自動的に再起動できます。

ディストリビューション エージェント ジョブにジョブ ステップを追加する方法の詳細については、「詳細情報」セクションを参照してください。

この問題は、次の SQL Server の累積的な更新プログラムで最初に修正されました。

SQL Server 2014 用の累積的な更新プログラム 1 /en-us/help/2931693

SQL Server 2012 SP1 の累積的な更新プログラム 9 /en-us/help/2931078

SQL Server 2012 用の累積的な更新プログラム 11 /en-us/help/2908007

SQL Server 2008 R2 SP2 の累積的な更新プログラム 9 /en-us/help/2887606

SQL Server 用の累積的な更新プログラムについて

SQL Server 用の新しい累積的な更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正プログラムが含まれています。 SQL Server の最新の累積的な更新プログラムを確認してください。

      

SQL Server 2008 R2 Service Pack 1 の修正プログラム更新プログラム パッケージ。この問題の修正プログラムは、SQL Server 2008 R2 Service Pack 1 の修正プログラム パッケージで最初にリリースされました。

状態

Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。

追加情報

修正プログラムを適用したら、次のスクリプトをディストリビューション エージェントジョブに追加します。DECLARE @JobID BINARY(16)
DECLARE @AgentID int
DECLARE @command varchar(max)
DECLARE JobCur CURSOR FOR SELECT Job.job_id, Agent.id FROM msdb.dbo.sysjobs AS Job
        INNER JOIN msdb.dbo.syscategories AS Cat ON Job.category_id = Cat.category_id
        INNER JOIN msdb.dbo.sysjobsteps AS Steps ON Job.job_id = Steps.job_id
        INNER JOIN distribution.dbo.MSdistribution_agents AS Agent ON Job.job_id = Agent.job_id
        WHERE Job.name like '%Put text mask to identify your publisher DB jobs here%' AND Cat.name = 'REPL-Distribution'
        Job.job_id、Agent.id でグループ化
        HAVING COUNT(step_id) = 3
OPEN JobCur
FETCH NEXT FROM JobCur INTO @JobID, @AgentID
WHILE @@FETCH_STATUS = 0 BEGIN
        IF (@JobID が NULL でない) BEGIN
                set @command = N'if (select top 1 runstatus from MSdistribution_history where agent_id = ' + convert(varchar, @AgentID)+ N' order by timestamp desc) = 5
        raiserror(''エージェントは再試行がスケジュールされました。Performing restart now'',16,1)'
                EXEC msdb.dbo.sp_add_jobstep @job\_id=@JobID, @database\_name=N'distribution', @step\_name=N'Check for retry', @step\_id=4, @on\_fail\_action=4, @on\_fail\_step\_id=1, @command=@command
                EXEC msdb.dbo.sp_update_jobstep @job\_id=@JobID、 @step\_id=2、 @on\_success\_action=4、 @on\_success\_step\_id=4
        End
        FETCH NEXT FROM JobCur INTO @JobID, @AgentID;
End
CLOSE JobCur;
DEALLOCATE JobCur;
GO