Gilt für
SQL Server 2012 Enterprise

Problembeschreibung

Stellen Sie sich folgendes Szenario vor:

  • Sie installieren eine instance von Microsoft SQL Server 2005, microsoft SQL Server 2008 oder Microsoft SQL Server 2008 R2.

  • Die instance von SQL Server heißt INST1 und hostet eine Datenbank mit dem Namen Test_RO_FG_DB.

  • Die Datenbank enthält die folgenden Dateigruppen:

    • Primäre

    • RO_FG

    • RW_FG

  • Die Dateigruppe mit dem Namen RO_FG ist als READ_ONLY gekennzeichnet.

  • Sie installieren eine neue instance von Microsoft SQL Server 2012. Diese instance von SQL Server 2012 heißt INST2.

  • Sie trennen die Test_RO_FG_DB-Datenbank von INST1.

  • Sie versuchen, die Test_RO_FG_DB-Datenbank an INST2 anzufügen.

  • Sie erhalten eine Fehlermeldung, die der folgenden ähnelt:

    Msg 3415, Ebene 16, Status 2, Zeile 1Die Datenbank "Test_RO_FG_DB" kann nicht aktualisiert werden, da sie schreibgeschützt ist, über schreibgeschützte Dateien verfügt oder der Benutzer nicht über Berechtigungen zum Ändern einiger Dateien verfügt. Machen Sie die Datenbank oder Dateien schreibbar, und führen Sie die Wiederherstellung erneut aus.

  • Sie versuchen, die Test_RO_FG_DB Datenbank erneut an INST1 anfügen.

In diesem Szenario können Sie die Datenbank nicht erneut an INST1 anfügen. Außerdem erhalten Sie die folgende Fehlermeldung im SQL Server Fehlerprotokoll:

Hinweis Dieses Problem tritt nur auf, wenn Sie versuchen, eine Datenbank anzufügen, die eine Dateigruppe enthält, die READ_ONLY markiert ist. Dieses Problem tritt nicht auf, wenn Sie versuchen, eine READ_ONLY Datenbank zu verschieben, in der alle Daten READ_ONLY markiert sind.

Ursache

Dieses Problem tritt auf, weil SQL Server 2012 die schreibgeschützte Dateigruppe nicht erkennt, bevor mit dem Upgrade der Datenbank begonnen wird. Nachdem das Upgrade gestartet wurde, schreibt SQL Server 2012 Einträge in das Transaktionsprotokoll. Frühere Versionen können die neuen Transaktionsprotokolleinträge nicht lesen.

Status

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.

Lösung

Informationen zum kumulativen Update

SQL Server 2012

Der Fix für dieses Problem wurde erstmals im kumulativen Update 2 für SQL Server 2012 veröffentlicht. Weitere Informationen zu diesem kumulativen Updatepaket finden Sie in den folgenden Artikeln der Microsoft Knowledge Base:

2703275 Kumulatives Updatepaket 2 für SQL Server 2012Note Da die Builds kumulativ sind, enthält jedes neue Release alle Hotfixes und alle Sicherheitsfixes, die im vorherigen SQL Server 2012-Fixrelease enthalten waren. Microsoft empfiehlt, das neueste Updaterelease anzuwenden, das diesen Hotfix enthält. Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:

2692828 Die SQL Server 2012-Builds, die nach der Veröffentlichung von SQL Server 2012 veröffentlicht wurden. Sie müssen einen SQL Server 2012-Hotfix auf eine Installation von SQL Server 2012 anwenden.

