KORRIGERING: Fel när du kör RBS Maintainer i SQL Server 2012 eller SQL Server 2014

Gäller för
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)

Symptom

Anta att du använder Microsoft SQL Server 2012 eller SQL Server 2014. När du kör Remote BLOB Storage (RBS) Maintainer misslyckas RBS Maintainer-verktyget och du får följande felmeddelande:

Obs

Starta underhållsansvariga.
    Starta skräpinsamling.
        Starta referenssökning.
            Referensskanningen är klar för den här databasen.
            Skannade 113 blobbar. Borttagna 0 blobbar i intervallet 0x000000000000000000000000(exklusivt) till 0x00000000000000b600000002(inklusive).
        Uppgiften är slutförd. Bearbetade 1 arbetsenheter totalt. 0 Arbetsenheter var ofullständiga.
        Starta spridning av borttagning.
            Inget arbete är tillgängligt för tillfället.
            Andra klienter, processer eller trådar kanske arbetar med andra uppgifter.
            Hoppa över den aktuella arbetsenheten på grund av ett fel. Mer information finns i RBS-underhållsloggen.
    [..]
        Uppgiften är slutförd. Bearbetade 102 arbetsenheter totalt. 101 arbetsenheter var ofullständiga. Behövde ta bort 0 blobbar. Lyckades ta bort 0 blobbar, 0 blobbar hittades inte i blobarkivet.
    Uppgiften är slutförd.
Uppgiften är slutförd.

När du använder Profiler för att spåra problemet får du följande felmeddelande:

Obs

Msg 50000, nivå 16, tillstånd 0, procedur rbs_sp_rethrow_error, rad 38
RBS-fel. Ursprungligt fel: nummer 535, allvarlighetsgrad 16, tillstånd 0, procedur rbs_sp_count, rad 52,
Meddelande: Funktionen datumdiff resulterade i ett spill. Antalet datumdelar som avgränsar två datum-/tidsinstanser är för stort. Försök att använda datediff med en mindre exakt datepart.

Orsak

Det här problemet beror på att en fråga som kontrollerar tiden sedan den senaste körningen kan spilla när den konverterar ett värde till millisekunder. Det gör att frågan misslyckas och uppgiften avslutas utan att data bearbetas.

Lösning

Lösningen på det här problemet finns i den senaste nedladdningen av funktionspaket för RBS.msi. Om du redan har en befintlig installation av RBS rekommenderar vi att du kör skriptet i avsnittet "Tillfällig lösning" för att tillfälligt åtgärda problemet.

Ladda ned funktionspaketet Microsoft SQL Server 2014 Service Pack 2 (SP2)
        
         Ladda ned funktionspaketet Microsoft SQL Server 2012 Service Pack 4 (SP4)

Lösning

Om du har en befintlig installation av RBS på SQL Server 2012 eller SQL Server 2014 som inte har korrigeringen installerad kan du använda följande felsökningssteg:

  1. I SSMS öppnar du skriptet från steg 3 och ansluter sedan till den SQL Server instans som är värd för RBS-klientdatabasen som du vill tillämpa korrigeringen på.

  2. Ersätt strängen "your_RBS_client_database" med namnet på RBS-klientdatabasen i skriptet.

  3. Kör skriptet för att tillämpa korrigeringen.

    Använd [your_RBS_client_database]
    gå

    om object_id(N'mssqlrbs_resources.rbs_sp_count') inte är Null
        Släpp procedur mssqlrbs_resources.rbs_sp_count
    gå

    skapa procedur 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
    )
    Som framgår av
    börja

        Förkunna @type Tinyint,
                @secondsUsed bit,
                @seconds rörlighet

        deklarera @maxDays heltal = 10;

        om det inte finns (
            select * from mssqlrbs_resources.rbs_internal_counters
                där operation = @operation och objekt = @object och beskrivning = @description
        )
            raiserror (N'Internt fel i RBS. Försök att räkna den ogiltiga prestandaräknaren. Räknare: <%d>.<%d>.<%s>."
                16, 101, @operation, @object, @description)

        välja
                @type = typ,
                @secondsUsed = seconds_used
            från
                mssqlrbs_resources.rbs_internal_counters
            där
                operation = @operation och
                objekt = @object och
                beskrivning = @description

        om @object != 0
        börja
            om @value är null
                raiserror (N'Internt fel i RBS. Värdet har inte angetts för prestandaräknaren <%d>.<%d>.<%s>."
                    16, 103, @operation, @object, @description)
        end

        om @secondsUsed = 1
        börja
            Om (@start_time är null)
                raiserror (N'Internt fel i RBS. Starttid har inte angetts för prestandaräknaren <%d>.<%d>.<%s>."
                    16, 102, @operation, @object, @description)

            SET @end\_time = ISNULL(@end_time, GetUTCDATE())

            Om (@start_time >@end\_time)
                raiserror (N'Internt fel i RBS. Starttiden är efter sluttiden. Räknare: <%d>.<%d>.<%s>."
                    16, 104, @operation, @object, @description)

            If (DateDiff(dag, @start\_time, @end\_time)>= @maxDays)
            börja
                SET = CONVERT @seconds (float, datediff(second, @start\_time, @end\_time))
            end
            annars
            börja
                SET = CONVERT @seconds (FLOAT, DATEDIFF(MILLISECOND, @start\_time, @end\_time)) / 1000
            end
        end

        uppdatera mssqlrbs_resources.rbs_internal_counters
            ange
                antal = antal + 1,
                värde = värde + @value,
                squared_value = squared_value + fyrkant(@value),
                min_value = kasus
                                när min_value är null då @value
                                när (@value < min_value) då @value
                                annars min_value
                            slutet,
                max_value = kasus
                                när max_value är null då @value
                                när (@value > max_value) då @value
                                annars max_value
                            slutet,
                last_value = @value,
                sekunder = sekunder + @seconds,
                squared_seconds = squared_seconds + fyrkant(@seconds),
                min_seconds = kasus
                                när min_seconds är null då @seconds
                                När (@seconds < min_seconds) då @seconds
                                annars min_seconds
                            slutet,
                max_seconds = kasus
                                när max_seconds är null då @seconds
                                när (@seconds > max_seconds) då @seconds
                                annars max_seconds
                            slutet,
                last_seconds = @seconds,
                last_update_time = getutcdate(),
                last_message = @message
            där
                operation = @operation och
                objekt = @object och
                beskrivning = @description

    end
    gå

Status

Microsoft har bekräftat att detta är ett problem i de Microsoft-produkter som anges i avsnittet "Gäller".