Sintomi
Si supponga di avere un ambiente di replica transazionale di Microsoft SQL Server 2008 R2, SQL Server 2012 o SQL Server 2014. Nell'ambiente sono presenti più istanze di distribuzione di SQL Server. In questo caso, potrebbe verificarsi una violazione di Access e l'agente di distribuzione della replica di SQL Server si arresta in modo anomalo. Viene inoltre generato un mini file di dump.
Risoluzione
Dopo aver applicato l'hotfix, l'agente si arresta con garbo invece di arrestarsi in modo anomalo insieme a un file di dump. È possibile aggiungere un ulteriore passaggio di processo nel processo dell'agente di distribuzione per riavviare automaticamente l'agente quando l'agente si è fermato e ha lo stato "programmato per il riavvio". Per altre informazioni su come aggiungere un ulteriore passaggio di processo nel processo dell'agente di distribuzione, vedere la sezione altre informazioni. Il problema è stato risolto per la prima volta nel seguente aggiornamento cumulativo di SQL Server.
Aggiornamento cumulativo 1 per SQL Server 2014 /en-us/help/2931693
Aggiornamento cumulativo 9 per SQL Server 2012 SP1 /en-us/help/2931078
Aggiornamento cumulativo 11 per SQL Server 2012 /en-us/help/2908007
Aggiornamento cumulativo 9 per SQL Server 2008 R2 SP2 /en-us/help/2887606
Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nell'aggiornamento cumulativo precedente. Vedere gli ultimi aggiornamenti cumulativi per SQL Server:
Pacchetto di aggiornamento hotfix per SQL Server 2008 R2 Service Pack 1La correzione di questo problema è stata rilasciata per la prima volta nel pacchetto di aggiornamento dell'hotfix per SQL Server 2008 R2 Service Pack 1.
Stato
Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".
Ulteriori informazioni
Dopo aver applicato l'hotfix, aggiungere lo script seguente al processo dell'agente di distribuzione: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