Symptômes
Supposez que vous disposez d’un environnement Microsoft SQL Server 2008 R2, SQL Server 2012 ou SQL Server 2014 de réplication transactionnel. Il existe plusieurs instances de distribution de SQL Server dans l’environnement. Dans ce cas, une violation d’accès est susceptible de se produire et l’agent de distribution de réplication SQL Server se bloque. Par ailleurs, un fichier de minividage est généré.
Résolution
Après avoir appliqué le correctif, l’agent s’arrêtera de manière harmonieuse au lieu de tomber en panne avec un fichier de vidage. Vous pouvez ajouter une étape de travail supplémentaire dans le travail de l’agent de distribution pour redémarrer automatiquement l’agent lorsque l’agent est arrêté et dispose du statut « planifié pour le redémarrage ». Pour plus d’informations sur l’ajout d’une étape de travail supplémentaire dans le travail d’agent de distribution, consultez la section informations supplémentaires. Le problème a été résolu dans la mise à jour cumulative suivante de SQL Server.
Mise à jour cumulative 1 pour SQL Server 2014 /en-us/help/2931693
Mise à jour cumulative 9 pour SQL Server 2012 SP1 /en-us/help/2931078
Mise à jour cumulative 11 pour SQL Server 2012 /en-us/help/2908007
Mise à jour cumulative 9 pour SQL Server 2008 R2 SP2 /en-us/help/2887606
Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs et les correctifs de sécurité inclus dans la mise à jour cumulative précédente. Consultez les dernières mises à jour cumulatives pour SQL Server :
Package de mise à jour des correctifs pour SQL Server 2008 R2 Service Pack 1Le correctif de ce problème a été émis pour la première fois dans le package de mise à jour des correctifs pour SQL Server 2008 R2 Service Pack 1.
Statut
Microsoft a confirmé l’existence de ce problème dans les produits Microsoft répertoriés dans la section « S’applique à ».
Informations supplémentaires
Après avoir appliqué le correctif, ajoutez le script suivant à la tâche de l’agent de distribution :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