web-dev-qa-db-fra.com

Quitter le mode mono-utilisateur

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.

183
Liondancer

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.

335
CRAFTY DBA

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
34
Sathish

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

22
rsbarro
  1. Faites un clic droit sur votre base de données dans la section bases de données
  2. Sélectionnez "Propriétés"
  3. Sélectionnez la page "Options"
  4. Faites défiler "Autres options" et modifiez le champ "Restreindre l'accès"

screenshot of options page of sql server

15
Tomas

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');
7
Geri Reshef

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
7
Jesper Lehtinen

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;
6
greg121

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.

5
Bindum

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
3
Einar Larusson

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;
3
Aminur Rahman

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

3
Mysti

Une autre option est de:

  • lancer ALTER DATABASE [Your_Db] SET MULTI_USER
3
testpattern

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
2
Roy Latham

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.

2
Vivek

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!

1
Vijred

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.

1
Mr McGoo