КОРЕКЦИЯ: Грешка при изпълнение на RBS Maintainer в SQL Server 2012 или SQL Server 2014

Отнася се за
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)

Симптоми

Да предположим, че използвате Microsoft SQL Server 2012 или SQL Server 2014. Когато стартирате инструмента за отдалечено поддържане на BLOB съхранение (RBS), инструментът за поддържане на RBS е неуспешен и получавате следното съобщение за грешка:

Забележка

Стартиране на задачи за поддръжка.
    Стартиране на почистването на боклука.
        Стартиране на сканиране на справки.
            Сканирането на препратката е завършено за тази база данни.
            Сканирани са 113 BLOB-а. Изтрити са 0 големи двоични обекти в диапазона от 0x000000000000000000000000(без крайните точки) до 0x00000000000000b600000002(включително).
        Тази задача приключи. Обработени са общо 1 работни единици. 0 Работните единици са непълни.
        Стартиране на разпространението на изтриване.
            В момента няма налична работа.
            Други клиенти, процеси или нишки може в момента да работят по други задачи.
            Пропускане на текущата единица работа поради грешка. За повече информация вижте регистрационния файл на поддръжката на RBS.
    [..]
        Тази задача приключи. Обработени са общо 102 работни единици. 101 Работни единици са незавършени. Нужно е да се изтрият 0 големи двоични обекти. Успешно изтриване на 0 големи двоични обекти, 0 големи двоични обекти не са намерени в хранилището за големи двоични обекти.
    Тази задача приключи.
Тази задача приключи.

Когато използвате Profiler за проследяване на проблема, получавате следното съобщение за грешка:

Забележка

Съобщение 50000, ниво 16, състояние 0, процедура rbs_sp_rethrow_error, ред 38
RBS грешка. Първоначална грешка: номер 535, степен на сериозност 16, състояние 0, процедура rbs_sp_count, ред 52,
Съобщение: Функцията datediff доведе до препълване. Броят на частите за дата, разделящи два екземпляра дата/час, е твърде голям. Опитайте се да използвате datediff с по-малко точна datepart.

Причина

Този проблем възниква, защото заявка, която проверява времето от последното изпълнение, може да препълни, когато преобразува стойност в милисекунди. Това води до неуспех на заявката и приключване на задачата без обработка на данните.

Решение

Корекцията за този проблем е налична в най-новия пакет с функции, изтеглен за RBS.msi. Ако вече имате съществуваща инсталация на RBS, ви препоръчваме да изпълните скрипта, предоставен в раздела "Заобиколно решение", за временно да коригирате проблема.

Изтегляне на пакета функции за Microsoft SQL Server 2014 Service Pack 2 (SP2)
        
         Изтегляне на пакета функции за Microsoft SQL Server 2012 Service Pack 4 (SP4)

Заобиколно решение

Ако имате съществуваща инсталация на RBS на SQL Server 2012 или SQL Server 2014, на която няма инсталирана корекцията, можете да използвате следните стъпки за заобиколно решение:

  1. В SSMS отворете скрипта от стъпка 3 и след това се свържете към екземпляра на SQL Server, който хоства базата данни на клиента RBS, към която искате да приложите корекцията.

  2. В скрипта заместете низа "your_RBS_client_database" с точното име на клиентската база данни на RBS.

  3. Изпълнете скрипта, за да приложите корекцията.

    използване на [your_RBS_client_database]
    отидете

    ако object_id(N'mssqlrbs_resources.rbs_sp_count') не е null
        Drop Procedure mssqlrbs_resources.RBS_SP_COUNT
    отидете

    create procedure 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
    )
    като
    започване

        declare @type tinyint,
                @secondsUsed бит,
                @seconds float

        деклариране @maxDays на int = 10;

        Ако не съществува (
            Избор на * от mssqlrbs_resources.RBS_INTERNAL_COUNTERS
                where operation = @operation and object = @object and description = @description
        )
            raiserror (N'Вътрешна грешка в RBS. Опит за преброяване на невалиден брояч на производителността. Брояч: <%d>.<%d>.<%s>.',
                16, 101, @operation, @object, @description)

        избор
                @type = type,
                @secondsUsed = seconds_used
            от
                mssqlrbs_resources.rbs_internal_counters
            където
                operation = @operation and
                Обект = @object и
                description = @description

        Ако @object != 0
        започване
            ако @value е null
                raiserror (N'Вътрешна грешка в RBS. Стойност, която не е зададена за брояча <на показателите %d>.<%d>.<%s>.',
                    16, 103, @operation, @object, @description)
        край

        Ако @secondsUsed = 1
        започване
            ако (@start_time е null)
                raiserror (N'Вътрешна грешка в RBS. Началният час не е зададен за брояча <на показателите %d>.<%d>.<%s>.',
                    16, 102, @operation, @object, @description)

            Set @end\_time = IsNull(@end_time, GetutCdate())

            if (@start_time >@end\_time)
                raiserror (N'Вътрешна грешка в RBS. Началният час е след крайния час. Брояч: <%d>.<%d>.<%s>.',
                    16, 104, @operation, @object, @description)

            if (datediff(day, @start\_time, @end\_time)>= @maxDays)
            започване
                set @seconds = convert(float, datediff(second, @start\_time, @end\_time))
            край
            друго
            започване
                set @seconds = convert(float, datediff(millisecond, @start\_time, @end\_time)) / 1000
            край
        край

        актуализация mssqlrbs_resources.rbs_internal_counters
            задаване
                count = count + 1,
                value = value + @value,
                squared_value = squared_value + square(@value),
                min_value = регистър
                                Когато min_value е null, тогава @value
                                когато (@value < min_value) then @value
                                друго min_value
                            Край,
                max_value = регистър
                                Когато max_value е null, тогава @value
                                когато (@value > max_value) then @value
                                друго max_value
                            Край,
                last_value = @value,
                секунди = секунди + @seconds,
                squared_seconds = squared_seconds + square(@seconds),
                min_seconds = регистър
                                Когато min_seconds е null, тогава @seconds
                                когато (@seconds < min_seconds) then @seconds
                                друго min_seconds
                            Край,
                max_seconds = регистър
                                Когато max_seconds е null, тогава @seconds
                                когато (@seconds > max_seconds) then @seconds
                                друго max_seconds
                            Край,
                last_seconds = @seconds,
                last_update_time = getutcdate(),
                last_message = @message
            където
                operation = @operation and
                Обект = @object и
                description = @description

    край
    отидете

Състояние

Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.