當您在 SQL Server 2012年或 SQL Server 2014年執行 RBS Maintainer 的修正程式: 錯誤

狀況

假設您使用 Microsoft SQL Server 2012年或 SQL Server 2014年。當您執行遠端 BLOB 儲存 (RBS) Maintainer 時,RBS Maintainer 工具失敗,,並且您會收到下列錯誤訊息:

正在開始 Maintainer 工作。
正在啟動廢棄項目收集。
啟動參考掃描。
參考掃描已完成此資料庫。
掃描 113 blob。刪除範圍為 0x00000000000000b600000002(inclusive) 的 0x000000000000000000000000(exclusive) 的 0 blob。
這項工作已結束。已處理的 1 的工時單位總數。0 的工時單位是不完整。
正在開始刪除傳播。
這次不不使用任何工作。
其他用戶端、 處理序或執行緒可能正在目前處理其他工作。
略過目前的工作單位,因為發生錯誤。如需詳細資訊,請參閱 RBS Maintainer 記錄檔。
[..]
這項工作已結束。處理總 102 的工時單位。101 個工作單位是不完整。需要用來刪除 0 blob。成功刪除 blob 0,0 的 blob 找不到 blob 存放區中。
這項工作已結束。
這項工作已結束。


當您使用程式碼剖析工具來追蹤問題時,您會收到下列錯誤訊息:

訊息 50000,層次 16,狀態 0,第 rbs_sp_rethrow_error 程序行 38
RBS 時發生錯誤。原始的錯誤: 535 的數字、 高的嚴重性等級 16,狀態 0,程序 rbs_sp_count 行 52,
訊息: Datediff 函式導致溢位。日期分隔兩個日期/時間的執行個體數目值太大。請試著使用 datediff 比較不精確的日期部份。

原因

之所以發生這個問題,是因為一個查詢,檢查上次執行之後的時間因溢位時將值轉換為毫秒。這會導致查詢失敗,要結束而不處理資料的工作。

解決方案

使用 RBS.msi 的最新功能套件下載中的修正這個問題。如果您已經有現存的 RBS 安裝,我們建議您執行指令碼可以暫時修正這個問題的 < 其他可行方案=""> 一節中所提供。

下載 Microsoft SQL Server 2014 Service Pack 2 (SP2) 功能套件

下載 Microsoft SQL Server 2012 Service Pack 4 (SP4) 功能套件

因應措施

如果您有現有的 SQL Server 2012年上並沒有安裝此修正程式的 SQL Server 2014 RBS 安裝時,您可以使用下列因應措施的步驟:

  1. 在 SSMS,從步驟 3,開啟指令碼,然後連線至 SQL Server 執行個體裝載您要套用修正程式的 RBS 用戶端資料庫。

  2. 在 [指令碼,取代 RBS 用戶端資料庫的實際名稱中的"your_RBS_client_database"字串。

  3. 執行指令碼套用修正程式。

    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

狀態

Microsoft 已確認這是<套用>一節所列出的 Microsoft 產品的問題。

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

Thank you for your feedback!

Thank you for your feedback! It sounds like it might be helpful to connect you to one of our Office support agents.

×