Συμπτώματα
Εξετάστε το ακόλουθο σενάριο:
-
Εγκαθιστάτε μια παρουσία του Microsoft SQL Server 2005, του Microsoft SQL Server 2008 ή του Microsoft SQL Server 2008 R2.
-
Η παρουσία του SQL Server ονομάζεται INST1 και φιλοξενεί μια βάση δεδομένων που ονομάζεται Test_RO_FG_DB.
-
Η βάση δεδομένων περιέχει τις ακόλουθες ομάδες αρχείων:
-
Πρωτοβάθμια
-
RO_FG
-
RW_FG
-
-
Η ομάδα αρχείων που ονομάζεται RO_FG επισημαίνεται ως READ_ONLY.
-
Εγκαθιστάτε μια νέα παρουσία του Microsoft SQL Server 2012. Αυτή η παρουσία SQL Server 2012 ονομάζεται INST2.
-
Μπορείτε να αποσυνδέσετε τη βάση δεδομένων Test_RO_FG_DB από το INST1.
-
Προσπαθείτε να επισυνάψετε τη βάση δεδομένων Test_RO_FG_DB στο INST2.
-
Λαμβάνετε ένα μήνυμα σφάλματος που μοιάζει με το ακόλουθο:
Msg 3415, Level 16, State 2, Line 1Database 'Test_RO_FG_DB' δεν είναι δυνατό να αναβαθμιστεί επειδή είναι μόνο για ανάγνωση, έχει αρχεία μόνο για ανάγνωση ή ο χρήστης δεν έχει δικαιώματα τροποποίησης ορισμένων από τα αρχεία. Ορίστε τη βάση δεδομένων ή τα αρχεία με δυνατότητα εγγραφής και επαναλάβετε την αποκατάσταση.
-
Προσπαθείτε να επανασυνδέετε τη βάση δεδομένων Test_RO_FG_DB στο INST1.
Σε αυτό το σενάριο, δεν μπορείτε να επανασυνδέστε τη βάση δεδομένων στο INST1. Επίσης, εμφανίζεται το ακόλουθο μήνυμα σφάλματος στο αρχείο καταγραφής σφαλμάτων SQL Server:
Σημείωση Αυτό το πρόβλημα παρουσιάζεται μόνο όταν προσπαθείτε να επισυνάψετε μια βάση δεδομένων που περιέχει μια ομάδα αρχείων που έχει επισημανθεί READ_ONLY. Αυτό το πρόβλημα δεν παρουσιάζεται όταν προσπαθείτε να μετακινήσετε μια βάση δεδομένων READ_ONLY στην οποία όλα τα δεδομένα επισημαίνονται READ_ONLY.
Αιτία
Αυτό το πρόβλημα παρουσιάζεται επειδή SQL Server 2012 δεν εντοπίζει την ομάδα αρχείων μόνο για ανάγνωση πριν ξεκινήσει την αναβάθμιση της βάσης δεδομένων. Μετά την έναρξη της αναβάθμισης, SQL Server 2012 γράφει καταχωρήσεις στο αρχείο καταγραφής συναλλαγών. Οι παλαιότερες εκδόσεις δεν μπορούν να διαβάσουν τις νέες καταχωρήσεις του αρχείου καταγραφής συναλλαγών.
Κατάσταση
Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για πρόβλημα στα προϊόντα της Microsoft που αναφέρονται στην ενότητα "Ισχύει για".
Επίλυση
Πληροφορίες συγκεντρωτικής ενημέρωσης
SQL Server 2012
Η επιδιόρθωση για αυτό το πρόβλημα κυκλοφόρησε για πρώτη φορά στην Αθροιστική ενημέρωση 2 για SQL Server 2012. Για περισσότερες πληροφορίες σχετικά με αυτό το πακέτο αθροιστικής ενημέρωσης, κάντε κλικ στον αριθμό του παρακάτω άρθρου για να προβάλετε το άρθρο στη Γνωσιακή βάση της Microsoft:
2703275 Πακέτο αθροιστικής ενημέρωσης 2 για SQL Server 2012Note Επειδή οι εκδόσεις είναι αθροιστικές, κάθε νέα έκδοση επιδιόρθωσης περιέχει όλες τις άμεσες επιδιορθώσεις και όλες τις επιδιορθώσεις ασφαλείας που περιλαμβάνονταν στην προηγούμενη έκδοση επιδιόρθωσης SQL Server 2012. Η Microsoft συνιστά να εξετάσετε το ενδεχόμενο να εφαρμόσετε την πιο πρόσφατη έκδοση επιδιόρθωσης που περιέχει αυτήν την άμεση επιδιόρθωση. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για προβολή του άρθρου στη Γνωσιακή Βάση της Microsoft:
2692828 Οι εκδόσεις SQL Server 2012 που κυκλοφόρησαν μετά την κυκλοφορία του SQL Server 2012 Πρέπει να εφαρμόσετε μια άμεση επιδιόρθωση του SQL Server 2012 σε μια εγκατάσταση του SQL Server 2012.
Λύση
Για να επιλύσετε αυτό το πρόβλημα, χρησιμοποιήστε μία από τις παρακάτω μεθόδους.Μέθοδος 1Επαναφορά αντιγράφου ασφαλείας της βάσης δεδομένων από το INST1 στο INST2.Σημείωση Το πρόβλημα που περιγράφεται στην ενότητα "Συμπτώματα" δεν παρουσιάζεται στο SQL Server 2012 κατά την επαναφορά ενός αντιγράφου ασφαλείας από προηγούμενη έκδοση.Μέθοδος 2Εκτελέστε μια επιτόπου αναβάθμιση της προηγούμενης έκδοσης του SQL Server σε SQL Server 2012.Μέθοδος 3Μετακινήστε μια βάση δεδομένων που περιέχει μια ομάδα αρχείων μόνο για ανάγνωση σε μια παρουσία SQL Server 2012. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα.Σημείωση Εκτελέστε τα βήματα 4 έως 11 στο διακομιστή που εκτελεί SQL Server 2012. Για παράδειγμα, εκτελέστε τα βήματα 4 έως 11 στο INST2.
-
Στο INST1, αποσυνδέστε τη βάση δεδομένων. Για παράδειγμα, αποσυνδέστε τη βάση δεδομένων Test_RO_FG_DB.
-
Μετακινήστε τα αρχεία βάσης δεδομένων στο διακομιστή που φιλοξενεί την παρουσία INST2.
-
Προσπαθήστε να επισυνάψετε τη βάση δεδομένων στο INST2. Το παρακάτω δείγμα κώδικα δείχνει πώς μπορείτε να το κάνετε αυτό:
CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG.mdf' ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_File1.ndf' ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RW_FG_File1.ndf' )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_log.ldf' )FOR ATTACH;GO
Σημείωση Θα λάβετε το μήνυμα σφάλματος 3425 που αναφέρεται στην ενότητα "Συμπτώματα".
-
Σε μια γραμμή εντολών, μετονομάστε τα αρχεία βάσης δεδομένων. Η παρακάτω εντολή δείγματος δείχνει πώς μπορείτε να το κάνετε αυτό:
rename Test_RO_FG.mdf original_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf original_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf original_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf original_Test_RO_FG_log.ldf
-
Στο SQL Server Management Studio, δημιουργήστε μια βάση δεδομένων που έχει το ίδιο όνομα και φυσική δομή με τη βάση δεδομένων που θέλετε να επισυνάψετε. Το παρακάτω δείγμα κώδικα δείχνει πώς μπορείτε να το κάνετε αυτό:
CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_DB.mdf' , SIZE = 4072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RW_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\Test_RO_FG_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO
-
Ορίστε τη βάση δεδομένων σε εκτός σύνδεσης. Για να το κάνετε αυτό, εκτελέστε την ακόλουθη εντολή:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
Σε μια γραμμή εντολών, μετονομάστε τα αρχεία στη νέα βάση δεδομένων. Η παρακάτω εντολή δείγματος δείχνει πώς μπορείτε να το κάνετε αυτό:
rename Test_RO_FG.mdf new_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf new_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf new_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf new_Test_RO_FG_log.ldf
-
Σε μια γραμμή εντολών, μετονομάστε τα αρχεία στη βάση δεδομένων που μετακινήσατε στο βήμα 2. Μετονομάστε τα αρχεία ώστε να ταιριάζουν με τη βάση δεδομένων που δημιουργήσατε στο βήμα 4. Η παρακάτω εντολή δείγματος δείχνει πώς μπορείτε να το κάνετε αυτό:
rename original_Test_RO_FG.mdf Test_RO_FG.mdf rename original_Test_RO_FG_File1.ndf Test_RO_FG_File1.ndf rename original_Test_RW_FG_File1.ndf Test_RW_FG_File1.ndf rename original_Test_RO_FG_log.ldf Test_RO_FG_log.ldf
-
Ορίστε τη βάση δεδομένων σε ONLINE. Για να το κάνετε αυτό, εκτελέστε την ακόλουθη εντολή:
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Βεβαιωθείτε ότι η βάση δεδομένων είναι σε σύνδεση και επαναφέρετε τις λειτουργίες του Service Broker.
-
Διαγράψτε τα αρχεία βάσης δεδομένων που δεν είναι απαραίτητα. Η παρακάτω εντολή δείγματος δείχνει πώς μπορείτε να το κάνετε αυτό:
del /P new_Test_RO_FG.mdfdel /P new_Test_RO_FG_File1.ndfdel /P new_Test_RW_FG_File1.ndfdel /P new_Test_RO_FG_log.ldf
Μέθοδος 4Επανασυνδέστε μια βάση δεδομένων που περιέχει μια ομάδα αρχείων μόνο για ανάγνωση στην προηγούμενη παρουσία SQL Server. Για να το κάνετε αυτό, ακολουθήστε τα εξής βήματα.Σημειώσεις
-
Η βάση δεδομένων περιέχει επίσης τις νέες καταχωρήσεις αρχείου καταγραφής συναλλαγών από την αποτυχημένη αναβάθμιση.
-
Εκτελέστε τα βήματα 3 έως 10 στο διακομιστή που εκτελεί μια παλαιότερη έκδοση του SQL Server. Για παράδειγμα, εκτελέστε τα βήματα 3 έως 10 στο INST1.
-
Μετακινήστε τα αρχεία βάσης δεδομένων στην παρουσία του SQL Server που φιλοξενεί το INST1.
-
Προσπαθήστε να επισυνάψετε τη βάση δεδομένων στο INST1. Το παρακάτω δείγμα κώδικα δείχνει πώς μπορείτε να το κάνετε αυτό:
CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_DB.mdf' ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_File1.ndf' ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RW_FG_File1.ndf' )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_log.ldf' )FOR ATTACHGO
Σημείωση Θα λάβετε το μήνυμα σφάλματος 3624 που αναφέρεται στην ενότητα "Συμπτώματα". Θα λάβετε επίσης ένα μήνυμα σφάλματος 1813.
-
Σε μια γραμμή εντολών, μετονομάστε τα αρχεία βάσης δεδομένων στο INST1. Η παρακάτω εντολή δείγματος δείχνει πώς μπορείτε να το κάνετε αυτό:
rename Test_RO_FG.mdf original_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf original_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf original_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf original_Test_RO_FG_log.ldf
-
Στο SQL Server Management Studio, δημιουργήστε μια βάση δεδομένων που έχει το ίδιο όνομα και φυσική δομή με τη βάση δεδομένων που θέλετε να επισυνάψετε. Το παρακάτω δείγμα κώδικα δείχνει πώς μπορείτε να το κάνετε αυτό:
CREATE DATABASE [Test_RO_FG_DB] ON PRIMARY ( NAME = N'Test_RO_FG_DB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_DB.mdf' , SIZE = 4072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RO_FG] ( NAME = N'Test_RO_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [RW_FG] ( NAME = N'Test_RW_FG_File1', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RW_FG_File1.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )LOG ON ( NAME = N'Test_RO_FG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2\MSSQL\DATA\Test_RO_FG_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO
-
Ορίστε τη βάση δεδομένων σε εκτός σύνδεσης. Για να το κάνετε αυτό, εκτελέστε την ακόλουθη εντολή:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
Σε μια γραμμή εντολών, μετονομάστε τα αρχεία στη νέα βάση δεδομένων. Η παρακάτω εντολή δείγματος δείχνει πώς μπορείτε να το κάνετε αυτό:
rename Test_RO_FG.mdf new_Test_RO_FG.mdfrename Test_RO_FG_File1.ndf new_Test_RO_FG_File1.ndfrename Test_RW_FG_File1.ndf new_Test_RW_FG_File1.ndfrename Test_RO_FG_log.ldf new_Test_RO_FG_log.ldf
-
Σε μια γραμμή εντολών, μετονομάστε τα αρχεία στη βάση δεδομένων που μετακινήσατε στο βήμα 2. Μετονομάστε τα αρχεία ώστε να ταιριάζουν με τη βάση δεδομένων που δημιουργήσατε στο βήμα 4. Η παρακάτω εντολή δείγματος δείχνει πώς μπορείτε να το κάνετε αυτό:
rename original_Test_RO_FG.mdf Test_RO_FG.mdf rename original_Test_RO_FG_File1.ndf Test_RO_FG_File1.ndf rename original_Test_RW_FG_File1.ndf Test_RW_FG_File1.ndf rename original_Test_RO_FG_log.ldf Test_RO_FG_log.ldf
-
Ορίστε τη βάση δεδομένων σε λειτουργία ΈΚΤΑΚΤΗς ανάγκης και εκτελέστε μια επιδιόρθωση. Για να το κάνετε αυτό, εκτελέστε την ακόλουθη εντολή.Σημείωση Τα αρχεία καταγραφής συναλλαγών βάσης δεδομένων αναδομούνται κατά τη διάρκεια αυτού του βήματος. Αυτό μπορεί να έχει ως αποτέλεσμα την απώλεια δεδομένων. Επομένως, συνιστάται να δημιουργήσετε αντίγραφα ασφαλείας της βάσης δεδομένων πριν να εκτελέσετε αυτό το βήμα.
ALTER DATABASE Test_RO_FG_DB SET EMERGENCYGOALTER DATABASE Test_RO_FG_DB SET SINGLE_USERGODBCC CHECKDB (Test_RO_FG_DB, repair_allow_data_loss) WITH ALL_ERRORMSGSGOALTER DATABASE Test_RO_FG_DB SET MULTI_USERGO
-
Βεβαιωθείτε ότι η βάση δεδομένων είναι σε σύνδεση και επαναφέρετε τις λειτουργίες του Service Broker.
-
Διαγράψτε τα αρχεία βάσης δεδομένων που δεν είναι απαραίτητα. Η παρακάτω εντολή δείγματος δείχνει πώς μπορείτε να το κάνετε αυτό:
del /P new_Test_RO_FG.mdfdel /P new_Test_RO_FG_File1.ndfdel /P new_Test_RW_FG_File1.ndfdel /P new_Test_RO_FG_log.ldf
Περισσότερες πληροφορίες
Υπάρχουν αρκετά βήματα που προκύπτουν όταν μια βάση δεδομένων είναι προσαρτημένη σε μια παρουσία SQL Server. Αυτά τα βήματα περιλαμβάνουν την ανάκτηση της βάσης δεδομένων και την αναβάθμιση των αρχείων από προηγούμενες εκδόσεις του SQL Server. Στο ζήτημα που περιγράφεται στην ενότητα "Συμπτώματα", SQL Server 2012 ξεκινά τη διαδικασία αναβάθμισης πριν εντοπιστούν τα αρχεία μόνο για ανάγνωση στη βάση δεδομένων. Τα βήματα αναβάθμισης περιλαμβάνουν την έναρξη μιας συναλλαγής για την εκκαθάριση του bit "καθαρός τερματισμός λειτουργίας" στη σελίδα εκκίνησης της βάσης δεδομένων. Οι παλαιότερες εκδόσεις του SQL Server δεν μπορούν να διαβάσουν την εγγραφή έναρξης συναλλαγής. Επομένως, η βάση δεδομένων δεν μπορεί να χρησιμοποιηθεί σε παλαιότερες εκδόσεις του SQL Server και SQL Server δημιουργεί το σφάλμα 3624.Επιτόπου αναβαθμίσεις όταν μια βάση δεδομένων επισημαίνεται ως μόνογια ανάγνωση Όταν πραγματοποιείτε μια επιτόπου αναβάθμιση μιας παρουσίας SQL Server που περιέχει μια βάση δεδομένων μόνο για ανάγνωση που ονομάζεται Test_RO_DB SQL Server 2012, ενδέχεται να λάβετε μηνύματα σφάλματος που μοιάζουν με τα παρακάτω στο αρχείο καταγραφής σφαλμάτων SQL Server:
Στο τέλος της διαδικασίας αναβάθμισης, η βάση δεδομένων Test_RO_DB θα βρίσκεται σε κατάσταση RECOVERY_PENDING. Πρέπει να χρησιμοποιήσετε την εντολή ALTER DATABASE για να ορίσετε τη βάση δεδομένων σε READ_WRITE. Στη συνέχεια, χρησιμοποιήστε την εντολή ALTER DATABASE για να ορίσετε τη βάση δεδομένων σε READ_ONLY. Αυτό επιτρέπει στον μηχανισμό SQL Server να αναβαθμίσει τη βάση δεδομένων στη σωστή έκδοση.Επιτόπιες αναβαθμίσεις όταν μια βάση δεδομένων ανάγνωσης/εγγραφής περιέχει ομάδες αρχείων που επισημαίνονται ως μόνογια ανάγνωση Όταν πραγματοποιείτε μια επιτόπου αναβάθμιση σε SQL Server 2012, ενδέχεται να λάβετε μηνύματα που μοιάζουν με τα παρακάτω στο αρχείο καταγραφής σφαλμάτων SQL Server. Αυτό το πρόβλημα παρουσιάζεται όταν η προηγούμενη παρουσία του SQL Server φιλοξενεί μια βάση δεδομένων ανάγνωσης/εγγραφής και περιέχει ομάδες αρχείων που επισημαίνονται READ_ONLY. Ωστόσο, η διαδικασία αναβάθμισης ολοκληρώνεται όπως αναμένεται και η βάση δεδομένων ξεκινά online.Σημείωση Στο ακόλουθο μήνυμα σφάλματος, η βάση δεδομένων ονομάζεται Test_RO_FG: