POPRAVAK: Pogreška prilikom pokretanja održavatelja RBS-a u sustavu SQL Server 2012 ili SQL Server 2014

Primjenjuje se na
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)

Simptomi

Pretpostavimo da koristite Microsoft SQL Server 2012 ili SQL Server 2014. Kada pokrenete Remote BLOB Storage (RBS) Maintainer, alat za održavanje RBS-a ne funkcionira i prikazuje se sljedeća poruka o pogrešci:

Napomena

Pokretanje zadataka održavatelja.
    Pokretanje odvoza smeća.
        Pokretanje pregleda referenci.
            Pregled referenci dovršen je za ovu bazu podataka.
            Skenirano 113 blobova. Izbrisane su 0 blobova u rasponu od 0x000000000000000000000000(isključivo) do 0x00000000000000b600000002(uključivo).
        Zadatak je završio. Ukupno obrađena 1 radna jedinica. 0 Radne jedinice bile su nedovršene.
        Pokretanje propagacije brisanja.
            Trenutno ne postoji nijedan rad.
            Možda drugi klijenti, procesi ili niti trenutno rade na drugim zadacima.
            Preskakanje trenutne jedinice rada zbog pogreške. Dodatne informacije potražite u zapisniku održavatelja RBS-a.
    [..]
        Zadatak je završio. Obrađene ukupno 102 radne jedinice. 101 radna jedinica bila je nedovršena. Potrebno je za brisanje 0 blobova. Uspjelo je brisanje 0 blobova, 0 blobova nije pronađeno u spremištu blobova.
    Zadatak je završio.
Zadatak je završio.

Kada problem pratite pomoću profilera, prikazuje vam se sljedeća poruka o pogrešci:

Napomena

poruka 50000, razina 16, stanje 0, postupak rbs_sp_rethrow_error, redak 38
RBS pogreška. Izvorna pogreška: broj 535, ozbiljnost problema 16, stanje 0, procedura rbs_sp_count, redak 52,
Poruka: Funkcija datediff uzrokovala je prelijevanje. Broj dijelova datuma koji odjeljuju dvije instance datuma/vremena je prevelik. Pokušajte koristiti datediff s manje preciznim dijelom datuma.

Uzrok

Taj se problem pojavljuje jer upit koji provjerava vrijeme od posljednjeg izvršavanja može prekoračiti kada vrijednost pretvori u milisekunde. Zbog toga upit ne uspijeva i zadatak završava bez obrade podataka.

Rješenje

Rješenje tog problema dostupno je u preuzimanju najnovijeg paketa značajki za RBS.msi. Ako već imate postojeću instalaciju RBS-a, preporučujemo da pokrenete skriptu navedenu u odjeljku "Zaobilazno rješenje" da biste privremeno riješili problem.

Preuzimanje paketa značajki za Microsoft SQL Server 2014 Service Pack 2 (SP2)
        
         Preuzimanje paketa značajki za Microsoft SQL Server 2012 Service Pack 4 (SP4)

Zaobilazno rješenje

Ako imate postojeću instalaciju RBS-a u sustavu SQL Server 2012 ili SQL Server 2014 na kojoj nije instaliran popravak, možete koristiti sljedeće korake iz zaobilaznog rješenja:

  1. U SSMS-u otvorite skriptu iz trećeg koraka, a zatim se povežite s instancom sustava SQL Server koja hostira bazu podataka RBS klijenta na koju želite primijeniti popravak.

  2. U skripti zamijenite niz "your_RBS_client_database" stvarnim nazivom klijentske baze podataka RBS-a.

  3. Pokrenite skriptu da biste primijenili popravak.

    Koristite [your_RBS_client_database]
    Idite na

    ako object_id(N'mssqlrbs_resources.rbs_sp_count') is not null
        Procedura ispuštanja mssqlrbs_resources.rbs_sp_count
    Idite na

    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
    )
    kao što je
    početak

        declare @type tinyint,
                @secondsUsed bit,
                @seconds float

        declare @maxDays int = 10;

        ako ne postoji (
            select * from mssqlrbs_resources.rbs_internal_counters
                gdje je operacija = @operation and object = @object and description = @description
        )
            raiserror (N'interna pogreška u RBS-u. Pokušaj brojanja brojača performansi koji nije valjan. Brojač: <%d>.<%d>.<%s>.',
                16, 101, @operation, , @object@description)

        odabir
                @type = vrsta,
                @secondsUsed = seconds_used
            iz
                mssqlrbs_resources.rbs_internal_counters
            pri čemu su
                operacija = @operation i
                objekt = @object i
                Opis = @description

        ako @object je != 0
        početak
            ako @value je null
                raiserror (N'interna pogreška u RBS-u. Vrijednost nije navedena za brojač <performansi %d>.<%d>.<%s>.',
                    16, 103, @operation, @object, @description)
        kraj

        ako @secondsUsed = 1
        početak
            if (@start_time je null)
                raiserror (N'interna pogreška u RBS-u. Vrijeme početka nije navedeno za brojač <performansi %d>.<%d>.<%s>.',
                    16, 102, @operation, @object, @description)

            set @end\_time = isnull(@end_time, getutcdate())

            if (@start_time >@end\_time)
                raiserror (N'interna pogreška u RBS-u. Vrijeme početka je nakon završetka. Brojač: <%d>.<%d>.<%s>.',
                    16, 104, @operation, @object, @description)

            if (DATEDIFF(dan, @start\_time, @end\_time)>= @maxDays)
            početak
                SET @seconds = CONVERT(FLOAT; DATEDIFF(sekunda; @start\_time; ; @end\_time))
            kraj
            inače
            početak
                SET @seconds = CONVERT(FLOAT, DATEDIFF(milisekunda, @start\_time, @end\_time)) / 1000
            kraj
        kraj

        update mssqlrbs_resources.rbs_internal_counters
            postavljanje
                broj = broj + 1,
                Vrijednost = vrijednost + @value,
                squared_value = squared_value + kvadrat(@value),
                min_value = velika i mala slova
                                Kada je min_value null, tada je vrijednost @value
                                kada (@value < min_value) tada @value
                                Else min_value
                            kraj,
                max_value = velika i mala slova
                                Kada je max_value null tada @value
                                kada (@value > max_value) tada @value
                                Else max_value
                            kraj,
                last_value = @value,
                sekunde = sekunde + @seconds,
                squared_seconds = squared_seconds + kvadrat(@seconds),
                min_seconds = velika i mala slova
                                Kada je min_seconds null, tada je vrijednost @seconds
                                kada (@seconds < min_seconds) tada @seconds
                                Else min_seconds
                            kraj,
                max_seconds = velika i mala slova
                                Kada je max_seconds null, tada @seconds
                                kada (@seconds > max_seconds) tada @seconds
                                Else max_seconds
                            kraj,
                last_seconds = , @seconds
                last_update_time = getutcdate(),
                last_message = @message
            pri čemu su
                operacija = @operation i
                objekt = @object i
                Opis = @description

    kraj
    Idite na

Status

Microsoft je potvrdio da je to problem u Microsoftovim proizvodima koji su navedeni u odjeljku „Odnosi se na“.