CORREÇÃO: Erro ao executar o Mantenedor RBS no SQL Server 2012 ou SQL Server 2014

Aplica-se A
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use)

Sintomas

Suponha que está a utilizar o Microsoft SQL Server 2012 ou SQL Server 2014. Quando você executa o mantenedor de armazenamento remoto de BLOB (RBS), a ferramenta de manutenção RBS falha e você recebe a seguinte mensagem de erro:

Nota

Iniciando as tarefas do Mantenedor.
    Iniciando a coleta de lixo.
        Iniciando a varredura de referência.
            A Análise de Referência está concluída para esta base de dados.
            Digitalizados 113 blobs. Foram eliminados 0 blobs no intervalo entre 0x000000000000000000000000(exclusivo) a 0x00000000000000b600000002(inclusive).
        Esta tarefa terminou. Processou 1 unidade de trabalho no total. 0 Unidades de trabalho estavam incompletas.
        Iniciando a propagação de exclusão.
            Não existe trabalho disponível neste momento.
            Outros clientes, processos ou threads podem estar atualmente a trabalhar noutras tarefas.
            Ignorar a unidade de trabalho atual devido a um erro. Para obter mais informações, consulte o log do Mantenedor do RBS.
    [..]
        Esta tarefa terminou. Processou 102 unidades de trabalho no total. 101 unidades de trabalho estavam incompletas. Necessário para eliminar 0 blobs. Conseguiu excluir 0 blobs, 0 blobs não foram encontrados no repositório de blobs.
    Esta tarefa terminou.
Esta tarefa terminou.

Quando você usa o Profiler para rastrear o problema, você receber a seguinte mensagem de erro:

Nota

Msg 50000, Nível 16, Estado 0, Procedimento rbs_sp_rethrow_error, Linha 38
Erro de RBS. Erro original: Número 535, Severidade 16, Estado 0, Procedimento rbs_sp_count, Linha 52,
Mensagem: A função datediff resultou em um estouro. O número de partes de data que separam duas instâncias de data/hora é demasiado grande. Tente usar datediff com uma parte de data menos precisa.

Causa

Este problema ocorre porque uma consulta que verifica o tempo desde a última execução pode exceder a capacidade quando converte um valor em milissegundos. Isto faz com que a consulta falhe e a tarefa termine sem processamento dos dados.

Resolução

A correção para este problema está disponível na transferência do pacote de funcionalidades mais recente para RBS.msi. Se você já tiver uma instalação existente do RBS, recomendamos que execute o script fornecido na seção "Solução alternativa" para corrigir temporariamente o problema.

Transferir o Microsoft SQL Server 2014 Service Pack 2 (SP2) Feature Pack
        
         Transferir o Pacote de Funcionalidades do Microsoft SQL Server 2012 Service Pack 4 (SP4)

Solução

Se você tiver uma instalação existente do RBS no SQL Server 2012 ou SQL Server 2014 que não tenha a correção instalada, poderá usar as seguintes etapas de solução alternativa:

  1. No SSMS, abra o script na etapa 3 e conecte-se à instância SQL Server que hospeda o banco de dados do cliente RBS ao qual você deseja aplicar a correção.

  2. No script, substitua a cadeia de caracteres "your_RBS_client_database" pelo nome real do banco de dados do cliente RBS.

  3. Execute o script para aplicar a correção.

    utilizar [your_RBS_client_database]
    prosseguir

    se object_id(N'mssqlrbs_resources.rbs_sp_count') não for nulo
        procedimento DROP mssqlrbs_resources.rbs_sp_count
    prosseguir

    Criar procedimento mssqlrbs_resources.rbs_sp_count (
        @operation smallint,
        @object smallint = 0,
        @value bigint = null,
        @start_time datetime = null,
        @end_time datetime = null,
        @description sysname = N'',
        @message nvarchar(max) = null
    )
    como
    começar

        declarar @type tinyint,
                @secondsUsed bit,
                @seconds flutuante

        declarar @maxDays int = 10;

        se não existir (
            select * from mssqlrbs_resources.rbs_internal_counters
                onde operação = @operation e objeto = e @object descrição = @description
        )
            raiserror (erro N'Internal em RBS. Tentativa de contagem do contador de desempenho inválido. Contador: <%d>.<%d>.<%s>.»,
                16, 101, @operation, @object, @description)

        selecionar
                @type = tipo,
                @secondsUsed = seconds_used
            de
                mssqlrbs_resources.rbs_internal_counters
            em que
                operação = @operation e
                object = @object e
                Descrição = @description

        se @object != 0
        começar
            Se @value for nulo
                raiserror (erro N'Internal em RBS. Valor não especificado para o contador <de desempenho %d>.<%d>.<%s>.»,
                    16, 103, @operation, @object, @description)
        fim

        se @secondsUsed = 1
        começar
            se (@start_time é nulo)
                raiserror (erro N'Internal em RBS. Hora de início não especificada para o contador <de desempenho %d>.<%d>.<%s>.»,
                    16, 102, @operation, @object, @description)

            set @end\_time = isnull(@end_time, getutcdate())

            Se (@start_time >@end\_time)
                raiserror (erro N'Internal em RBS. A hora de início é depois da hora de fim. Contador: <%d>.<%d>.<%s>.»,
                    16, 104, @operation, @object, @description)

            if (datediff(day, @start\_time, @end\_time)>= @maxDays)
            começar
                set @seconds = convert(float, datediff(segundo, @start\_time, @end\_time))
            fim
            outros
            começar
                set @seconds = convert(float, datediff(milissegundo, @end\_time))@start\_time, / 1000
            fim
        fim

        Update mssqlrbs_resources.rbs_internal_counters
            definir
                contagem = contagem + 1,
                valor = valor + @value,
                squared_value = squared_value + quadrado(@value),
                min_value = maiúsculas/minúsculas
                                Quando min_value é nulo, @value
                                quando (@value < min_value) então @value
                                else min_value
                            fim,
                max_value = maiúsculas/minúsculas
                                Quando max_value é nulo, @value
                                quando (@value > max_value) em seguida, @value
                                else max_value
                            fim,
                last_value = @value,
                segundos = segundos + @seconds,
                squared_seconds = squared_seconds + quadrado(@seconds),
                min_seconds = maiúsculas/minúsculas
                                Quando min_seconds é nulo, @seconds
                                quando (@seconds < min_seconds) em seguida, @seconds
                                else min_seconds
                            fim,
                max_seconds = maiúsculas/minúsculas
                                Quando max_seconds é nulo, @seconds
                                quando (@seconds > max_seconds) em seguida, @seconds
                                else max_seconds
                            fim,
                last_seconds = @seconds,
                last_update_time = GetUtcDate(),
                last_message = @message
            em que
                operação = @operation e
                object = @object e
                Descrição = @description

    fim
    prosseguir

Estado

A Microsoft confirmou que se trata de um problema nos produtos Microsoft listados na secção "Aplica-se a".