Symptom
Anta att du använder Microsoft SQL Server 2012 eller SQL Server-2014. När du kör Remote BLOB Storage (RBS) Underhållaren verktyget Underhållaren RBS misslyckas och följande felmeddelande:
Starta Underhållaren aktiviteter.
Starta skräpsamling.
Påbörjar sökning för referens.
Referens för sökningen är klar för den här databasen.
Skannade 113 BLOB. Ta bort 0 BLOB i intervallet 0x000000000000000000000000(exclusive) till 0x00000000000000b600000002(inclusive).
Den här aktiviteten har avslutats. Bearbetade 1 arbetsenheter totalt. 0 arbetsenheter var ofullständig.
Börja ta bort spridning.
Inget arbete är tillgängliga just nu.
Andra klienter, processer och trådar kan för närvarande arbetar med andra uppgifter.
Hoppa över den aktuella enheten för arbete på grund av ett fel. Mer information finns i loggen RBS Underhållaren.
[..]
Den här aktiviteten har avslutats. Bearbetade totalt 102 arbetsenheter. 101 arbetsenheter var ofullständig. Behövs för att ta bort 0 BLOB. Lyckades ta bort 0 BLOB hittades BLOB 0 inte i blob-lagring.
Den här aktiviteten har avslutats.
Den här aktiviteten har avslutats.
När du använder Profiler för att spåra problemet, visas följande felmeddelande:
Msg 50000, nivå 16, tillstånd 0, rbs_sp_rethrow_error förfarande, rad 38
RBS-fel. Ursprungliga fel: Nummer 535, allvarlighetsgrad 16, tillstånd 0 förfarande rbs_sp_count rad 52,
Meddelande: Funktionen datediff orsakade spill. Antalet dateparts som skiljer två datum/tid-instanser är för stor. Om du försök använda datediff med en mindre exakt DatumDel.
Orsak
Det här problemet beror på att en fråga som söker tid sedan den senaste körningen kan spill när den konverterar ett värde till millisekunder. Detta medför att frågan misslyckas och uppgiften ska avslutas utan att bearbeta data.
Lösning
Det här problemet finns i senaste funktionen pack nedladdning för RBS.msi. Vi rekommenderar att du kör skriptet som anges i avsnittet ”lösning” för att tillfälligt lösa problemet om du redan har en befintlig installation av RBS.
Hämta Microsoft SQL Server-2014 Service Pack 2 (SP2) Feature Pack
Hämta Microsoft SQL Server 2012 Service Pack 4 (SP4) Feature Pack
Temporär lösning
Om du har en befintlig installation av RBS på SQL Server 2012 eller SQL Server-2014 som inte har installerat korrigeringsfilen kan använda du följande lösning:
-
Öppna skriptet från steg 3 i SSMS, och sedan ansluta till SQL Server-instansen som är värd för RBS klientdatabas som du vill installera snabbkorrigeringen för att.
-
Ersätta strängen ”your_RBS_client_database” med det faktiska namnet på RBS klientdatabas i skriptet.
-
Kör skript för att installera snabbkorrigeringen.
use [your_RBS_client_database]
go
if object_id(N'mssqlrbs_resources.rbs_sp_count') is not null
drop procedure mssqlrbs_resources.rbs_sp_count
go
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
)
as
begin
declare @type tinyint,
@secondsUsed bit,
@seconds float
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'Internal error in RBS. Attempt to count invalid performance counter. Counter: <%d>.<%d>.<%s>.',
16, 101, @operation, @object, @description)
select
@type = type,
@secondsUsed = seconds_used
from
mssqlrbs_resources.rbs_internal_counters
where
operation = @operation and
object = @object and
description = @description
if @object != 0
begin
if @value is null
raiserror (N'Internal error in RBS. Value not specified for performance counter <%d>.<%d>.<%s>.',
16, 103, @operation, @object, @description)
end
if @secondsUsed = 1
begin
if (@start_time is null)
raiserror (N'Internal error in RBS. Start time not specified for performance counter <%d>.<%d>.<%s>.',
16, 102, @operation, @object, @description)
set @end_time = isnull(@end_time, getutcdate())
if (@start_time > @end_time)
raiserror (N'Internal error in RBS. Start time is after end time. Counter: <%d>.<%d>.<%s>.',
16, 104, @operation, @object, @description)
if (datediff(day, @start_time, @end_time) >= @maxDays)
begin
set @seconds = convert(float, datediff(second, @start_time, @end_time))
end
else
begin
set @seconds = convert(float, datediff(millisecond, @start_time, @end_time)) / 1000
end
end
update mssqlrbs_resources.rbs_internal_counters
set
count = count + 1,
value = value + @value,
squared_value = squared_value + square(@value),
min_value = case
when min_value is null then @value
when (@value < min_value) then @value
else min_value
end,
max_value = case
when max_value is null then @value
when (@value > max_value) then @value
else max_value
end,
last_value = @value,
seconds = seconds + @seconds,
squared_seconds = squared_seconds + square(@seconds),
min_seconds = case
when min_seconds is null then @seconds
when (@seconds < min_seconds) then @seconds
else min_seconds
end,
max_seconds = case
when max_seconds is null then @seconds
when (@seconds > max_seconds) then @seconds
else max_seconds
end,
last_seconds = @seconds,
last_update_time = getutcdate(),
last_message = @message
where
operation = @operation and
object = @object and
description = @description
end
go
Status
Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i avsnittet ”gäller”.