Wyjdź z trybu jednego użytkownika


208

Obecnie moja baza danych jest w trybie pojedynczego użytkownika. Podczas próby rozszerzenia mojej bazy danych pojawia się błąd:

Baza danych „my_db” jest niedostępna. (ObjectExplorer)

Ponadto, gdy próbuję usunąć bazę danych, pojawia się błąd:

W tej chwili nie można wprowadzić zmian w stanie ani opcjach bazy danych „my_db”. Baza danych znajduje się w trybie pojedynczego użytkownika, a użytkownik jest obecnie z nią połączony.

Jak wyjść z trybu pojedynczego użytkownika? Nie mam żadnego użytkownika korzystającego z tej bazy danych.

Gdy próbuję przeglądać moją witrynę za pomocą IIS, pojawia się błąd:

Podczas obsługi bieżącego żądania sieciowego wygenerowano nieobsługiwany wyjątek. Informacje dotyczące pochodzenia i lokalizacji wyjątku można zidentyfikować za pomocą śledzenia stosu wyjątków poniżej.

Wydaje mi się, że powoduje to tryb pojedynczego użytkownika.

Odpowiedzi:


381

SSMS ogólnie używa kilku połączeń z bazą danych za kulisami.

Będziesz musiał zabić te połączenia przed zmianą trybu dostępu.

Najpierw upewnij się, że eksplorator obiektów jest skierowany do systemowej bazy danych, takiej jak master.

Po drugie, uruchom sp_who2 i znajdź wszystkie połączenia z bazą danych „my_db”. Kill wszystkie połączenia, wykonując, KILL { session id }gdzie identyfikator sesji jest SPIDwymienione przez sp_who2.

Po trzecie, otwórz nowe okno zapytania.

Wykonaj następujący kod.

-- Start in master
USE MASTER;

-- Add users
ALTER DATABASE [my_db] SET MULTI_USER
GO

Zobacz mój blog na temat zarządzania plikami bazy danych. Zostało to napisane do przenoszenia plików, ale zarządzanie użytkownikami jest takie samo.


2
Kiedy użyłem polecenia „sp_who2”, nie widziałem żadnej nazwy DBName podłączonej do „my_db”, nie zabiłem żadnego z tych połączeń. Po uruchomieniu poleceń pojawia się ten sam błąd = [: 'Nie można w tej chwili dokonać zmian stanu lub opcji bazy danych „my_db”. Baza danych znajduje się w trybie pojedynczego użytkownika, a użytkownik jest obecnie z nią połączony. Msg 5069, poziom 16, stan 1, wiersz 1 Instrukcja ALTER DATABASE nie powiodła się ”
Liondancer

2
Czy upewniłeś się, że jesteś w trybie master, sp_who2 nie wyświetla żadnych wierszy z bazą danych = my_db, a twojego eksploratora obiektów nie ma na my_db.
CRAFTY DBA

1
Spróbuj odłączyć i połączyć SSMS. Coś musi być podłączone do tej bazy danych. Inną opcją jest połączenie z dedykowaną konsolą administracyjną (DAC). Zakłada się, że jesteś administratorem systemu. Następnie zabij przestępcę.
CRAFTY DBA

1
Ponadto pobierz mój skrypt usp_who2 ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt ). Wykonaj to. Umieszcza narzędzie w msdb.dbo.usp_who2. Zapisuje wyniki sp_who2 w tabeli w tempdb pod twoim identyfikatorem użytkownika, filtruj według nazwy bazy danych. Opublikuj obraz błędu, aby pomóc nam bardziej. Powodzenia.
CRAFTY DBA

3
Znajdź SPID, użyj następującego polecenia: Zabij 100. 100 to numer sesji (SPID).
CRAFTY DBA,

45

Najpierw znajdź i KILLwszystkie procesy, które są obecnie uruchomione.

Następnie uruchom następujące polecenie, T-SQLaby ustawić bazę danych w MULTI_USERtrybie.

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

To rozwiązanie nie działa dla mnie na SQL Server 2016. Jeśli zapytam master..sysprocesses, zobaczę kilka wierszy, ale wtedy wiersze zostaną zastąpione komunikatem o błędzie, że dana baza danych jest w trybie pojedynczego użytkownika itp.
youcantryreachingme

@youcantryreachingme, podaj tutaj komunikat o błędzie otrzymany w SQL Server 2016, aby ja / ktoś inny mógł pomóc w rozwiązaniu problemu.
Sathish

