Sintomi
Considerare lo scenario descritto di seguito:
-
Installare un'istanza di Microsoft SQL Server 2005, di Microsoft SQL Server 2008 o di Microsoft SQL Server 2008 R2.
-
L'istanza di SQL Server è denominata INST1 e ospita un database denominato Test_RO_FG_DB.
-
Il database contiene i gruppi di file seguenti:
-
Primario
-
RO_FG
-
RW_FG
-
-
Il filegroup denominato RO_FG è contrassegnato come READ_ONLY.
-
Installare una nuova istanza di Microsoft SQL Server 2012. Questa istanza di SQL Server 2012 è denominata INST2.
-
È possibile scollegare il database Test_RO_FG_DB da INST1.
-
Si tenta di collegare il database Test_RO_FG_DB a INST2.
-
Viene visualizzato un messaggio di errore simile al seguente:
Msg 3415, Livello 16, Stato 2, Riga 1Database 'Test_RO_FG_DB' non può essere aggiornato perché è di sola lettura, ha file di sola lettura o l'utente non ha le autorizzazioni per modificare alcuni dei file. Rendi il database o i file scrivibili ed esegui nuovamente il ripristino.
-
Si tenta di ricollegare il database Test_RO_FG_DB a INST1.
In questo scenario, non è possibile ricollegare il database a INST1. Nel log degli errori di SQL Server viene visualizzato il messaggio di errore seguente:
Nota Questo problema si verifica solo quando provi a collegare un database che contiene un filegroup contrassegnato come READ_ONLY. Questo problema non si verifica quando si tenta di spostare un database di READ_ONLY in cui tutti i dati sono contrassegnati READ_ONLY.
Causa
Questo problema si verifica perché SQL Server 2012 non rileva il filegroup di sola lettura prima dell'avvio dell'aggiornamento del database. Dopo l'avvio dell'aggiornamento, SQL Server 2012 scrive le voci nel log delle transazioni. Le versioni precedenti non possono leggere le nuove voci del log delle transazioni.
Stato
Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".
Risoluzione
Informazioni sugli aggiornamenti cumulativi
SQL Server 2012
La correzione di questo problema è stata rilasciata per la prima volta nell'aggiornamento cumulativo 2 per SQL Server 2012. Per altre informazioni su questo pacchetto di aggiornamento cumulativo, fare clic sul numero dell'articolo seguente per visualizzare l'articolo della Microsoft Knowledge Base:
2703275 Pacchetto di aggiornamento cumulativo 2 per SQL Server 2012Note Poiché le build sono cumulative, ogni nuova versione di correzione contiene tutti gli aggiornamenti rapidi e tutte le correzioni per la sicurezza inclusi nella versione di correzione precedente SQL Server 2012. Microsoft consiglia di prendere in considerazione l'applicazione della versione più recente di correzione che contiene questo hotfix. Per ulteriori informazioni, fare clic sul numero dell'articolo seguente per visualizzare l'articolo nella Microsoft Knowledge Base:
2692828 Le build SQL Server 2012 rilasciate dopo il rilascio del SQL Server 2012 È necessario applicare un hotfix di SQL Server 2012 a un'installazione di SQL Server 2012.
Soluzione alternativa
Per risolvere il problema, usare uno dei metodi seguenti.Metodo 1Ripristinare un backup del database da INST1 in INST2.Nota Il problema descritto nella sezione "Sintomi" non si verifica in SQL Server 2012 quando si ripristina un backup da una versione precedente.Metodo 2Eseguire un aggiornamento sul posto della versione precedente di SQL Server a SQL Server 2012.Metodo 3Spostare un database che contiene un filegroup di sola lettura in un'istanza di SQL Server 2012. A tale scopo, attenersi alla seguente procedura.Nota Eseguire i passaggi da 4 a 11 nel server che esegue SQL Server 2012. Ad esempio, eseguire i passaggi da 4 a 11 in INST2.
-
In INST1 scollegare il database. Ad esempio, scollegare il database Test_RO_FG_DB.
-
Spostare i file di database nel server che ospita l'istanza INST2.
-
Provare a collegare il database a INST2. Il codice di esempio seguente illustra come eseguire questa operazione:
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
Nota Riceverai il messaggio di errore 3425 menzionato nella sezione "Sintomi".
-
Al prompt dei comandi rinominare i file di database. Il comando di esempio seguente illustra come eseguire questa operazione:
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
-
In SQL Server Management Studio creare un database con lo stesso nome e struttura fisica del database da collegare. Il codice di esempio seguente illustra come eseguire questa operazione:
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
-
Impostare il database su offline. A questo scopo, eseguire il comando seguente:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
Al prompt dei comandi rinominare i file nel nuovo database. Il comando di esempio seguente illustra come eseguire questa operazione:
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
-
Al prompt dei comandi rinominare i file nel database spostati nel passaggio 2. Rinominare i file in modo che corrispondano al database creato nel passaggio 4. Il comando di esempio seguente illustra come eseguire questa operazione:
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
-
Impostare il database su ONLINE. A questo scopo, eseguire il comando seguente:
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Verificare che il database sia online e ristabilire la funzionalità Service Broker.
-
Eliminare i file di database non necessari. Il comando di esempio seguente illustra come eseguire questa operazione:
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
Metodo 4Ricollegare un database che contiene un filegroup di sola lettura all'istanza precedente di SQL Server. A tale scopo, attenersi alla seguente procedura.Note
-
Il database contiene anche le nuove voci del log delle transazioni dell'aggiornamento non riuscito.
-
Eseguire i passaggi da 3 a 10 nel server che esegue una versione precedente di SQL Server. Ad esempio, eseguire i passaggi da 3 a 10 in INST1.
-
Spostare i file di database nell'istanza di SQL Server che ospita INST1.
-
Provare a collegare il database a INST1. Il codice di esempio seguente illustra come eseguire questa operazione:
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
Nota Riceverai il messaggio di errore 3624 menzionato nella sezione "Sintomi". Verrà visualizzato anche un messaggio di errore 1813.
-
Al prompt dei comandi rinominare i file di database in INST1. Il comando di esempio seguente illustra come eseguire questa operazione:
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
-
In SQL Server Management Studio creare un database con lo stesso nome e struttura fisica del database da collegare. Il codice di esempio seguente illustra come eseguire questa operazione:
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
-
Impostare il database su offline. A questo scopo, eseguire il comando seguente:
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
Al prompt dei comandi rinominare i file nel nuovo database. Il comando di esempio seguente illustra come eseguire questa operazione:
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
-
Al prompt dei comandi rinominare i file nel database spostati nel passaggio 2. Rinominare i file in modo che corrispondano al database creato nel passaggio 4. Il comando di esempio seguente illustra come eseguire questa operazione:
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
-
Imposta il database sulla modalità EMERGENZA ed esegui un ripristino. A tale scopo, eseguire il comando seguente:Nota I log delle transazioni del database vengono ricompilati durante questo passaggio. Ciò potrebbe causare la perdita di dati. Pertanto, è consigliabile eseguire il backup del database prima di eseguire questo passaggio.
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
-
Verificare che il database sia online e ristabilire la funzionalità Service Broker.
-
Eliminare i file di database non necessari. Il comando di esempio seguente illustra come eseguire questa operazione:
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
Ulteriori informazioni
Quando un database è collegato a un'istanza di SQL Server, sono necessari diversi passaggi. Questi passaggi includono il ripristino del database e l'aggiornamento dei file dalle versioni precedenti di SQL Server. Nel problema descritto nella sezione "Sintomi", SQL Server 2012 inizia il processo di aggiornamento prima che vengano rilevati i file di sola lettura nel database. I passaggi di aggiornamento includono l'avvio di una transazione per cancellare il bit "cleanly shut down" nella pagina di avvio del database. Le versioni precedenti di SQL Server non possono leggere il record della transazione di inizio. Di conseguenza, il database non è utilizzabile nelle versioni precedenti di SQL Server e SQL Server genera l'errore 3624.Aggiornamenti sul posto quando un database è contrassegnato come di solalettura Quando si esegue un aggiornamento sul posto di un'istanza di SQL Server contenente un database di sola lettura denominato Test_RO_DB a SQL Server 2012, è possibile che vengano visualizzati messaggi di errore simili ai seguenti nel log degli errori di SQL Server:
Al termine del processo di aggiornamento, il database Test_RO_DB si troverà nello stato RECOVERY_PENDING. È necessario usare il comando ALTER DATABASE per impostare il database su READ_WRITE. Usare quindi il comando ALTER DATABASE per impostare il database su READ_ONLY. In questo modo il motore di SQL Server aggiorna il database alla versione corretta.Aggiornamenti sul posto quando un database di lettura/scrittura contiene gruppi di file contrassegnati come di solalettura Quando si esegue un aggiornamento sul posto a SQL Server 2012, è possibile che vengano visualizzati messaggi simili ai seguenti nel log degli errori di SQL Server. Questo problema si verifica quando l'istanza precedente di SQL Server ospita un database di lettura/scrittura e contiene gruppi di file contrassegnati READ_ONLY. Tuttavia, il processo di aggiornamento viene completato come previsto e il database viene avviato online.Nota Nel messaggio di errore seguente il nome del database è Test_RO_FG: