Symptomy
Rozpatrzmy następujący scenariusz:
-
Instalujesz wystąpienie programu Microsoft SQL Server 2005, Microsoft SQL Server 2008 lub Microsoft SQL Server 2008 R2.
-
Wystąpienie SQL Server nosi nazwę INST1 i hostuje bazę danych o nazwie Test_RO_FG_DB.
-
Baza danych zawiera następujące grupy plików:
-
Podstawowy
-
RO_FG
-
RW_FG
-
-
Grupa plików o nazwie RO_FG jest oznaczona jako READ_ONLY.
-
Instalujesz nowe wystąpienie programu Microsoft SQL Server 2012. To wystąpienie programu SQL Server 2012 nosi nazwę INST2.
-
Odłączasz bazę danych Test_RO_FG_DB od funkcji INST1.
-
Próbujesz dołączyć bazę danych Test_RO_FG_DB do inst2.
-
Zostanie wyświetlony komunikat o błędzie podobny do następującego:
Msg 3415, Level 16, State 2, Line 1Database "Test_RO_FG_DB" nie można uaktualnić, ponieważ jest tylko do odczytu, ma pliki tylko do odczytu lub użytkownik nie ma uprawnień do modyfikowania niektórych plików. Utwórz bazę danych lub pliki do zapisu i uruchom odzyskiwanie ponownie.
-
Próbujesz ponownie podłączyć bazę danych Test_RO_FG_DB do inst1.
W tym scenariuszu nie można ponownie podłączyć bazy danych do funkcji INST1. Ponadto w dzienniku błędów SQL Server jest wyświetlany następujący komunikat o błędzie:
Uwaga Ten problem występuje tylko podczas próby dołączenia bazy danych zawierającej grupę plików oznaczoną jako READ_ONLY. Ten problem nie występuje podczas próby przeniesienia bazy danych READ_ONLY, w której wszystkie dane są oznaczane READ_ONLY.
Przyczyna
Ten problem występuje, ponieważ SQL Server 2012 nie wykrywa grupy plików tylko do odczytu przed rozpoczęciem uaktualniania bazy danych. Po rozpoczęciu uaktualniania SQL Server 2012 zapisuje wpisy w dzienniku transakcji. Wcześniejsze wersje nie mogą odczytywać wpisów nowego dziennika transakcji.
Stan
Firma Microsoft potwierdziła, że jest to problem w produktach firmy Microsoft wymienionych w sekcji "Dotyczy".
Rozwiązanie
Informacje o aktualizacji zbiorczej
SQL Server 2012 r.
Poprawka rozwiązła ten problem została po raz pierwszy opublikowana w aktualizacji zbiorczej 2 dla SQL Server 2012. Aby uzyskać więcej informacji o tym zbiorczym pakiecie aktualizacji, kliknij następujący numer artykułu, aby wyświetlić ten artykuł w bazie wiedzy Microsoft Knowledge Base:
2703275 Pakiet aktualizacji zbiorczej 2 dla programu SQL Server 2012Note Ponieważ kompilacje są zbiorcze, każda nowa wersja poprawki zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń, które zostały uwzględnione w poprzedniej wersji poprawki SQL Server 2012. Firma Microsoft zaleca rozważenie zastosowania najnowszej wersji poprawki zawierającej tę poprawkę. Aby uzyskać więcej informacji, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
2692828 Kompilacje SQL Server 2012 wydane po wydaniu SQL Server 2012 Należy zastosować poprawkę SQL Server 2012 do instalacji SQL Server 2012.
Obejście
Aby obejść ten problem, użyj jednej z następujących metod.Metoda 1. Przywracanie kopii zapasowej bazy danych z poziomu funkcji INST1 w systemie INST2.Uwaga Problem opisany w sekcji "Objawy" nie występuje w SQL Server 2012 r. po przywróceniu kopii zapasowej z wcześniejszej wersji.Metoda 2. Przeprowadzenie uaktualnienia w miejscu wcześniejszej wersji SQL Server do wersji SQL Server 2012.Metoda 3Przenoszenie bazy danych zawierającej grupę plików tylko do odczytu do wystąpienia SQL Server 2012. W tym celu wykonaj następujące czynności.Uwaga Wykonaj kroki od 4 do 11 na serwerze z systemem SQL Server 2012. Na przykład wykonaj kroki od 4 do 11 w systemie INST2.
-
W systemie INST1 odłącz bazę danych. Na przykład odłącz Test_RO_FG_DB bazę danych.
-
Przenieś pliki bazy danych na serwer, na którym znajduje się wystąpienie INST2.
-
Spróbuj dołączyć bazę danych do inst2. W poniższym przykładowym kodzie pokazano, jak to zrobić:
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
Uwaga Zostanie wyświetlony komunikat o błędzie 3425 wymieniony w sekcji "Objawy".
-
W wierszu polecenia zmień nazwę plików bazy danych. Poniższe przykładowe polecenie pokazuje, jak to zrobić:
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
-
W SQL Server Management Studio utwórz bazę danych o takiej samej nazwie i strukturze fizycznej jak baza danych, którą chcesz dołączyć. W poniższym przykładowym kodzie pokazano, jak to zrobić:
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
-
Ustaw bazę danych w trybie offline. W tym celu uruchom następujące polecenie:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
W wierszu polecenia zmień nazwy plików w nowej bazie danych. Poniższe przykładowe polecenie pokazuje, jak to zrobić:
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
-
W wierszu polecenia zmień nazwę plików w bazie danych przeniesionych w kroku 2. Zmień nazwy plików tak, aby były zgodne z bazą danych utworzoną w kroku 4. Poniższe przykładowe polecenie pokazuje, jak to zrobić:
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
-
Ustaw dla bazy danych wartość ONLINE. W tym celu uruchom następujące polecenie:
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Sprawdź, czy baza danych jest w trybie online, i ponownie wprowadź funkcję brokera usług.
-
Usuń pliki bazy danych, które nie są potrzebne. Poniższe przykładowe polecenie pokazuje, jak to zrobić:
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
Metoda 4Ponowne dołączanie bazy danych zawierającej grupę plików tylko do odczytu do wcześniejszego wystąpienia SQL Server. W tym celu wykonaj następujące czynności.Notatki
-
Baza danych zawiera również nowe wpisy dziennika transakcji z uaktualnienia, które nie powiodło się.
-
Wykonaj kroki od 3 do 10 na serwerze z wcześniejszą wersją SQL Server. Na przykład wykonaj kroki od 3 do 10 w systemie INST1.
-
Przenieś pliki bazy danych do wystąpienia SQL Server, który hostuje inst1.
-
Spróbuj dołączyć bazę danych do inst1. W poniższym przykładowym kodzie pokazano, jak to zrobić:
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
Uwaga Zostanie wyświetlony komunikat o błędzie 3624 wymieniony w sekcji "Objawy". Zostanie również wyświetlony komunikat o błędzie 1813.
-
W wierszu polecenia zmień nazwę plików bazy danych w systemie INST1. Poniższe przykładowe polecenie pokazuje, jak to zrobić:
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
-
W SQL Server Management Studio utwórz bazę danych o takiej samej nazwie i strukturze fizycznej jak baza danych, którą chcesz dołączyć. W poniższym przykładowym kodzie pokazano, jak to zrobić:
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
-
Ustaw bazę danych w trybie offline. W tym celu uruchom następujące polecenie:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
W wierszu polecenia zmień nazwy plików w nowej bazie danych. Poniższe przykładowe polecenie pokazuje, jak to zrobić:
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
-
W wierszu polecenia zmień nazwę plików w bazie danych przeniesionych w kroku 2. Zmień nazwy plików tak, aby były zgodne z bazą danych utworzoną w kroku 4. Poniższe przykładowe polecenie pokazuje, jak to zrobić:
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
-
Ustaw dla bazy danych tryb AWARYJNY i wykonaj naprawę. W tym celu uruchom następujące polecenie.Uwaga Dzienniki transakcji bazy danych są przebudowywane w tym kroku. Może to spowodować utratę danych. Dlatego zalecamy wykonanie kopii zapasowej bazy danych przed wykonaniem tego kroku.
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
-
Sprawdź, czy baza danych jest w trybie online, i ponownie wprowadź funkcję brokera usług.
-
Usuń pliki bazy danych, które nie są potrzebne. Poniższe przykładowe polecenie pokazuje, jak to zrobić:
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
Więcej informacji
Istnieje kilka kroków, które występują, gdy baza danych jest dołączona do wystąpienia SQL Server. Te kroki obejmują odzyskanie bazy danych i uaktualnienie plików z wcześniejszych wersji SQL Server. W problemie opisanym w sekcji "Objawy" SQL Server 2012 rozpoczyna proces uaktualniania przed wykryciem plików tylko do odczytu w bazie danych. Kroki uaktualniania obejmują rozpoczęcie transakcji w celu wyczyszczenia bitu "cleanly shut down" na stronie rozruchu bazy danych. Wcześniejsze wersje SQL Server nie mogą odczytać rekordu rozpoczęcia transakcji. Dlatego baza danych nie jest użyteczna we wcześniejszych wersjach SQL Server, a SQL Server generuje błąd 3624.Uaktualnienia w miejscu, gdy baza danych jest oznaczona jako tylkodo odczytu Po wykonaniu uaktualnienia w miejscu wystąpienia SQL Server zawierającego bazę danych tylko do odczytu o nazwie Test_RO_DB do SQL Server 2012 mogą zostać wyświetlone komunikaty o błędach podobne do następujących w dzienniku błędów SQL Server:
Po zakończeniu procesu uaktualniania baza danych Test_RO_DB będzie w stanie RECOVERY_PENDING. Aby ustawić bazę danych do READ_WRITE, należy użyć polecenia ALTER DATABASE. Następnie użyj polecenia ALTER DATABASE, aby ustawić bazę danych do READ_ONLY. Dzięki temu aparat SQL Server uaktualni bazę danych do odpowiedniej wersji.Uaktualnienia w miejscu, gdy baza danych odczytu/zapisu zawiera grupy plików oznaczone jako tylkodo odczytu Podczas uaktualniania w miejscu do wersji SQL Server 2012 mogą być wyświetlane komunikaty podobne do poniższych w dzienniku błędów SQL Server. Ten problem występuje, gdy wcześniejsze wystąpienie SQL Server hostuje bazę danych odczytu/zapisu i zawiera grupy plików oznaczone READ_ONLY. Jednak proces uaktualniania kończy się zgodnie z oczekiwaniami, a baza danych rozpoczyna się w trybie online.Uwaga W poniższym komunikacie o błędzie baza danych nosi nazwę Test_RO_FG: