FIX: Fout bij het uitvoeren van RBS Maintainer in SQL Server 2012 of SQL Server 2014

Van toepassing op
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)

Symptomen

Stel dat u Microsoft SQL Server 2012 of SQL Server 2014 gebruikt. Wanneer u Remote BLOB Storage (RBS) Maintainer uitvoert, mislukt het hulpprogramma RBS Maintainer en wordt het volgende foutbericht weergegeven:

Opmerking

Onderhoudstaken starten.
    Beginnen met het ophalen van afval.
        Referentiescan starten.
            De verwijzingsscan voor deze database is voltooid.
            113 blobs gescand. 0 blobs verwijderd in het bereik van 0x000000000000000000000000(exclusief) tot 0x00000000000000b600000002(inclusief).
        Deze taak is beëindigd. In totaal 1 werkeenheden verwerkt. 0 Werkeenheden waren onvolledig.
        Doorgifte van verwijderen starten.
            Er is op dit moment geen werk beschikbaar.
            Andere clients, processen of threads werken momenteel mogelijk aan andere taken.
            De huidige werkeenheid overslaan vanwege een fout. Zie het logboek voor RBS-onderhoud voor meer informatie.
    [..]
        Deze taak is beëindigd. In totaal 102 werkeenheden verwerkt. 101 werkeenheden waren onvolledig. 0 blobs moeten worden verwijderd. Het verwijderen van 0 blobs is gelukt. Er zijn 0 blobs niet gevonden in het blobarchief.
    Deze taak is beëindigd.
Deze taak is beëindigd.

Wanneer u Profiler gebruikt om het probleem te traceren, ontvangt u het volgende foutbericht:

Opmerking

Msg 50000, Level 16, State 0, Procedure rbs_sp_rethrow_error, Line 38
RBS-fout. Oorspronkelijke fout: Getal 535, Ernst 16, Toestand 0, Procedure rbs_sp_count, regel 52,
Bericht: De functie datediff heeft een overloop opgeleverd. Het aantal dateparts tussen twee datum/tijd-exemplaren is te groot. Probeer datediff te gebruiken met een minder nauwkeurig datumdeel.

Oorzaak

Dit probleem doet zich voor omdat een query die de tijd controleert sinds de laatste uitvoering, kan overlopen wanneer een waarde wordt geconverteerd naar milliseconden. Dit zorgt ervoor dat de query mislukt en de taak wordt beëindigd zonder dat de gegevens worden verwerkt.

Oplossing

De oplossing voor dit probleem is beschikbaar in de meest recente feature pack-download voor RBS.msi. Als u al een bestaande installatie van RBS hebt, raden wij u aan het script uit te voeren dat wordt geleverd in de sectie 'Tijdelijke oplossing' om het probleem tijdelijk op te lossen.

Het functiepakket van Microsoft SQL Server 2014 Service Pack 2 (SP2) downloaden
        
         Het Microsoft SQL Server 2012 Service Pack 4 (SP4) feature pack downloaden

Tijdelijke oplossing

Als u een bestaande installatie van RBS op SQL Server 2012 of SQL Server 2014 hebt waarvoor de oplossing niet is geïnstalleerd, kunt u de volgende tijdelijke oplossing gebruiken:

  1. Open in SSMS het script uit stap 3 en maak vervolgens verbinding met het SQL Server-exemplaar waarin de RBS-clientdatabase wordt gehost waarop u de correctie wilt toepassen.

  2. Vervang in het script de tekenreeks 'your_RBS_client_database' door de werkelijke naam van de RBS-clientdatabase.

  3. Voer het script uit om de oplossing toe te passen.

    Gebruik [your_RBS_client_database]
    ga

    als object_id(N'mssqlrbs_resources.rbs_sp_count') niet null is
        procedure voor weghalen mssqlrbs_resources.rbs_sp_count
    ga

    create procedure mssqlrbs_resources.rbs_sp_count (
        @operation kleinste,
        @object smallint = 0,
        @value bigint = null,
        @start_time datetime = null,
        @end_time datetime = null,
        @description sysname = N'',
        @message nvarchar(max) = null
    )
    net zo
    beginnen

         @type declareer tinyint,
                @secondsUsed beetje,
                @seconds zwevend maken

         @maxDays declareer int = 10;

        indien niet bestaat (
            select * from mssqlrbs_resources.rbs_internal_counters
                waarbij bewerking = @operation en object = @object en beschrijving = @description
        )
            raiserror (N'Internal error in RBS. Poging om ongeldige prestatiemeteritems mee te tellen. Teller: <%d>.<%d>.<%s>.",
                16, 101, @operation, @object, @description)

        selecteren
                @type = type,
                @secondsUsed = seconds_used
            uit
                mssqlrbs_resources.rbs_internal_counters
            waarbij
                bewerking = @operation and
                object = @object and
                Beschrijving = @description

        als @object != 0
        beginnen
            if @value is null
                raiserror (N'Internal error in RBS. Waarde niet opgegeven voor prestatiemeteritem <%d>.<%d>.<%s>.",
                    16, 103, @operation, @object, @description)
        end

        ALS @secondsUsed = 1
        beginnen
            ALS (@start_time NULL IS)
                raiserror (N'Internal error in RBS. Begintijd niet opgegeven voor prestatiemeteritem <%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. De begintijd valt na de eindtijd. Teller: <%d>.<%d>.<%s>.",
                    16, 104, @operation, @object, @description)

            if (datediff(dag, @start\_time, @end\_time)>= @maxDays)
            beginnen
                set @seconds = convert(float, datediff(seconde, @start\_time, @end\_time))
            end
            anders
            beginnen
                set @seconds = convert(float, datediff(milliseconde, @start\_time, @end\_time)) / 1000
            end
        end

        update mssqlrbs_resources.rbs_internal_counters
            instellen
                aantal = aantal + 1,
                waarde = waarde + @value,
                squared_value = squared_value + kwadraat(@value),
                min_value = case
                                Als min_value null is, dan @value
                                Wanneer (@value < min_value) Then @value
                                anders min_value
                            einde,
                max_value = case
                                Als max_value null is, dan @value
                                Wanneer (@value > max_value) Then @value
                                anders max_value
                            einde,
                last_value = @value,
                seconden = seconden + @seconds,
                squared_seconds = squared_seconds + kwadraat(@seconds),
                min_seconds = case
                                Als min_seconds null is, dan @seconds
                                wanneer (@seconds < min_seconds) dan @seconds
                                anders min_seconds
                            einde,
                max_seconds = case
                                Als max_seconds null is, dan @seconds
                                Wanneer (@seconds > max_seconds) Then @seconds
                                anders max_seconds
                            einde,
                last_seconds = @seconds,
                last_update_time = getutcdate(),
                last_message = @message
            waarbij
                bewerking = @operation and
                object = @object and
                Beschrijving = @description

    end
    ga

Status

Microsoft heeft bevestigd dat dit een probleem is bij de Microsoft-producten die worden vermeld in het gedeelte 'Van toepassing op'.