Příznaky
Předpokládejme, že používáte Microsoft SQL Server 2012 nebo SQL Server 2014. Když spustíte správu vzdáleného úložiště objektů BLOB (RBS), nástroj udržení struktury RBS selže a zobrazí se následující chybová zpráva:
Zahájení úkolů údržby Spouští se uvolňování paměti. Spouští se referenční kontrola. Referenční kontrola je pro tuto databázi hotová. Naskenované objekty blob 113. Odstraněné objekty BLOB v oblasti 0x000000000000000000000000 (Exclusive) na 0x00000000000000b600000002 (včetně). Tento úkol skončil. Počet zpracovaných pracovních jednotek celkem 0 pracovních jednotek bylo neúplné. Zahájení odstranění šíření V tuto chvíli není k dispozici žádná práce. Na jiných úkolech mohou pracovat i další klienti, procesy nebo vlákna. Přeskakuje aktuální pracovní jednotku, protože došlo k chybě. Další informace najdete v protokolu o Údržbém systému RBS. [..] Tento úkol skončil. Počet zpracovaných pracovních jednotek 102 pracovní jednotky 101 nebyly úplné. Nutné k odstranění objektů BLOB. Úspěšné odstranění objektů blob, 0 bloby se v úložišti objektů BLOB nenašly. Tento úkol skončil. Tento úkol skončil.
Když ke sledování problému používáte Profiler, zobrazí se následující chybová zpráva:
Msg 50000, úroveň 16, stav 0, procedura rbs_sp_rethrow_error chyba 38RBS. Původní chyba: číslo 535, závažnost 16, stav 0, postup rbs_sp_count, řádek 52, zpráva: výsledkem funkce DateDiff byla přetečení. Počet DatePart oddělujících dvě instance data a času jsou příliš velké. Zkuste použít funkci DateDiff s menším množstvím datepart.
Příčina
Tento problém nastane, když dotaz, který kontroluje čas od posledního provádění, může přetečení při převodu hodnoty na milisekundy. Tím se dotaz nezdaří a úkol skončí bez zpracování dat.
Řešení
Oprava tohoto problému je k dispozici v nejnovějším balíčku Feature Pack pro kód RBS. msi. Pokud už máte existující instalaci kódu RBS, doporučujeme spustit skript, který je uvedený v části alternativní řešení, a tento problém dočasně vyřešit.
Stažení balíčku Feature Pack pro Microsoft SQL server 2014 Service Pack 2 (SP2) Stáhnout balíček microsoft SQL Server 2012 Service Pack 4 (SP4) Feature Pack
Alternativní řešení
Pokud máte na SQL serveru 2012 nebo SQL serveru 2014, na kterém není oprava nainstalovaná, k dispozici existující instalace kódu RBS, můžete použít následující postup:
-
V SSMS otevřete skript z kroku 3 a pak se připojte k instanci systému SQL Server, která hostuje klientskou databázi RBS, pro kterou chcete použít opravu.
-
Ve skriptu nahraďte řetězec "your_RBS_client_database" skutečným názvem klientské databáze RBS.
-
Spuštěním skriptu spusťte opravu.use [your_RBS_client_database]go if object_id(N'mssqlrbs_resources.rbs_sp_count') is not null drop procedure mssqlrbs_resources.rbs_sp_countgo 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)asbegin 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 endgo
Stav
Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.