CORREÇÃO: Erro ao executar o RBS Maintainer no SQL Server 2012 ou no 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 você esteja usando o Microsoft SQL Server 2012 ou o SQL Server 2014. Quando você executa o Mantenedor do RBS (Remote BLOB Storage), a ferramenta Mantenedor do RBS falha e você recebe a seguinte mensagem de erro:

Observação

Iniciando tarefas de mantenedor.
    Iniciando a coleta de lixo.
        Iniciando a verificação de referência.
            A verificação de referência foi concluída para esse banco de dados.
            113 blobs verificados. Excluído 0 blobs no intervalo de 0x000000000000000000000000(exclusivo) a 0x00000000000000b600000002(inclusivo).
        Esta tarefa terminou. Processado 1 total de unidades de trabalho. 0 As unidades de trabalho estavam incompletas.
        Iniciando a propagação de exclusão.
            Nenhum trabalho está disponível no momento.
            Outros clientes, processos ou threads podem estar trabalhando em outras tarefas no momento.
            Ignorando a unidade atual de trabalho devido a um erro. Para obter mais informações, consulte o log do mantenedor do RBS.
    [..]
        Esta tarefa terminou. Processadas 102 unidades de trabalho no total. 101 unidades de trabalho estavam incompletas. Necessário excluir 0 blobs. Êxito na exclusão de 0 blobs, 0 blobs não foram encontrados no repositório de blobs.
    Esta tarefa terminou.
Esta tarefa terminou.

Ao usar o Profiler para rastrear o problema, você recebe a seguinte mensagem de erro:

Observação

Msg 50000, Nível 16, Estado 0, Procedimento rbs_sp_rethrow_error, Linha 38
Erro de RBS. Erro original: número 535, gravidade 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 é muito grande. Tente usar datediff com uma datepart menos precisa.

Causa

Esse problema ocorre porque uma consulta que verifica o tempo desde a última execução pode estourar quando converte um valor em milissegundos. Isso faz com que a consulta falhe e a tarefa termine sem processar os dados.

Resolução

A correção para esse problema está disponível no download do pacote de recursos 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.

Baixe o Microsoft SQL Server 2014 Service Pack 2 (SP2) Feature Pack
        
         Baixe o Microsoft SQL Server 2012 Service Pack 4 (SP4) Feature Pack

Solução alternativa

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 da etapa 3 e conecte-se à instância do SQL Server que hospeda o banco de dados do cliente RBS ao qual você deseja aplicar a correção.

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

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

    use [your_RBS_client_database]
    vá

    if object_id(N'mssqlrbs_resources.rbs_sp_count') is not null
        procedimento DROP mssqlrbs_resources.rbs_sp_count
    vá

    Procedimento de criação 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 pouco,
                @seconds flutuador

        declare @maxDays int = 10;

        if not exists (
            select * from mssqlrbs_resources.rbs_internal_counters
                where operation = @operation and object = @object and description = @description
        )
            raiserror (N'Erro interno na EDR. Tente contar o contador de desempenho inválido. Contador: <%d>.<%d>.<%s>.',
                16, 101, @operation, @object, @description)

        Select
                @type = type,
                @secondsUsed = seconds_used
            de
                mssqlrbs_resources.rbs_internal_counters
            onde
                operação = @operation e
                object = @object e
                descrição = @description

        if @object != 0
        começar
            if @value is null
                raiserror (N'Erro interno na EDR. Valor não especificado para o contador de <desempenho %d>.<%d>.<%s>.',
                    16, 103, @operation, @object, @description)
        fim

        se @secondsUsed = 1
        começar
            if (@start_time is null)
                raiserror (N'Erro interno na EDR. 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())

            if (@start_time >@end\_time)
                raiserror (N'Erro interno na EDR. A hora de início é após a hora de término. Contador: <%d>.<%d>.<%s>.',
                    16, 104, @operation, @object, @description)

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

        Atualizar mssqlrbs_resources.rbs_internal_counters
            definir
                contagem = contagem + 1,
                valor = valor + @value,
                squared_value = squared_value + quadrado(@value),
                min_value = caso
                                Quando min_value é nulo, @value
                                quando (@value < min_value) então @value
                                outras min_value
                            fim,
                max_value = case
                                Quando max_value é nulo, então @value
                                quando (@value > max_value) então @value
                                max_value
                            fim,
                last_value = @value,
                segundos = segundos + @seconds,
                squared_seconds = squared_seconds + quadrado(@seconds),
                min_seconds = case
                                Quando min_seconds é nulo, @seconds
                                quando (@seconds < min_seconds) então @seconds
                                outras min_seconds
                            fim,
                max_seconds = caso
                                Quando max_seconds é nulo, @seconds
                                quando (@seconds > max_seconds) então @seconds
                                outras max_seconds
                            fim,
                last_seconds = @seconds,
                last_update_time = getutcdate(),
                last_message = @message
            onde
                operação = @operation e
                object = @object e
                descrição = @description

    fim
    vá

Status

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".