Actuellement, ma base de données est en mode mono-utilisateur. Lorsque j'essaie d'élargir ma base de données, j'obtiens une erreur:
La base de données 'my_db' n'est pas accessible. (ObjectExplorer)
En outre, lorsque j'essaie de supprimer la base de données, j'obtiens le message d'erreur suivant:
Les modifications de l'état ou des options de la base de données 'my_db' ne peuvent pas être effectuées pour le moment. La base de données est en mode mono-utilisateur et un utilisateur y est actuellement connecté.
Comment puis-je sortir du mode mono-utilisateur? Je n'ai aucun utilisateur utilisant cette base de données.
Lorsque j'essaie de naviguer sur mon site avec IIS, l'erreur que je reçois est:
Une exception non gérée a été générée lors de l'exécution de la requête Web en cours. Les informations concernant l'origine et l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de pile d'exceptions ci-dessous.
Je me sens comme si le mode mono-utilisateur est la cause.
SSMS en général utilise plusieurs connexions à la base de données en coulisse.
Vous devrez tuer ces connexions avant de changer le mode d'accès.
Tout d'abord, assurez-vous que l'objet Explorer est pointé sur une base de données système telle que master.
Deuxièmement, exécutez sp_who2 et recherchez toutes les connexions à la base de données 'my_db'. Supprimez toutes les connexions en effectuant KILL { session id }
où ID de session est le SPID
répertorié par sp_who2
.
Troisièmement, ouvrez une nouvelle fenêtre de requête.
Exécutez le code suivant.
-- Start in master
USE MASTER;
-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO
Voir mon article de blog sur la gestion des fichiers de base de données. Ceci a été écrit pour déplacer des fichiers, mais la gestion des utilisateurs est la même.
Tout d’abord, recherchez et KILL
tous les processus en cours d’exécution.
Ensuite, exécutez le T-SQL
suivant pour définir la base de données en mode MULTI_USER
.
USE master
GO
DECLARE @kill varchar(max) = '';
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; '
FROM master..sysprocesses
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>')
EXEC(@kill);
GO
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Pour sortir du mode mono-utilisateur, essayez:
ALTER DATABASE [my_db] SET MULTI_USER
Pour repasser en mode mono-utilisateur, vous pouvez utiliser:
ALTER DATABASE [my_db] SET SINGLE_USER
J'ai essayé ça marche
ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE
J'ai eu le même problème, et le session_id à tuer a été trouvé en utilisant cette requête:
Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');
Ce qui suit a fonctionné pour moi:
USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Appuyez sur CTRL + 1
trouvez le processus qui verrouille votre base de données. Recherchez votre base dans la colonne nom_bdd et notez le spid. Maintenant, vous devez exécuter cette déclaration:
kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;
Pas sûr que cela aide quelqu'un, mais j'avais le même problème et je ne pouvais pas trouver le processus qui me tenait. J'ai fermé SSMS et arrêté tous les services frappant l'instance locale. Puis une fois que je suis rentré et que j'ai dirigé l'exécutif sp_who2, il m'a montré le coupable. J'ai tué le processus et j'ai pu faire fonctionner Multi_User, puis redémarrer les services. IIS l'a frappé toutes les quelques minutes/secondes à la recherche de certains paquets.
Juste au cas où quelqu'un tomberait sur ce fil, voici une solution à toute épreuve pour SQL Server bloquée en mode utilisateur unique
- Récupère l'ID de processus (spid) de la connexion à supprimer
- Remplacez 'DBName' par le nom actuel du DB
SELECT sd.[name], sp.spid, sp.login_time, sp.loginame
FROM sysprocesses sp
INNER JOIN sysdatabases sd on sp.dbid = sd.dbid
WHERE sd.[name] = 'DBName'
Vous pouvez également utiliser la commande “sp_who” pour obtenir le “spid” de la connexion ouverte:
- Ou utilisez plutôt ceci SP
exec sp_who
- Puis exécutez ce qui suit et remplacez le [spid] et le [DBName] par les valeurs correctes
KILL SpidToKillGoesHere
GO
SET DEADLOCK_PRIORITY HIGH
GO
ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
Utilisez ce script
exec sp_who
Trouver les colonnes nom_base et spid
maintenant exécuter
kill spid
go
ALTER DATABASE [DBName]
SET MULTI_USER;
J'ai rencontré le même problème ce matin. Cela s'est avéré être un problème simple. Une fenêtre de requête ouverte était définie sur la base de données mono-utilisateur dans l'explorateur d'objets. La procédure stockée sp_who2 ne montre pas alors la connexion. Une fois que je l'ai fermé, j'ai pu le régler sur
Une autre option est de:
ALTER DATABASE [Your_Db] SET MULTI_USER
Ajouter à réponse de Jespers , pour être encore plus efficace:
SET DEADLOCK_PRIORITY 10;-- Be the top dog.
SET DEADLOCK_PRIORITY HIGH
utilise DEADLOCK_PRIORITY
sur 5.
Ce qui se passe, c’est que les autres processus ont une fissure dans la base de données et, si votre processus a un plus faible DEADLOCK_PRIORITY
, il perd la course.
Cela évite de trouver et de tuer l'autre spid (ce qui peut être nécessaire plusieurs fois).
Il est possible que vous deviez exécuter ALTER DATABASE
plusieurs fois (mais Jesper le fait). Code modifié:
USE [master]
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[StuckDB]', 'single user', 'FALSE';
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Aujourd'hui, j'ai été confronté au même problème, ma base de données étant passée du mode multi-utilisateur au mode mono-utilisateur, ce qui m'a finalement empêché de publier la base de données.
Afin de résoudre ce problème, je devais fermer toutes les instances de Visual Studio et exécuter la commande ci-dessous dans la fenêtre de requête de SQL Server -
USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO
Cette commande a changé la base de données d’utilisateur unique à utilisateur multiple et par la suite, j’ai pu publier avec succès.
Même si je rencontre le même problème, impossible de trouver des connexions actives à my_db pour le tuer, mais affiche toujours la même erreur. Je finis par déconnecter toutes les connexions SSMS possibles pour toute base de données sur le serveur, créer une nouvelle connexion à partir de SSMS et la changer en multi-utilisateur.
-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER
Remarque: cela semble être un bogue possible dans SQL Server 2005!
Nous venons de faire l'expérience de ce problème dans SQL 2012. Un processus de réplication est intervenu lorsque nous avons tué la session d'origine qui le définissait comme utilisateur unique. Mais sp_who2 n'a pas montré ce nouveau processus associé à la base de données. La fermeture de SSMS et la réouverture nous ont ensuite permis de voir ce processus dans la base de données. Nous pourrions ensuite le tuer et passer immédiatement en mode multi_user, et cela a fonctionné.
Je ne peux pas comprendre la logique derrière tout cela, mais cela semble être un bogue dans SSMS et se manifeste toujours dans SQL 2012.