ΕΠΙΔΙΌΡΘΩΣΗ: Σφάλμα κατά την εκτέλεση του συντηρητή 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 σταγόνες στην περιοχή από 0x000000000000000000000000(εκτός αυτού) έως και 0x00000000000000b600000002(συμπεριλαμβανομένων).
        Αυτή η εργασία έχει τερματιστεί. Υποβλήθηκαν σε επεξεργασία 1 μονάδα εργασίας συνολικά. 0 Οι μονάδες εργασίας ήταν ελλιπείς.
        Έναρξη μετάδοσης διαγραφής.
            Δεν υπάρχει διαθέσιμο έργο αυτήν τη στιγμή.
            Άλλοι υπολογιστές-πελάτες, διαδικασίες ή νήματα ενδέχεται να εργάζονται αυτήν τη στιγμή σε άλλες εργασίες.
            Παράλειψη της τρέχουσας μονάδας εργασίας λόγω σφάλματος. Για περισσότερες πληροφορίες, ανατρέξτε στο αρχείο καταγραφής συντηρητή RBS.
    [..]
        Αυτή η εργασία έχει τερματιστεί. Υποβλήθηκαν σε επεξεργασία 102 μονάδες εργασίας συνολικά. 101 μονάδες εργασίας ήταν ελλιπείς. Απαιτείται για τη διαγραφή 0 blobs. Κατάφερε να διαγράψει 0 blobs, 0 blobs δεν βρέθηκαν στο χώρο αποθήκευσης blob.
    Αυτή η εργασία έχει τερματιστεί.
Αυτή η εργασία έχει τερματιστεί.

Όταν χρησιμοποιείτε το Profiler για την ανίχνευση του προβλήματος, λαμβάνετε το ακόλουθο μήνυμα λάθους:

Σημείωση

Msg 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)

Λύση

Εάν έχετε μια υπάρχουσα εγκατάσταση της υπηρεσίας RBS στις SQL Server 2012 ή SQL Server 2014 που δεν έχει εγκατεστημένη την επιδιόρθωση, μπορείτε να χρησιμοποιήσετε τα παρακάτω βήματα επίλυσης:

  1. Στο SSMS, ανοίξτε τη δέσμη ενεργειών από το βήμα 3 και, στη συνέχεια, συνδεθείτε με την SQL Server παρουσία που φιλοξενεί τη βάση δεδομένων προγράμματος-πελάτη RBS στην οποία θέλετε να εφαρμόσετε την ενημέρωση κώδικα.

  2. Στη δέσμη ενεργειών, αντικαταστήστε τη συμβολοσειρά "your_RBS_client_database" με το πραγματικό όνομα της βάσης δεδομένων προγράμματος-πελάτη RBS.

  3. Εκτελέστε τη δέσμη ενεργειών για να εφαρμόσετε την επιδιόρθωση.

    χρήση [your_RBS_client_database]
    μετάβαση

    Εάν η object_id(N'mssqlrbs_resources.rbs_sp_count') δεν είναι null
        διαδικασία απόρριψης mssqlrbs_resources.rbs_sp_count
    μετάβαση

    Δημιουργία διαδικασίας 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 αιώρηση

        δηλώνουν @maxDays int = 10;

        εάν δεν υπάρχει (
            Επιλέξτε * from mssqlrbs_resources.rbs_internal_counters
                όπου operation = @operation and object = @object and description = @description
        )
            raiserror (N'Εσωτερικό σφάλμα στο RBS. Προσπαθήστε να καταμετρήσετε μη έγκυρο μετρητή επιδόσεων. Μετρητής: <%d>.<%δ>.<%s>.»,
                16, 101, @operation, @object, @description)

        επιλογή
                @type = τύπος,
                @secondsUsed = seconds_used
            από
                mssqlrbs_resources.rbs_internal_counters
            όπου
                λειτουργία = @operation και
                αντικείμενο = @object και
                Περιγραφή = @description

        εάν @object != 0
        εκκίνηση
            Εάν @value είναι Null
                raiserror (N'Εσωτερικό σφάλμα στο RBS. Η τιμή δεν έχει καθοριστεί για τον μετρητή <επιδόσεων %d>.<%δ>.<%s>.»,
                    16, 103, @operation, @object, @description)
        τέλος

        εάν @secondsUsed = 1
        εκκίνηση
            Εάν (@start_time είναι 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))
            τέλος
            αλλιώς,
            εκκίνηση
                set @seconds = convert(float, datediff(millisecond, @start\_time, @end\_time)) / 1000
            τέλος
        τέλος

        Ενημέρωση 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 και
                αντικείμενο = @object και
                Περιγραφή = @description

    τέλος
    μετάβαση

Κατάσταση

Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα που αφορά τα προϊόντα της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".