תיקון: שגיאה בעת הפעלת מתחזק RBS ב-SQL Server 2012 או ב-SQL Server 2014

חל על
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)

סימפטומים

נניח שאתה משתמש ב- Microsoft SQL Server 2012 או ב- SQL Server 2014. בעת הפעלת 'מתחזק אחסון BLOB מרוחק (RBS)', כלי התחזוקה של RBS נכשל ואתה מקבל את הודעת השגיאה הבאה:

הערה

הפעלת משימות תחזוקה.
    התחלת איסוף אשפה.
        הפעלת סריקת העיון.
            סריקת הפניות הושלמה עבור מסד נתונים זה.
            סרק 113 כתמים. מחיקת 0 נקודות Blob בטווח שבין 0x000000000000000000000000(לא כולל) עד 0x00000000000000b600000002(כולל).
        משימה זו הסתיימה. עובד 1 יחידות עבודה בסך הכל. 0 יחידות עבודה לא הושלמו.
        התחלת הפצת מחיקה.
            אין עבודה זמינה כעת.
            ייתכן שלקוחות, תהליכים או שרשורים אחרים עובדים כעת על משימות אחרות.
            דילוג על יחידת העבודה הנוכחית עקב שגיאה. לקבלת מידע נוסף, עיין ביומן RBS Maintainer.
    [..]
        משימה זו הסתיימה. עיבדו 102 יחידות עבודה בסך הכל. 101 יחידות עבודה לא הושלמו. נדרש למחיקת 0 כתמים. הצליח למחוק 0 כתמים, 0 כתמים לא נמצאו במאגר הכתמים.
    משימה זו הסתיימה.
משימה זו הסתיימה.

בעת שימוש ב-Profiler כדי לעקוב אחר הבעיה, מתקבלת הודעת השגיאה הבאה:

הערה

Msg 50000, רמה 16, מצב 0, נוהל rbs_sp_rethrow_error, שורה 38
שגיאת RBS. שגיאה מקורית: מספר 535, חומרה 16, מצב 0, נוהל rbs_sp_count, שורה 52,
הודעה: הפונקציה datediff גרמה לגלישה. מספר חלקי התאריך המפרידים בין שני מופעי תאריך/שעה גדול מדי. נסה להשתמש ב-datediff עם datepart פחות מדויק.

גורם

בעיה זו מתרחשת מכיוון ששאילתה הבודקת את הזמן מאז הביצוע האחרון עלולה לגלוש בעת המרת ערך לאלפיות שניה. פעולה זו גורמת לשאילתה להיכשל ולסיום המשימה ללא עיבוד הנתונים.

פתרון

התיקון לבעיה זו זמין בהורדת ערכת התכונות העדכנית ביותר עבור RBS.msi. אם כבר יש לך התקנה קיימת של RBS, מומלץ להפעיל את קובץ ה- Script הכלול בסעיף "פתרון" כדי לפתור את הבעיה באופן זמני.

הורד את ערכת התכונות Microsoft SQL Server 2014 Service Pack 2 (SP2)
        
         הורד את ערכת התכונות Microsoft SQL Server 2012 Service Pack 4 (SP4)

פתרון

אם יש לך התקנה קיימת של RBS ב- SQL Server 2012 או SQL Server 2014 שלא מותקן בה התיקון, באפשרותך להשתמש בשלבי הפתרון הבאים:

  1. ב- SSMS, פתח את קובץ ה- Script משלב 3 ולאחר מכן התחבר למופע של SQL Server המארח את מסד הנתונים של לקוח RBS שעליו ברצונך להחיל את התיקון.

  2. בקובץ ה- Script, החלף את המחרוזת "your_RBS_client_database" בשם בפועל של מסד הנתונים של לקוח RBS.

  3. הפעל את קובץ ה- Script כדי להחיל את התיקון.

    השתמש ב- [your_RBS_client_database]
    בצע

    אם object_id(N'mssqlrbs_resources.rbs_sp_count') אינו Null
        פרוצדורת שחרור mssqlrbs_resources.rbs_sp_count
    בצע

    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
    )
    כ
    התחלה

        הצהר @type tinyint,
                @secondsUsed סיביות,
                @seconds לצוף

        Declaration @maxDays int = 10;

        if not exists (
            בחר * מתוך mssqlrbs_resources.rbs_internal_counters
                כאשר פעולה = @operation ואובייקט = @object ותיאור = @description
        )
            raiserror (N'שגיאה פנימית ב-RBS. ניסיון לספור מונה ביצועים לא חוקי. מונה: <%d>.<%ד>.<%s>.',
                16, 101, @operation, @object, @description)

        בחר
                @type = סוג,
                @secondsUsed = seconds_used
            מ-
                mssqlrbs_resources.rbs_internal_counters
            כאשר
                operation = @operation and
                אובייקט = @object וגם
                תיאור = @description

        if @object != 0
        התחלה
            if @value is null
                raiserror (N'שגיאה פנימית ב-RBS. ערך שלא צוין עבור מונה <הביצועים %d>.<%ד>.<%s>.',
                    16, 103, @operation, @object, @description)
        end

        if @secondsUsed = 1
        התחלה
            If (@start_time is null)
                raiserror (N'שגיאה פנימית ב-RBS. שעת ההתחלה לא צוינה עבור מונה <הביצועים %d>.<%ד>.<%s>.',
                    16, 102, @operation, @object, @description)

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

            אם (@start_time >@end\_time)
                raiserror (N'שגיאה פנימית ב-RBS. שעת ההתחלה היא לאחר שעת הסיום. מונה: <%d>.<%ד>.<%s>.',
                    16, 104, @operation, @object, @description)

            if (datediff(day, @start\_time, = @end\_time)>@maxDays)
            התחלה
                Set @seconds = convert(float, datediff(second, @start\_time, @end\_time))
            end
            אחר
            התחלה
                Set @seconds = convert(float, datediff(millisecond, @start\_time, @end\_time)) / 1000
            end
        end

        עדכון mssqlrbs_resources.rbs_internal_counters
            הגדרה
                count = count + 1,
                ערך = ערך + @value,
                squared_value = squared_value + square(@value),
                min_value = רישיות
                                כאשר min_value הוא Null אז @value
                                כאשר (@value < min_value) אז @value
                                אחרת min_value
                            סוף,
                max_value = מקרה
                                כאשר max_value הוא Null אז @value
                                כאשר (@value > max_value) אז @value
                                אחרת max_value
                            סוף,
                last_value = @value,
                שניות = שניות + @seconds,
                squared_seconds = squared_seconds + square(@seconds),
                min_seconds = מקרה
                                כאשר min_seconds הוא Null אז @seconds
                                כאשר (@seconds < min_seconds) אז @seconds
                                אחרת min_seconds
                            סוף,
                max_seconds = מקרה
                                כאשר max_seconds הוא Null אז @seconds
                                כאשר (@seconds > max_seconds) אז @seconds
                                אחרת max_seconds
                            סוף,
                last_seconds = @seconds,
                last_update_time = getutcdate(),
                last_message = @message
            כאשר
                operation = @operation and
                אובייקט = @object וגם
                תיאור = @description

    end
    בצע

מצב

Microsoft אישרה שזוהי בעיה במוצרי Microsoft המפורטים בסעיף "חל על".