tak samo jak w PO: W tej chwili nie można dokonać zmian stanu lub opcji bazy danych „my_db”. Baza danych znajduje się w trybie pojedynczego użytkownika, a użytkownik jest obecnie z nią połączony.
youcantryreachingme 30.04.2019

25

Aby wyłączyć tryb pojedynczego użytkownika, spróbuj:

ALTER DATABASE [my_db] SET MULTI_USER

Aby wrócić do trybu pojedynczego użytkownika, możesz użyć:

ALTER DATABASE [my_db] SET SINGLE_USER


1
Pojawia się błąd: w tej chwili nie można dokonać zmian stanu lub opcji bazy danych „my_db”. Baza danych znajduje się w trybie pojedynczego użytkownika, a użytkownik jest obecnie z nią połączony. Msg 5069, poziom 16, stan 1, wiersz 1 ALTER DATABASE instrukcja nie powiodła się. ”
Liondancer

1
Czy możesz zatrzymać i ponownie uruchomić bazę danych (oczywiście jeśli nie jest to system produkcyjny, który wpłynie na innych użytkowników), a następnie ponowić polecenie? I jak stwierdził @CRAFTYDBA, polecenie powinno zostać wykonane z głównej bazy danych.
rsbarro

1
Rozszerzyłem „Systemowe bazy danych” i kliknąłem prawym przyciskiem myszy „master” i wybrałem „Nowe zapytanie” i wypróbowałem zarówno w twojej, jak i w @ CRAFTYDBA. Ten sam błąd = [
Liondancer

1
Czy próbowałeś zatrzymać i ponownie uruchomić bazę danych, aby zabić istniejące połączenie? Możesz także poszukać tutaj innych sposobów na zabicie połączeń z bazą danych: stackoverflow.com/questions/11620/…
rsbarro

2
Kliknij prawym przyciskiem myszy serwer w lewym okienku i kliknij „Rozłącz”. Upewnij się, że masz tylko jedną kartę SSMS w bazie danych (kliknij prawym przyciskiem myszy i wybierz „Rozłącz inne połączenia”), a następnie wykonaj instrukcję. Każda eksplorator kart i obiektów jest połączeniem; możesz mieć tylko jedno połączenie otwarte z bazą danych (stąd „tryb pojedynczego użytkownika”). Pojedynczy użytkownik powinien być „pojedynczym połączeniem” :) Powodzenia
tommy_o

20
  1. Kliknij prawym przyciskiem myszy bazę danych w sekcji baz danych
  2. Wybierz „Właściwości”
  3. Wybierz stronę „Opcje”
  4. Przewiń w dół „Inne opcje” i zmień pole „Ogranicz dostęp”

zrzut ekranu strony opcji serwera SQL


1
To rozwiązanie nie działa dla mnie na SQL Server 2016. Próba uzyskania dostępu do właściwości pokazuje błąd, że baza danych jest w trybie pojedynczego użytkownika i ma już podłączonego użytkownika.
youcantryreachingme


8

Miałem ten sam problem, a identyfikator sesji do zabicia został znaleziony przy użyciu tego zapytania:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep');

To było idealne. Znalazłem nieznośny SPID i przywróciłem DB do trybu online. Wielkie dzięki!
Russell Speight

8

Naciśnij CTRL + 1

znajdź proces blokujący bazę danych. Poszukaj db w kolumnie dbname i zanotuj spid. Teraz musisz wykonać to polecenie:

kill <your spid>
ALTER DATABASE <your db> SET MULTI_USER;

CTRL + 1 to bardzo przydatny skrót, o którym nie wiedziałem!
Tyler Forsythe

7

Dla mnie działało:

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

Inną opcją jest:

  • przełączyć bazę danych w tryb offline; w SMSS kliknij bazę danych prawym przyciskiem myszy i wybierz opcję Przełącz offline, zaznacz opcję „Usuń wszystkie połączenia”
  • biegać ALTER DATABASE [Your_Db] SET MULTI_USER

Mój nie pozwolił mi przenieść go w tryb offline, po prostu powtarzał, że jest w trybie pojedynczego użytkownika i że użytkownik jest połączony! (tak, zaznaczyłem „porzuć wszystkie połączenia”). Zamiast tego wyłączyłem bazę danych!
TabbyCool

Musiałem skorzystać z tej opcji, ponieważ nie było podłączonych użytkowników, a polecenie KILL nie działało na połączeniu sa.
Derek K

6

Na wypadek, gdyby ktoś natknął się na ten wątek, oto kuloodporne rozwiązanie programu SQL Server zablokowane w TRYBIE POJEDYNCZEGO UŻYTKOWNIKA

- Uzyskaj identyfikator procesu (spid) połączenia, które chcesz zabić
- Zamień „DBName” na rzeczywistą nazwę 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'

Alternatywnie możesz również użyć polecenia „sp_who”, aby uzyskać „spid” otwartego połączenia:

- Lub użyj tego SP zamiast tego

exec sp_who

- Następnie wykonaj następujące czynności i zastąp [spid] i [DBName] poprawnymi wartościami

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

Dzięki za dodatkowe informacje, zrobiłem dużą różnicę!
Daniel

5

Nie jestem pewien, czy to komukolwiek pomaga, ale miałem ten sam problem i nie mogłem znaleźć procesu, który mnie powstrzymywał. Zamknąłem SSMS i zatrzymałem wszystkie usługi uderzające w lokalną instancję. Potem, gdy wróciłem i uruchomiłem exec sp_who2, pokazało mi to winowajcę. Zabiłem proces i udało mi się uruchomić Multi_User, a następnie ponownie uruchomić usługi. Mieliśmy IIS uderzając go co kilka minut / sekund w poszukiwaniu określonych pakietów.


3

Dziś rano natknąłem się na ten sam problem. Okazało się to prostym problemem. Miałem otwarte okno zapytania ustawione w bazie danych jednego użytkownika w eksploratorze obiektów. Procedura przechowywana sp_who2 nie pokazała połączenia. Gdy go zamknąłem, byłem w stanie to ustawić


3

Dodanie do odpowiedzi Jespers , aby być jeszcze bardziej skutecznym:

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHzastosowania DEADLOCK_PRIORITY5.

To, co się dzieje, polega na tym, że inne procesy mają pęknięcie w bazie danych, a jeśli twój proces ma niższą wartość DEADLOCK_PRIORITY, wtedy przegrywa wyścig.

Pozwala to uniknąć znalezienia i zabicia drugiego pająka (co może wymagać kilkakrotnego wykonania).

Możliwe, że będziesz musiał uruchomić ALTER DATABASEwięcej niż jeden raz (ale Jesper to robi). Zmodyfikowany kod:

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

3

Użyj tego skryptu

exec sp_who

Znajdź kolumnę dbname i spid

teraz wykonaj

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

Dzisiaj stanąłem przed tym samym problemem, w którym moja baza danych została zmieniona z trybu wielu użytkowników na tryb pojedynczego użytkownika, co ostatecznie powstrzymało mnie od opublikowania bazy danych.

Aby rozwiązać ten problem, musiałem zamknąć wszystkie wystąpienia programu Visual Studio i uruchomić poniższe polecenie w oknie zapytania serwera SQL -

USE [Your_Database_Name]; ALTER DATABASE [Your_Database_Name] SET MULTI_USER GO

To polecenie zmieniło DB z Single User na Multi User, a potem udało mi się opublikować.


1

Nawet ja napotkałem ten sam problem, nie mogłem znaleźć aktywnych połączeń z my_db, aby go zabić, ale nadal pokazuje ten sam błąd. W końcu rozłączam wszystkie możliwe połączenia SSMS dla dowolnej bazy danych na serwerze, tworzę nowe połączenie z SSMS i zmieniam je na Wielu użytkowników.

-- Actual Code to change my_db to multi user mode
USE MASTER;
GO
ALTER DATABASE [my_db] SET MULTI_USER

Uwaga: Wydaje się, że jest to możliwy błąd w SQL Server 2005!


1

Właśnie tego doświadczyliśmy w SQL 2012. Proces replikacji włączył się, gdy zabiliśmy oryginalną sesję, która ustawiła ją na jednego użytkownika. Ale sp_who2 nie pokazał tego nowego procesu dołączonego do bazy danych. Zamknięcie SSMS i ponowne otwarcie pozwoliło nam zobaczyć ten proces w bazie danych, a następnie mogliśmy go zabić i natychmiast przejść do trybu wielu użytkowników i to działało.

Nie potrafię zrozumieć logiki tego, ale wydaje się, że jest to błąd w SSMS i nadal objawia się w SQL 2012.


0

użyj mistrza

UDAĆ SIĘ

wybierz d.nazwa, d.dbid, spid, login_time, nt_domain, nt_username, loginname z sysprocesses p wewnętrzny dołącz do sysdatabases d na p.dbid = d.dbid gdzie d.name = 'nazwa bazy danych'

kill 568 - kill spid

ALTER DATABASE nazwa bazy danych ”

ZESTAW MULTI_USER przejdź

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.