Échec de la restauration SQL avec l’erreur « La base de données est déjà ouverte et ne peut avoir qu’un utilisateur à la fois »
Summary: Article de la base de connaissances (KB) qui fournit une solution aux échecs de restauration de base de données SQL lorsque des utilisateurs accèdent à la base de données.
Symptoms
La restauration de la base de données SQL à l’emplacement d’origine échoue avec des erreurs similaires à l’affichage suivant :
avsql Error <40258>: sqlconnectimpl_smo::get_database_data_names Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exception occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.SqlException: Database 'Avamar1' is already open and can only have one user at a time.
Cause
Un ou plusieurs utilisateurs ou connexions accèdent à la base de données qui est restaurée vers. La base de données d’origine ne peut pas être remplacée si des utilisateurs ou des connexions accèdent à la base de données.
Resolution
Modifiez l’état de la base de données du mode multi-utilisateur au mode utilisateur unique.
Utilisation de SQL Server Management Studio
Pour définir une base de données en mode utilisateur unique :
-
Dans Object Explorer, connectez-vous à une instance du moteur de base de données SQL Server, puis développez cette instance.
-
Cliquez avec le bouton droit de la souris sur la base de données à modifier, puis cliquez sur Properties.
-
Dans la boîte de dialogue Propriétés de la base de données, cliquez sur la page Options.
-
Dans l’option Restrict Access, sélectionnez Single.
-
Si d’autres utilisateurs sont connectés à la base de données, un message Open Connections s’affiche. Pour modifier la propriété et fermer toutes les autres connexions, cliquez sur Yes.
Utilisation de Transact-SQL
Pour définir une base de données en mode utilisateur unique :
-
Connectez-vous au moteur de base de données.
-
Dans la barre Standard, cliquez sur New Query.
-
Copiez et collez l’exemple suivant dans la fenêtre de requête et cliquez sur le bouton « Execute ». Cet exemple définit la base de données sur
SINGLE_USERpour obtenir un accès exclusif. L’exemple définit ensuite l’état de la base de données Avamar1 surREAD_ONLYet rend l’accès à la base de données à tous les utilisateurs. L’option de résiliationWITH ROLLBACK IMMEDIATEest spécifié dans le premierALTER DATABASEdéclaration. Cela entraîne l’annulation de toutes les transactions incomplètes et la déconnexion immédiate de toutes les autres connexions à la base de données Avamar1.
SQLCopy
USE master; GO ALTER DATABASE Avamar1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO ALTER DATABASE Avamar1 SET READ_ONLY; GO ALTER DATABASE Avamar1 SET MULTI_USER; GO
Références :
https://docs.microsoft.com/en-us/sql/relational-databases/databases/set-a-database-to-single-user-mode?view=sql-server-2017Une fois cette opération effectuée, relancez la restauration de la base de données SQL à l’emplacement d’origine.