Příznaky
Představte si následující scénář:
-
Nainstalujete instanci Microsoft SQL Server 2005, Microsoft SQL Server 2008 nebo Microsoft SQL Server 2008 R2.
-
Instance SQL Server má název INST1 a je hostitelem databáze s názvem Test_RO_FG_DB.
-
Databáze obsahuje následující skupiny souborů:
-
Primární
-
RO_FG
-
RW_FG
-
-
Skupina souborů s názvem RO_FG je označena jako READ_ONLY.
-
Nainstalujete novou instanci Microsoft SQL Server 2012. Tato instance SQL Server 2012 má název INST2.
-
Odpojíte databázi Test_RO_FG_DB od inst1.
-
Pokusíte se připojit databázi Test_RO_FG_DB k INST2.
-
Zobrazí se chybová zpráva podobná následující:
Zpráva 3415, úroveň 16, stav 2, řádek 1databázi Test_RO_FG_DB nelze upgradovat, protože je jen pro čtení, má soubory jen pro čtení nebo uživatel nemá oprávnění k úpravě některých souborů. Zajistěte, aby bylo možné zapisovat do databáze nebo souborů, a spusťte obnovení znovu.
-
Pokusíte se znovu připojit databázi Test_RO_FG_DB k databázi INST1.
V tomto scénáři nelze databázi znovu připojit k INST1. A v protokolu chyb SQL Server se zobrazí následující chybová zpráva:
Poznámka: K tomuto problému dochází pouze při pokusu o připojení databáze, která obsahuje skupinu souborů označenou READ_ONLY. K tomuto problému nedochází při pokusu o přesunutí READ_ONLY databáze, ve které jsou všechna data označena READ_ONLY.
Příčina
K tomuto problému dochází, protože SQL Server 2012 nerozpozná skupinu souborů jen pro čtení před zahájením upgradu databáze. Po spuštění upgradu SQL Server 2012 zapíše položky do transakčního protokolu. Starší verze nemohou číst nové položky transakčního protokolu.
Stav
Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.
Řešení
Informace o kumulativní aktualizaci
SQL Server 2012
Oprava tohoto problému byla poprvé vydána v kumulativní aktualizaci 2 pro SQL Server 2012. Další informace o tomto balíčku kumulativní aktualizace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
2703275 Balíček kumulativní aktualizace 2 pro SQL Server 2012Note Vzhledem k tomu, že sestavení jsou kumulativní, obsahuje každá nová verze oprav všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí verze SQL Server 2012. Společnost Microsoft doporučuje zvážit použití nejnovější verze opravy, která obsahuje tuto opravu hotfix. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
2692828 Buildy SQL Server 2012, které byly vydány po vydání verze SQL Server 2012. Na instalaci SQL Server 2012 musíte použít opravu hotfix SQL Server 2012.
Řešení
Chcete-li tento problém vyřešit, použijte jednu z následujících metod.Metoda 1Obnovení zálohy databáze z INST1 na INST2.Poznámka: K problému popsanému v části Příznaky nedochází v SQL Server 2012 při obnovení zálohy ze starší verze.Metoda 2Proveďte místní upgrade starší verze SQL Server na SQL Server 2012.Metoda 3: Přesuňte databázi obsahující skupinu souborů jen pro čtení do instance SQL Server 2012. Použijte tento postup.Poznámka: Na serveru se systémem SQL Server 2012 proveďte kroky 4 až 11. Například proveďte kroky 4 až 11 na INST2.
-
V inst1 odpojte databázi. Například odpojte databázi Test_RO_FG_DB.
-
Přesuňte databázové soubory na server, který je hostitelem instance INST2.
-
Zkuste databázi připojit k INST2. Následující ukázkový kód ukazuje, jak to udělat:
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
Poznámka: Zobrazí se chybová zpráva 3425, která je uvedena v části "Příznaky".
-
Na příkazovém řádku přejmenujte soubory databáze. Následující ukázkový příkaz ukazuje, jak to udělat:
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
-
V SQL Server Management Studio vytvořte databázi se stejným názvem a fyzickou strukturou jako databáze, kterou chcete připojit. Následující ukázkový kód ukazuje, jak to udělat:
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
-
Nastavte databázi na offline. Provedete to spuštěním následujícího příkazu:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
Na příkazovém řádku přejmenujte soubory v nové databázi. Následující ukázkový příkaz ukazuje, jak to udělat:
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
-
Na příkazovém řádku přejmenujte soubory v databázi, kterou jste přesunuli v kroku 2. Přejmenujte soubory tak, aby odpovídaly databázi, kterou jste vytvořili v kroku 4. Následující ukázkový příkaz ukazuje, jak to udělat:
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
-
Nastavte databázi na ONLINE. Provedete to spuštěním následujícího příkazu:
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Ověřte, že je databáze online, a znovu spusťte funkce služby Service Broker.
-
Odstraňte soubory databáze, které nejsou potřeba. Následující ukázkový příkaz ukazuje, jak to udělat:
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 4Znovu připojte databázi, která obsahuje skupinu souborů jen pro čtení, k dřívější instanci SQL Server. Použijte tento postup.Poznámky
-
Databáze obsahuje také nové položky transakčního protokolu z neúspěšného upgradu.
-
Na serveru se starší verzí SQL Server proveďte kroky 3 až 10. Například proveďte kroky 3 až 10 na INST1.
-
Přesuňte soubory databáze do instance SQL Server, která je hostitelem INST1.
-
Zkuste databázi připojit k INST1. Následující ukázkový kód ukazuje, jak to udělat:
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
Poznámka: Zobrazí se chybová zpráva 3624, která je uvedena v části "Příznaky". Zobrazí se také chybová zpráva 1813.
-
Na příkazovém řádku přejmenujte soubory databáze na INST1. Následující ukázkový příkaz ukazuje, jak to udělat:
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
-
V SQL Server Management Studio vytvořte databázi se stejným názvem a fyzickou strukturou jako databáze, kterou chcete připojit. Následující ukázkový kód ukazuje, jak to udělat:
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
-
Nastavte databázi na offline. Provedete to spuštěním následujícího příkazu:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
Na příkazovém řádku přejmenujte soubory v nové databázi. Následující ukázkový příkaz ukazuje, jak to udělat:
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
-
Na příkazovém řádku přejmenujte soubory v databázi, kterou jste přesunuli v kroku 2. Přejmenujte soubory tak, aby odpovídaly databázi, kterou jste vytvořili v kroku 4. Následující ukázkový příkaz ukazuje, jak to udělat:
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
-
Nastavte databázi do nouzového režimu a proveďte opravu. Chcete-li to provést, spusťte následující příkaz.Poznámka: Protokoly transakcí databáze jsou znovu sestaveny během tohoto kroku. To může vést ke ztrátě dat. Proto doporučujeme před provedením tohoto kroku databázi zálohovat.
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
-
Ověřte, že je databáze online, a znovu spusťte funkce služby Service Broker.
-
Odstraňte soubory databáze, které nejsou potřeba. Následující ukázkový příkaz ukazuje, jak to udělat:
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
Další informace
Když je databáze připojená k instanci SQL Server, provede se několik kroků. Mezi tyto kroky patří obnovení databáze a upgrade souborů ze starších verzí SQL Server. V případě problému popsaného v části Příznaky zahájí SQL Server 2012 proces upgradu před tím, než se zjistí soubory v databázi jen pro čtení. Kroky upgradu zahrnují spuštění transakce pro vymazání bitu "cleanly shut down" na spouštěcí stránce databáze. Starší verze SQL Server nemohou přečíst záznam počáteční transakce. Proto není databáze použitelná v dřívějších verzích SQL Server a SQL Server generuje chybu 3624.Místní upgrady, když je databáze označena jako jen pročtení: Pokud provedete místní upgrade instance SQL Server, která obsahuje databázi jen pro čtení s názvem Test_RO_DB SQL Server 2012, můžou se v protokolu chyb SQL Server zobrazit chybové zprávy podobné následujícímu:
Na konci procesu upgradu bude databáze Test_RO_DB ve stavu RECOVERY_PENDING. K nastavení databáze na READ_WRITE je nutné použít příkaz ALTER DATABASE. Potom pomocí příkazu ALTER DATABASE nastavte databázi na READ_ONLY. To umožní modulu SQL Server upgradovat databázi na správnou verzi.Místní upgrady, když databáze pro čtení/zápis obsahuje skupiny souborů, které jsou označené jako jen pročtení: Pokud provedete místní upgrade na SQL Server 2012, můžou se v protokolu chyb SQL Server zobrazit zprávy podobné následujícímu. K tomuto problému dochází, když starší instance SQL Server hostuje databázi pro čtení/zápis a obsahuje skupiny souborů, které jsou označeny READ_ONLY. Proces upgradu se ale dokončí podle očekávání a databáze se spustí online.Poznámka: V následující chybové zprávě má databáze název Test_RO_FG: