Définir la base de données du mode SINGLE USER sur MULTI USER

189

J'ai besoin d'aide pour configurer une base de données qui a été restaurée en SINGLE_USERmode MULTI_USER. Chaque fois que je cours

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

J'obtiens cette erreur:

Les modifications de l'état ou des options de la base de données 'BARDABARD' 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é.

Il doit être en SINGLE_USERmode non- mode pour le définir sur un autre mode, mais je ne peux pas définir la base de données dans un autre mode tant qu'il est en SINGLE_USERmode.

Rahna1970418
la source

Réponses:

114

«L'utilisateur y est actuellement connecté» peut être la fenêtre SQL Server Management Studio elle-même. Essayez de sélectionner la base de données principale et exécutez à ALTERnouveau la requête.

Paul
la source
1
Ajout à ceci: Il semble qu'une fenêtre de requête peut être attachée à la base de données même si une autre base de données (telle que master) est sélectionnée dans la liste déroulante de la barre d'outils Bases de données disponibles lorsque la fenêtre de requête est active. Si cela continue de vous donner des maux de tête, fermez toutes les autres fenêtres de requête et sélectionnez une base de données système innocente comme masterou tempdbdans la liste déroulante de la fenêtre que vous avez laissée.
un CVn le
Essayez de déconnecter la base de données et de vous reconnecter dans Microsoft SQL Server Management Studio. Ensuite, exécutez à nouveau la commande.
Isuru Madusanka
Le premier commentaire est très utile et pourrait être ajouté à la réponse, en fait. Je n'ai pas pu exécuter la requête avant de fermer toutes les autres requêtes.
user2216
88

Ce message d'erreur signifie généralement que d'autres processus sont connectés à la base de données. Essayez d'exécuter ceci pour voir lesquels sont connectés:

exec sp_who

Cela vous ramènera le processus et vous devriez alors pouvoir exécuter:

kill [XXX]

Où [xxx] est le spidprocessus que vous essayez de tuer.

Ensuite, vous pouvez exécuter votre déclaration ci-dessus.

Bonne chance.

sgeddes
la source
kill [xxx] se débarrasse du processus, mais quand j'essaye d'exécuter ma commande, elle revient!
colmde
74

Vous pouvez ajouter la possibilité d'annuler immédiatement votre modification.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO
LG1
la source
1
Que fait ROLLBACK IMMEDIATEexactement?
dakab le
3
@dakab Force toutes les transactions en attente à être annulées immédiatement dès le début de la ALTER DATABASEtransaction de l' instruction, par opposition à WITH ROLLBACK X SECONDSce qui attend que les transactions se terminent avant de les forcer à revenir en arrière ou à attendre indéfiniment jusqu'à ce qu'il n'y ait pas de transactions en attente (ce que je pense est la valeur par défaut, mais ne semble pas trouver dans la doc pour le moment). C'est l'équivalent de «arrêtez tout ce que vous faites maintenant et faites ceci».
Bacon Bits
39

SQL Server 2012:

faites un clic droit sur DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_useret cliquez sur OK.

Voila!

Div2504
la source
5
Pas vraiment, c'est ce que j'ai reçu en essayant votre solution: / "La base de données 'XXX' est déjà ouverte et ne peut avoir qu'un seul utilisateur à la fois. (Microsoft SQL Server, Erreur: 924)"
Krzysztof Wolny
1
En outre confirmé dans SQL 2008R2.
codo-sapien
Meilleure réponse, fonctionnant même dans les cas où vous n'avez pas l'autorisation d'utiliser la déclaration KILL
Marco Marsala
22

J'ai eu le même problème et il a été résolu par les étapes suivantes - référence: http://giladka8.blogspot.com.au/2011/11/database-is-in-single-user-mode-and.html

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 56 --=> kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO
Azadeh Khojandi
la source
13

CA marchait bien pour moi.

Étape 1. Faites un clic droit sur le moteur de base de données, cliquez sur le moniteur d'activité et voyez quel processus est connecté. Tuez cet utilisateur particulier et exécutez la requête immédiatement.

Étape 2.

USE [master];
GO
ALTER DATABASE [YourDatabaseNameHere] SET MULTI_USER WITH NO_WAIT;
GO  

et actualisez la base de données.

Sunil Guragol
la source
9

En fait, j'ai eu un problème où ma base de données était à peu près verrouillée par les processus et une condition de concurrence avec eux, au moment où une commande exécutée était actualisée et qu'elle était à nouveau verrouillée ... j'ai dû exécuter les commandes suivantes dos à dos dans SSMS et m'a mis hors ligne et à partir de là, j'ai fait ma restauration et je suis revenu en ligne très bien, les deux requêtes où:

Première course:

USE master
GO

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id('<yourDbName>')

EXEC(@kill);

Puis immédiatement après (dans la deuxième fenêtre de requête):

USE master ALTER DATABASE <yourDbName> SET OFFLINE WITH ROLLBACK IMMEDIATE

J'ai fait ce dont j'avais besoin, puis je l'ai remis en ligne. Merci à tous ceux qui ont écrit ces pièces pour que je combine et résolve mon problème.

Shane G.
la source
7

Il peut être préférable de se connecter directement au serveur au lieu d'utiliser SQL Management Studio

Assurez-vous que le compte avec lequel vous vous connectez est dbowner pour la base de données que vous souhaitez définir sur MULTI_USER. Connectez-vous en tant que sa (en utilisant l'authentification serveur SQL) si vous le pouvez

Si votre base de données est utilisée par IIS, arrêtez le site Web et le pool d'applications qui l'utilisent - cela peut être le processus qui est connecté et vous empêche de définir MULTI_USER

USE MASTER
GO

-- see if any process are using *your* database specifically

SELECT * from master.sys.sysprocesses
WHERE spid > 50 -- process spids < 50 are reserved by SQL - we're not interested in these
AND dbid=DB_ID ('YourDbNameHere')

-- if so, kill the process:

KILL n -- where 'n' is the 'spid' of the connected process as identified using query above

-- setting database to read only isn't generally necessary, but may help:

ALTER DATABASE YourDbNameHere
SET READ_ONLY;
GO

-- should work now:

ALTER DATABASE Appswiz SET MULTI_USER WITH ROLLBACK IMMEDIATE

Référez-vous ici si vous rencontrez toujours des problèmes:

http://www.sqlservercentral.com/blogs/pearlknows/2014/04/07/help-im-stuck-in-single-user-mode-and-can-t-get-out/

COMME DERNIÈRE ALTERNATIVE - Si vous avez tout essayé ci-dessus et que vous êtes désespéré, vous pouvez essayer d'arrêter l'instance de serveur SQL et la redémarrer

Chris Halcrow
la source
5

Je viens de corriger en utilisant les étapes suivantes, cela peut vous aider.

Étape 1

clic droit sur la base de données mono-utilisateur


Étape 2

mettre hors ligne


Étape 3

Supprimer la connexion et se déconnecter


Étape 4

Prendre en ligne


Étape: 5

Exécutez ensuite la requête suivante.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Prendre plaisir...!

Rikin Patel
la source
2

Le code ci-dessous a fonctionné pour moi lorsque je ne connaissais pas le SPID spécifique utilisé pour passer en singleusermode.

use master
GO

select 
    d.name, 
    d.dbid, 
    spid, 
    login_time, 
    nt_domain, 
    nt_username, 
    loginame
from sysprocesses p 
    inner join sysdatabases d 
        on p.dbid = d.dbid
where d.name = 'dbname'
GO

kill 52 -- kill the number in spid field
GO

exec sp_dboption 'dbname', 'single user', 'FALSE'
GO
Jaypal Reddy
la source
1
  1. J'ai essayé que tout ne fonctionnait pas
  2. Connectez-vous à ce serveur à distance car nous allons tuer toutes les connexions
  3. exécutez le code ci-dessous plus d'une fois jusqu'à ce qu'il retourne terminé et plus de test de "processus de mise à mort"
  4. réactivez-le à nouveau en utilisant le code ci-dessous le code ci-dessous

utiliser master GO déclarer @sql comme varchar (20), @spid comme int

sélectionnez @spid = min (spid) dans master..sysprocesses où dbid = db_id ('DB_NAME') et spid! = @@ spid

while (@spid n'est pas nul) begin print 'Killing process' + cast (@spid as varchar) + '...' set @sql = 'kill' + cast (@spid as varchar) exec (@sql)

select 
    @spid = min(spid)  
from 
    master..sysprocesses  
where 
    dbid = db_id('DB_NAME') 
    and spid != @@spid end

puis pour le ramener vivant

ALTER DATABASE DB_NAME SET MULTI_USER; ALLER

Bishoy Hanna
la source
1

CA marchait bien pour moi

  1. Faites une sauvegarde
  2. Créez une nouvelle base de données et restaurez-y la sauvegarde
  3. Puis Propriétés> Options> État [Défilement vers le bas]> Restreindre l'accès> sélectionnez Multi_utilisateur et cliquez sur OK
  4. Supprimer l'ancienne base de données

J'espère que ce travail pour tous Merci Ramesh Kumar

Ramesh Kumar
la source
1

Si ce qui précède ne fonctionne pas, recherchez le nom de connexion du spid et désactivez-le dans Sécurité - Connexions

Aileen Gregg
la source
1

Vous ne pouvez pas faire cela parce que la base de données est en mode unique. Par-dessus tout, mais sachez que: lorsque vous avez ouvert le studio de gestion SQL, il ne connaît aucun utilisateur sur la base de données, mais lorsque vous cliquez sur la base de données, il vous considère comme un utilisateur unique et votre commande ne fonctionne pas. Faites simplement cela: fermez le studio de gestion et rouvrez-le. nouvelle fenêtre de requête sans sélectionner aucune base de données écrire le script de commande.

USE [master];
GO
ALTER DATABASE [tuncayoto] SET MULTI_USER WITH NO_WAIT;
GO 

faire f5 wolla tout ok!

Hamit YILDIRIM
la source
0

J'ai résolu le problème facilement

  1. Faites un clic droit sur le nom de la base de données pour le renommer

  2. Après la modification, faites un clic droit sur le nom de la base de données -> propriétés -> options -> allez au bas du défilement RestrictAccess (SINGLE_USER à MULTI_USER)

  3. À nouveau, vous pouvez renommer la base de données comme votre ancien nom.

Vamsi
la source
0

À plus de 3 reprises en travaillant avec SQL Server 2014, j'ai fait convertir une base de données en mode mono-utilisateur sans rien changer. Cela doit avoir eu lieu lors de la création de la base de données. Toutes les méthodes ci-dessus n'ont jamais fonctionné car j'ai toujours reçu une erreur indiquant que la base de données était en mode mono-utilisateur et ne pouvait pas être connectée.

La seule chose que j'ai eue au travail a été de redémarrer le service Windows de SQL Server. Cela m'a permis de me connecter à la base de données et d'apporter les modifications nécessaires ou de supprimer la base de données et de recommencer.

epak96
la source
0

allez simplement aux propriétés de la base de données et changez le mode SINGLE USER en MULTI USER

entrez la description de l'image ici

REMARQUE: si cela ne fonctionne pas pour vous, effectuez une sauvegarde de la base de données et restaurez-la à nouveau et recommencez la méthode ci-dessus

* Unique = SINGLE_USER

Multiple = MULTI_USER

Restreint = RESTRICTED_USER

Hassan Saeed
la source
En quoi est-ce différent de la requête utilisée par OP?
Squazz
oui les deux fonctionneront de la même manière, c'est la même chose qu'au lieu d'utiliser la requête CREATE Table, nous avons utilisé le concepteur de table GUI du serveur SQL pour créer la table, les deux BTS fonctionneront de la même manière, l'un est la méthode de requête et l'autre est la méthode GUI. utilisez ce que vous voulez.
Hassan Saeed le
OP indique clairement que cette requête entraîne une erreur. Comme vous le dites, c'est exactement la même chose que d'utiliser la requête, vous ne donnez pas du tout de réponse, vous ne faites que vous encombrer et ajouter aux nombreuses mauvaises réponses ici
Squazz
0

Après être passé en mode mono-utilisateur, un client ne peut établir qu'une seule connexion avec SQL Server, rappelez-vous que "Object Explorer" prend une connexion (distincte), donc si vous essayez d'exécuter une instruction multi-utilisateur dans une requête fenêtre, vous obtiendrez une erreur indiquant qu'en mode mono-utilisateur, vous ne pouvez pas établir une autre connexion.

Pour moi, ce n'était pas le problème, dans mon cas, il y avait peu de processus automatisés qui établissaient des connexions de manière persistante (toutes les quelques secondes), donc dès que j'ai mis la base de données en mode mono-utilisateur et que je me suis déconnecté, l'un des les processus ont établi / occupé la connexion (avant que je puisse démarrer mon opération de restauration). Dès que je tuerais ces connexions - elles se reconnectaient et lorsque j'exécutais la commande Restore, j'obtiendrais l'erreur que la connexion est déjà occupée.

Pour résoudre ce problème, j'ai dû rédiger les killdéclarations, le changement des User-Modedéclarations etRestore opérations dans une seule fenêtre de requête et lorsque je les ai toutes exécutées en une seule fois, voila !!! ça a marché.

J'espère que cela aide les autres.

Eddie Kumar
la source
0

J'avais des problèmes avec une base de données locale.

J'ai pu résoudre ce problème en arrêtant le serveur SQL, puis en démarrant le serveur SQL, puis en utilisant l'interface utilisateur SSMS pour modifier les propriétés de la base de données en Multi_User.

La base de données est passée en mode «mono-utilisateur» lorsque j'essayais de restaurer une sauvegarde. Je n'avais pas créé de sauvegarde de la base de données cible avant de tenter de restaurer (SQL 2017). cela vous obtiendra à chaque fois.

Arrêtez SQL Server, démarrez SQL Server, puis exécutez les scripts ci-dessus ou utilisez l'interface utilisateur.

hanzolo
la source
0

J'ai cherché la solution sur Google pendant un moment et j'ai finalement trouvé la solution ci-dessous,

SSMS en général utilise plusieurs connexions à la base de données dans les coulisses.

Vous devrez supprimer ces connexions avant de changer le mode d'accès. (Je l'ai fait avec EXEC (@kill); dans le modèle de code ci-dessous.)

Ensuite,

Exécutez le 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 revenir au mode mono-utilisateur, vous pouvez utiliser:

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

Cela devrait fonctionner. Bon codage !!

Merci!!

Trilok Pathak
la source