Симптоми
Да предположим, че използвате 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, на която няма инсталирана корекцията, можете да използвате следните стъпки за заобиколно решение:
В SSMS отворете скрипта от стъпка 3 и след това се свържете към екземпляра на SQL Server, който хоства базата данни на клиента RBS, към която искате да приложите корекцията.
В скрипта заместете низа "your_RBS_client_database" с точното име на клиентската база данни на RBS.
Изпълнете скрипта, за да приложите корекцията.
използване на [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, които са изброени в раздела „Важи за“.