Síntomas
Suponga que tiene un entorno de replicación transaccional Microsoft SQL Server 2008 R2, SQL Server 2012 o SQL Server 2014. Hay varias instancias de distribución de SQL Server en el entorno. En esta situación, se puede producir una violación de acceso y el agente de distribución de replicación de SQL Server se bloquea. Además, se genera un archivo de volcado.
Resolución
Después de aplicar la revisión, el agente se cerrará correctamente en lugar de bloquearse junto con un archivo de volcado. Puede Agregar un paso de trabajo adicional en el trabajo del agente de distribución para reiniciar el agente automáticamente cuando el agente se ha detenido y tiene el estado "programado para reiniciar". Para obtener más información sobre cómo agregar un paso de trabajo adicional en el trabajo del agente de distribución, consulte la sección más información. El problema se solucionó por primera vez en la siguiente actualización acumulativa de SQL Server.
Actualización acumulativa 1 para SQL Server 2014 /en-us/help/2931693
Actualización acumulativa 9 para SQL Server 2012 SP1 /en-us/help/2931078
Actualización acumulativa 11 para SQL Server 2012 /en-us/help/2908007
Actualización acumulativa 9 para SQL Server 2008 R2 SP2 /en-us/help/2887606
Cada actualización acumulativa para SQL Server contiene todas las revisiones y todas las revisiones de seguridad incluidas en la actualización acumulativa anterior. Consulte las últimas actualizaciones acumulativas para SQL Server:
Paquete de actualización de revisiones para SQL Server 2008 R2 Service Pack 1La corrección para este problema se publicó por primera vez en el paquete de actualización de la revisión para SQL Server 2008 R2 Service Pack 1.
Estado
Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "Se aplica a".
Más información
Después de aplicar la revisión, agregue la siguiente secuencia de comandos al trabajo del agente de distribución:DECLARE @JobID BINARY(16)DECLARE @AgentID intDECLARE @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' GROUP BY Job.job_id, Agent.id HAVING COUNT(step_id) = 3OPEN JobCurFETCH NEXT FROM JobCur INTO @JobID, @AgentIDWHILE @@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(''Agent was scheduled for retry. 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;ENDCLOSE JobCur;DEALLOCATE JobCur;GO