Symptômes
Prenons l’exemple du scénario suivant :
-
Vous installez une instance de Microsoft SQL Server 2005, de Microsoft SQL Server 2008 ou de Microsoft SQL Server 2008 R2.
-
L’instance de SQL Server porte le nom 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 :
-
Élémentaire
-
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 porte le nom INST2.
-
Vous détachez la base de données Test_RO_FG_DB de INST1.
-
Vous essayez de joindre la base de données Test_RO_FG_DB à INST2.
-
Vous recevez un message d’erreur qui ressemble à ce qui suit :
MSG 3415, niveau 16, état 2, ligne 1Database’Test_RO_FG_DB’ne peut pas être mis à niveau, car il est en lecture seule, possède des fichiers en lecture seule ou l’utilisateur ne dispose pas des autorisations nécessaires pour modifier certains fichiers. Rendez la base de données ou les fichiers accessibles en écriture, puis relancez 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 ci-après s’affiche dans le journal des erreurs SQL Server :
Remarque Ce problème se produit uniquement lorsque vous essayez de joindre une base de données qui contient un groupe de fichiers marqué READ_ONLY. Ce problème ne se produit pas lorsque vous tentez 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 la mise à niveau de la base de données. Après le démarrage de la mise à niveau, SQL Server 2012 écrit les entrées dans le journal des transactions. Les versions antérieures ne peuvent pas lire les nouvelles entrées du journal des transactions.
Statut
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 de ce problème a été émis 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 ci-dessous pour consulter l’article de la base de connaissances Microsoft :
2703275 Package de mise à jour cumulative 2 pour SQL Server 2012Remarque Dans la mesure où les builds sont cumulatives, chaque nouvelle version du correctif contient tous les correctifs et les correctifs de sécurité inclus dans l’ancienne version du correctif SQL Server 2012. Microsoft vous recommande d’appliquer la version de correctif la plus récente qui contient ce correctif. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
2692828 Builds SQL Server 2012 publiées après la sortie de SQL Server 2012 Vous devez appliquer un correctif 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 1Restaurez une sauvegarde de la base de données à partir de INST1 sur INST2.Remarque Le problème décrit dans la section « symptômes » n’apparaît 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 contenant un groupe de fichiers en lecture seule vers une instance de SQL Server 2012. Pour cela, procédez comme suit.Remarque Effectuez les étapes 4 à 11 sur le serveur qui exécute SQL Server 2012. Par exemple, procédez aux étapes 4 à 11 sur INST2.
-
Dans 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 sur le serveur qui héberge l’instance INST2.
-
Essayez de joindre 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 la 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 portant le même nom et la même structure physique que la base de données que vous souhaitez joindre. 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 offline. Pour cela, 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 le fichier pour qu’il corresponde à 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 connexion. Pour cela, exécutez la commande suivante :
ALTER DATABASE [Test_RO_FG_DB] SET ONLINEGO
-
Vérifiez que la base de données est en ligne, puis recréez la fonctionnalité Service Broker.
-
Supprimer 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 4Rattacher une base de données qui contient un groupe de fichiers en lecture seule à l’instance antérieure de SQL Server. Pour la modifier, utilisez la clé de Registre AutoRecoverDelay.Remarque
-
La base de données contient également les nouvelles entrées du journal de transactions de la mise à niveau ayant échoué.
-
Effectuez les étapes 3 à 10 sur le serveur qui exécute une version antérieure de SQL Server. Par exemple, procédez aux étapes 3 à 10 sur INST1.
-
Déplacez les fichiers de base de données vers l’instance de SQL Server qui héberge INST1.
-
Essayez de joindre 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 Le message d’erreur 3624 mentionné dans la section « symptômes » s’affiche. 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 portant le même nom et la même structure physique que la base de données que vous souhaitez joindre. 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 offline. Pour cela, 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 le fichier pour qu’il corresponde à 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 mode d’urgence et effectuez une réparation. Pour cela, exécutez la commande suivante :Remarque Les journaux de transactions de base de données sont recréés au cours de cette étape. Cela risque de provoquer une perte de données. Par conséquent, il est recommandé 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, puis recréez la fonctionnalité Service Broker.
-
Supprimer 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 peuvent se produire lorsqu’une base de données est attachée à une 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 de détecter les fichiers en lecture seule dans la base de données. Les étapes de mise à niveau incluent le démarrage d’une transaction pour effacer le bit « arrêt net » 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 Begin transaction. 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’une 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 similaires à 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 sera dans l’État RECOVERY_PENDING. Vous devez utiliser la commande modifier la base de données 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 en lecture seuleLorsque vous effectuez une mise à niveau sur place vers SQL Server 2012, il est possible que vous receviez des messages similaires à celui-ci dans le journal des erreurs SQL Server. Ce problème survient lorsque l’instance antérieure de SQL Server héberge une base de données en lecture/écriture et qu’elle 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 porte le nom Test_RO_FG :