Sintomas
Assuma que tem um Microsoft SQL Server 2008 R2, SQL Server 2012 ou SQL Server 2014. Existem múltiplas instâncias de distribuição do SQL Server no ambiente. Nesta situação, pode ocorrer uma violação de acesso e o agente de distribuição de replicação do SQL Server falha. Adicionalmente, é gerado um mini ficheiro de despejo.
Resolução
Depois de aplicar o hotfix, o agente desliga-se graciosamente em vez de colidir com um ficheiro de despejo. Pode adicionar um passo adicional de trabalho no trabalho do Agente de Distribuição para reiniciar automaticamente o agente quando o agente tiver parado e tiver o estado de "programado para reiniciar". Para obter mais informações sobre como adicionar um passo adicional de trabalho no trabalho de Agente de Distribuição, consulte a secção Mais Informação. O problema foi corrigido pela primeira vez na seguinte atualização cumulativa do SQL Server.
Atualização Cumulativa 1 para SQL Server 2014 /en-us/help/2931693
Atualização Cumulativa 9 para SQL Server 2012 SP1 /en-us/help/2931078
Atualização Cumulativa 11 para SQL Server 2012 /en-us/help/2908007
Atualização Cumulativa 9 para SQL Server 2008 R2 SP2 /en-us/help/2887606
Cada nova atualização cumulativa do SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas com a atualização cumulativa anterior. Confira as últimas atualizações cumulativas do SQL Server:
Pacote de atualização hotfix para SQL Server 2008 R2 Service Pack 1A correção para este problema foi lançada pela primeira vez no pacote de atualização hotfix para SQL Server 2008 R2 Service Pack 1.
Estado
A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".
Mais Informações
Depois de aplicar o hotfix, adicione o seguinte script ao trabalho de Agente de Distribuição: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