Symptômes
Prenons l’exemple du scénario suivant :
-
Vous installez un instance de Microsoft SQL Server 2005, de Microsoft SQL Server 2008 ou de Microsoft SQL Server 2008 R2.
-
Le instance de SQL Server est nommé INST1 et héberge une base de données nommée Test_RO_FG_DB.
-
La base de données contient les groupes de fichiers suivants :
-
Primaire
-
RO_FG
-
RW_FG
-
-
Le groupe de fichiers nommé RO_FG est marqué comme READ_ONLY.
-
Vous installez une nouvelle instance de Microsoft SQL Server 2012. Cette instance de SQL Server 2012 est nommée INST2.
-
Vous détachez la base de données Test_RO_FG_DB d’INST1.
-
Vous essayez d’attacher la base de données Test_RO_FG_DB à INST2.
-
Vous recevez un message d’erreur qui ressemble au suivant :
Impossible de mettre à niveau msg 3415, niveau 16, état 2, ligne 1la base de données « Test_RO_FG_DB » car elle est en lecture seule, contient des fichiers en lecture seule ou l’utilisateur ne dispose pas des autorisations nécessaires pour modifier certains des fichiers. Rendez la base de données ou les fichiers accessibles en écriture, puis réexécutez la récupération.
-
Vous essayez de rattacher la base de données Test_RO_FG_DB à INST1.
Dans ce scénario, vous ne pouvez pas rattacher la base de données à INST1. Le message d’erreur suivant s’affiche également dans le journal des erreurs SQL Server :
Remarque Ce problème se produit uniquement lorsque vous essayez d’attacher une base de données qui contient un groupe de fichiers marqué READ_ONLY. Ce problème ne se produit pas lorsque vous essayez de déplacer une base de données READ_ONLY dans laquelle toutes les données sont marquées READ_ONLY.
Cause
Ce problème se produit car SQL Server 2012 ne détecte pas le groupe de fichiers en lecture seule avant de commencer à mettre à niveau la base de données. Une fois la mise à niveau démarrée, SQL Server 2012 écrit des entrées dans le journal des transactions. Les versions antérieures ne peuvent pas lire les nouvelles entrées du journal des transactions.
État
Microsoft a confirmé l’existence de ce problème dans les produits Microsoft répertoriés dans la section « S’applique à ».
Résolution
Informations sur les mises à jour cumulatives
SQL Server 2012
Le correctif pour ce problème a été publié pour la première fois dans la mise à jour cumulative 2 pour SQL Server 2012. Pour plus d’informations sur ce package de mise à jour cumulative, cliquez sur le numéro d’article suivant pour afficher l’article dans la Base de connaissances Microsoft :
2703275 Package de mise à jour cumulative 2 pour SQL Server 2012Note Étant donné que les builds sont cumulatives, chaque nouvelle version de correctif contient tous les correctifs logiciels et tous les correctifs de sécurité inclus dans la version précédente du correctif SQL Server 2012. Microsoft vous recommande d’envisager d’appliquer la version de correctif la plus récente qui contient ce correctif logiciel. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
2692828 Les builds SQL Server 2012 publiées après SQL Server 2012 Vous devez appliquer un correctif logiciel SQL Server 2012 à une installation de SQL Server 2012.
Solution de contournement
Pour contourner ce problème, appliquez l’une des méthodes ci-dessous.Méthode 1Restaurer une sauvegarde de la base de données à partir d’INST1 sur INST2.Remarque Le problème décrit dans la section « Symptômes » ne se produit pas dans SQL Server 2012 lorsque vous restaurez une sauvegarde à partir d’une version antérieure.Méthode 2Effectuer une mise à niveau sur place de la version antérieure de SQL Server vers SQL Server 2012.Méthode 3Déplacer une base de données qui contient un groupe de fichiers en lecture seule vers un instance de SQL Server 2012. Pour la modifier, utilisez la clé de Registre AutoRecoverDelay.Remarque Effectuez les étapes 4 à 11 sur le serveur qui exécute SQL Server 2012. Par exemple, effectuez les étapes 4 à 11 sur INST2.
-
Sur INST1, détachez la base de données. Par exemple, détachez la base de données Test_RO_FG_DB.
-
Déplacez les fichiers de base de données vers le serveur qui héberge le instance INST2.
-
Essayez d’attacher la base de données à INST2. L’exemple de code suivant montre comment procéder :
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
Remarque Le message d’erreur 3425 mentionné dans la section « Symptômes » s’affiche.
-
À l’invite de commandes, renommez les fichiers de base de données. L’exemple de commande suivant montre comment procéder :
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
-
Dans SQL Server Management Studio, créez une base de données qui a le même nom et la même structure physique que la base de données que vous souhaitez attacher. L’exemple de code suivant montre comment procéder :
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
-
Définissez la base de données sur hors connexion. Pour ce faire, exécutez la commande suivante :
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
À l’invite de commandes, renommez les fichiers dans la nouvelle base de données. L’exemple de commande suivant montre comment procéder :
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
-
À l’invite de commandes, renommez les fichiers de la base de données que vous avez déplacés à l’étape 2. Renommez les fichiers pour qu’ils correspondent à la base de données que vous avez créée à l’étape 4. L’exemple de commande suivant montre comment procéder :
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
-
Définissez la base de données sur ONLINE. Pour ce faire, exécutez la commande suivante :
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Vérifiez que la base de données est en ligne et rétablissez la fonctionnalité Service Broker.
-
Supprimez les fichiers de base de données qui ne sont pas nécessaires. L’exemple de commande suivant montre comment procéder :
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
Méthode 4Rattachez une base de données qui contient un groupe de fichiers en lecture seule au instance précédent de SQL Server. Pour la modifier, utilisez la clé de Registre AutoRecoverDelay.Notes
-
La base de données contient également les nouvelles entrées du journal des transactions de l’échec de la mise à niveau.
-
Effectuez les étapes 3 à 10 sur le serveur qui exécute une version antérieure de SQL Server. Par exemple, effectuez les étapes 3 à 10 sur INST1.
-
Déplacez les fichiers de base de données vers le instance de SQL Server qui héberge INST1.
-
Essayez d’attacher la base de données à INST1. L’exemple de code suivant montre comment procéder :
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
Remarque Vous recevez le message d’erreur 3624 mentionné dans la section « Symptômes ». Vous recevrez également un message d’erreur 1813.
-
À l’invite de commandes, renommez les fichiers de base de données sur INST1. L’exemple de commande suivant montre comment procéder :
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
-
Dans SQL Server Management Studio, créez une base de données qui a le même nom et la même structure physique que la base de données que vous souhaitez attacher. L’exemple de code suivant montre comment procéder :
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
-
Définissez la base de données sur hors connexion. Pour ce faire, exécutez la commande suivante :
ALTER DATABASE [Test_RO_FG_DB] SET OFFLINEGO
-
À l’invite de commandes, renommez les fichiers dans la nouvelle base de données. L’exemple de commande suivant montre comment procéder :
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
-
À l’invite de commandes, renommez les fichiers de la base de données que vous avez déplacés à l’étape 2. Renommez les fichiers pour qu’ils correspondent à la base de données que vous avez créée à l’étape 4. L’exemple de commande suivant montre comment procéder :
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
-
Définissez la base de données sur le mode URGENCE et effectuez une réparation. Pour cela, exécutez la commande suivante :Remarque Les journaux des transactions de base de données sont reconstruits au cours de cette étape. Cela peut entraîner une perte de données. Par conséquent, nous vous recommandons de sauvegarder la base de données avant d’effectuer cette étape.
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
-
Vérifiez que la base de données est en ligne et rétablissez la fonctionnalité Service Broker.
-
Supprimez les fichiers de base de données qui ne sont pas nécessaires. L’exemple de commande suivant montre comment procéder :
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
Informations supplémentaires
Plusieurs étapes se produisent lorsqu’une base de données est attachée à un instance de SQL Server. Ces étapes incluent la récupération de la base de données et la mise à niveau des fichiers à partir de versions antérieures de SQL Server. Dans le problème décrit dans la section « Symptômes », SQL Server 2012 commence le processus de mise à niveau avant que les fichiers en lecture seule dans la base de données ne soient détectés. Les étapes de mise à niveau incluent le démarrage d’une transaction pour effacer le bit « proprement arrêté » dans la page de démarrage de la base de données. Les versions antérieures de SQL Server ne peuvent pas lire l’enregistrement de la transaction de début. Par conséquent, la base de données n’est pas utilisable dans les versions antérieures de SQL Server et SQL Server génère l’erreur 3624.Mises à niveau sur place lorsqu’une base de données est marquée comme étant en lecture seuleLorsque vous effectuez une mise à niveau sur place d’un instance de SQL Server qui contient une base de données en lecture seule nommée Test_RO_DB SQL Server 2012, vous pouvez recevoir des messages d’erreur qui ressemblent à ce qui suit dans le journal des erreurs SQL Server :
À la fin du processus de mise à niveau, la base de données Test_RO_DB est dans l’état RECOVERY_PENDING. Vous devez utiliser la commande ALTER DATABASE pour définir la base de données sur READ_WRITE. Utilisez ensuite la commande ALTER DATABASE pour définir la base de données sur READ_ONLY. Cela permet au moteur SQL Server de mettre à niveau la base de données vers la version correcte.Mises à niveau sur place lorsqu’une base de données en lecture/écriture contient des groupes de fichiers marqués comme en lecture seuleLorsque vous effectuez une mise à niveau sur place vers SQL Server 2012, vous pouvez recevoir des messages qui ressemblent à ce qui suit dans le journal des erreurs SQL Server. Ce problème se produit lorsque la instance précédente de SQL Server héberge une base de données en lecture/écriture et contient des groupes de fichiers marqués READ_ONLY. Toutefois, le processus de mise à niveau se termine comme prévu et la base de données démarre en ligne.Remarque Dans le message d’erreur suivant, la base de données est nommée Test_RO_FG :