Problemumgehung 

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen.Methode 1Stellen Sie eine Sicherung der Datenbank aus INST1 auf INST2 wieder her.Hinweis Das im Abschnitt "Symptome" beschriebene Problem tritt in SQL Server 2012 nicht auf, wenn Sie eine Sicherung aus einer früheren Version wiederherstellen.Methode 2Führt ein direktes Upgrade der früheren Version von SQL Server auf SQL Server 2012 durch.Methode 3Verschieben einer Datenbank, die eine schreibgeschützte Dateigruppe enthält, in eine instance von SQL Server 2012. Gehen Sie hierzu wie folgt vor.Hinweis Führen Sie die Schritte 4 bis 11 auf dem Server aus, auf dem SQL Server 2012 ausgeführt wird. Führen Sie beispielsweise die Schritte 4 bis 11 für INST2 aus.

  1. Trennen Sie auf INST1 die Datenbank. Trennen Sie z. B. die Test_RO_FG_DB-Datenbank.

  2. Verschieben Sie die Datenbankdateien auf den Server, der die INST2-instance hostet.

  3. Versuchen Sie, die Datenbank an INST2 anzufügen. Der folgende Beispielcode veranschaulicht dies:

    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

    Hinweis Sie erhalten die Fehlermeldung 3425, die im Abschnitt "Symptome" erwähnt wird.

  4. Benennen Sie die Datenbankdateien an einer Eingabeaufforderung um. Der folgende Beispielbefehl veranschaulicht dies:

    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 
  5. Erstellen Sie in SQL Server Management Studio eine Datenbank mit demselben Namen und derselben physischen Struktur wie die Datenbank, die Sie anfügen möchten. Der folgende Beispielcode veranschaulicht dies:

    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
  6. Legen Sie die Datenbank auf offline fest. Führen Sie dazu den folgenden Befehl aus:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  7. Benennen Sie an einer Eingabeaufforderung die Dateien in der neuen Datenbank um. Der folgende Beispielbefehl veranschaulicht dies:

    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 
  8. Benennen Sie an einer Eingabeaufforderung die Dateien in der Datenbank um, die Sie in Schritt 2 verschoben haben. Benennen Sie die Dateien so um, dass sie der Datenbank entsprechen, die Sie in Schritt 4 erstellt haben. Der folgende Beispielbefehl veranschaulicht dies:

    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 
  9. Legen Sie die Datenbank auf ONLINE fest. Führen Sie dazu den folgenden Befehl aus:

    ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO 
  10. Vergewissern Sie sich, dass die Datenbank online ist, und stellen Sie die Service Broker-Funktionalität wieder her.

  11. Löschen Sie die nicht benötigten Datenbankdateien. Der folgende Beispielbefehl veranschaulicht dies:

    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 

Methode 4Fügen Sie eine Datenbank, die eine schreibgeschützte Dateigruppe enthält, erneut an die frühere instance von SQL Server an. Gehen Sie hierzu wie folgt vor.Notizen

  • Die Datenbank enthält auch die neuen Transaktionsprotokolleinträge aus dem fehlgeschlagenen Upgrade.

  • Führen Sie die Schritte 3 bis 10 auf dem Server aus, auf dem eine frühere Version von SQL Server ausgeführt wird. Führen Sie beispielsweise die Schritte 3 bis 10 für INST1 aus.

  1. Verschieben Sie die Datenbankdateien in die instance von SQL Server, die INST1 hosten.

  2. Versuchen Sie, die Datenbank an INST1 anzufügen. Der folgende Beispielcode veranschaulicht dies:

    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

    Hinweis Sie erhalten die Fehlermeldung 3624, die im Abschnitt "Symptome" erwähnt wird. Außerdem erhalten Sie die Fehlermeldung 1813.

  3. Benennen Sie an einer Eingabeaufforderung die Datenbankdateien in INST1 um. Der folgende Beispielbefehl veranschaulicht dies:

    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 
  4. Erstellen Sie in SQL Server Management Studio eine Datenbank mit demselben Namen und derselben physischen Struktur wie die Datenbank, die Sie anfügen möchten. Der folgende Beispielcode veranschaulicht dies:

    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
  5. Legen Sie die Datenbank auf offline fest. Führen Sie dazu den folgenden Befehl aus:

    ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO 
  6. Benennen Sie an einer Eingabeaufforderung die Dateien in der neuen Datenbank um. Der folgende Beispielbefehl veranschaulicht dies:

    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 
  7. Benennen Sie an einer Eingabeaufforderung die Dateien in der Datenbank um, die Sie in Schritt 2 verschoben haben. Benennen Sie die Dateien so um, dass sie der Datenbank entsprechen, die Sie in Schritt 4 erstellt haben. Der folgende Beispielbefehl veranschaulicht dies:

    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 
  8. Legen Sie die Datenbank auf den EMERGENCY-Modus fest, und führen Sie eine Reparatur durch. Führen Sie hierzu den folgenden Befehl aus:Hinweis Die Datenbanktransaktionsprotokolle werden während dieses Schritts neu erstellt. Dies kann zu Datenverlusten führen. Daher wird empfohlen, die Datenbank zu sichern, bevor Sie diesen Schritt ausführen.

    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 
  9. Vergewissern Sie sich, dass die Datenbank online ist, und stellen Sie die Service Broker-Funktionalität wieder her.

  10. Löschen Sie die nicht benötigten Datenbankdateien. Der folgende Beispielbefehl veranschaulicht dies:

    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 

Weitere Informationen

Es gibt mehrere Schritte, die ausgeführt werden, wenn eine Datenbank an eine instance von SQL Server angefügt wird. Diese Schritte umfassen das Wiederherstellen der Datenbank und das Upgrade der Dateien aus früheren Versionen von SQL Server. In dem im Abschnitt "Symptome" beschriebenen Problem beginnt SQL Server 2012 mit dem Upgradeprozess, bevor die schreibgeschützten Dateien in der Datenbank erkannt werden. Die Upgradeschritte umfassen das Starten einer Transaktion, um das Bit "Sauber heruntergefahren" auf der Startseite der Datenbank zu löschen. Frühere Versionen von SQL Server können den Transaktionsdatensatz nicht lesen. Daher kann die Datenbank in früheren Versionen von SQL Server nicht verwendet werden, und SQL Server generiert den Fehler 3624.Direkte Upgrades, wenn eine Datenbank als schreibgeschütztmarkiert ist Wenn Sie ein direktes Upgrade einer instance von SQL Server durchführen, die eine schreibgeschützte Datenbank mit dem Namen Test_RO_DB für SQL Server 2012 enthält, erhalten Sie möglicherweise Fehlermeldungen, die im SQL Server Fehlerprotokoll wie folgt aussehen:

Am Ende des Upgradevorgangs befindet sich die Test_RO_DB Datenbank im RECOVERY_PENDING Zustand. Sie müssen den Befehl ALTER DATABASE verwenden, um die Datenbank auf READ_WRITE festzulegen. Verwenden Sie dann den Befehl ALTER DATABASE, um die Datenbank auf READ_ONLY festzulegen. Dadurch kann die SQL Server-Engine die Datenbank auf die richtige Version aktualisieren.Direkte Upgrades, wenn eine Datenbank mit Lese-/Schreibzugriff Dateigruppen enthält, die als schreibgeschütztmarkiert sind. Wenn Sie ein direktes Upgrade auf SQL Server 2012 durchführen, erhalten Sie möglicherweise Meldungen, die der folgenden im SQL Server Fehlerprotokoll ähneln. Dieses Problem tritt auf, wenn die frühere instance von SQL Server eine Lese-/Schreibdatenbank hostet und Dateigruppen enthält, die READ_ONLY gekennzeichnet sind. Der Upgradevorgang wird jedoch erwartungsgemäß abgeschlossen, und die Datenbank wird online gestartet.Hinweis In der folgenden Fehlermeldung hat die Datenbank den Namen Test_RO_FG:

Benötigen Sie weitere Hilfe?

Möchten Sie weitere Optionen?

Erkunden Sie die Abonnementvorteile, durchsuchen Sie Trainingskurse, erfahren Sie, wie Sie Ihr Gerät schützen und vieles mehr.