KB2861456 - FIX: 복제 배포 에이전트 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 누적 업데이트에서 처음 해결되었습니다.

2014년 SQL Server용 누적 업데이트 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 서비스 팩 1용 핫픽스 업데이트 패키지 이 문제에 대한 픽스는 SQL Server 2008 R2 서비스 팩 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 '%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 is not 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(''에이전트가 다시 시도하도록 예약되었습니다. 지금 다시 시작 수행 중'',16,1)'
                EXEC msdb.dbo.sp_add_jobstep @job\_id=@JobID, 'distribution', @step\_name=N'Check for retry', @step\_id=4, , @on\_fail\_action=4@on\_fail\_step\_id=1, @database\_name=N@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