2013-09-23 15 views
132

Obecnie moja baza danych działa w trybie pojedynczego użytkownika. Kiedy próbuję rozwinąć mi bazę danych, pojawia się błąd:Wyłącz tryb pojedynczego użytkownika

The database 'my_db' is not accessible.(ObjectExplorer)

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

Changes to the state or options of database 'my_db' cannot be made at this time. The database is in single-user mode, and a user is currently connected to it.

Jak wyjść z jedno- tryb użytkownika? Nie mam żadnego użytkownika korzystającego z tej bazy danych.

Kiedy próbuję przeglądać moją stronę z IIS, błąd pojawia się:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

czuję jakby tryb pojedynczego użytkownika jest tego przyczyną.

Odpowiedz

249

SSMS w ogóle używa kilku połączeń do bazy danych za kulisami.

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

Najpierw upewnij się, że eksplorator obiektów jest wskazany na systemową bazę danych, np. Master.

Po drugie, wykonaj sp_who2 i znajdź wszystkie połączenia z bazą danych "my_db". Zabij wszystkie połączenia, wykonując KILL { session id }, gdzie identyfikatorem sesji jest SPID wymienione 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 article w sprawie zarządzania plikami bazy danych. Zostało to napisane dla przenoszenia plików, ale zarządzanie użytkownikami jest takie samo.

+0

Kiedy użyłem polecenia "sp_who2", nie widziałem żadnej nazwy DBName połączonej z "my_db" Nie zabiłem żadnego z tych połączeń. Po uruchomieniu komend otrzymuję ten sam błąd = [: "Zmiany w stanie lub opcjach bazy danych" my_db "nie mogą być teraz wykonane. Baza danych jest w trybie pojedynczego użytkownika, a użytkownik jest z nią połączony. Msg 5069, poziom 16, stan 1, wiersz 1 ALTER DATABASE instrukcja nie powiodła się " – Liondancer

+2

Czy upewniłeś się, że jesteś w stanie master, sp_who2 nie pokazuje żadnych wierszy z bazą danych = my_db, a Twój explorer obiektów nie znajduje się na my_db. –

+1

Spróbuj, odłącz i podłącz SSMS. Coś musi być podłączone do tej bazy danych. Inną opcją jest połączenie z dedykowaną konsolą administracyjną (DAC). Zakłada to, że jesteś sysadminem. Następnie zabij obraźliwy spid. –

17

Aby przełączyć się z trybu pojedynczego użytkownika, spróbuj:

ALTER DATABASE [my_db] SET MULTI_USER

Aby powrócić do trybu pojedynczego użytkownika, można użyć:

ALTER DATABASE [my_db] SET SINGLE_USER

+0

pojawia się błąd: „Zmiany stanu lub opcji bazy danych "my_db" nie można teraz wprowadzić. Baza danych jest w trybie pojedynczego użytkownika, a użytkownik jest z nią połączony. Msg 5069, poziom 16, Stan 1, wiersz 1 Instrukcja ALTER DATABASE nie powiodła się. " – Liondancer

+1

Czy można 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? A ponieważ @CRAFTYDBA stwierdził, że polecenie powinno być wykonane z głównej bazy danych. – rsbarro

+1

Rozszerzyłem "Systemowe bazy danych" i kliknąłem prawym przyciskiem myszy "master" i wybrałem "New Query" i próbowałem w commamd twoich i @ CRAFTYDBA. Ten sam błąd = [ – Liondancer

5

Nie jestem pewien, czy to pomoże każdemu, ale miałem ten sam problem i nie mogłem znaleźć procesu, który mnie wstrzymywał. Zamknąłem SSMS i zatrzymałem wszystkie usługi trafiające w lokalną instancję. Kiedy raz wróciłem i uruchomiłem exec sp_who2, pokazało mi to winnego. Zabiłem proces i udało mi się uruchomić Multi_User, a następnie ponownie uruchomić usługi. Mieliśmy trafienie IIS co kilka minut/sekund, szukając pewnych paczek.

12

Próbowałem to działa

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE 
1

Nawet ja natknąć samego problemu, nie mógł znaleźć aktywne połączenia do my_db go zabić, ale nadal pokazuje ten sam błąd. Kończę odłączanie wszystkich możliwych połączeń SSMS dla dowolnej bazy danych na Serwerze, tworzę nowe połączenie z SSMS i zmieniam je na Multi.

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

Uwaga: To wydaje się być możliwy błąd w SQL Server 2005!

3

Tego samego numeru przebiegłem rano. Okazało się, że jest to prosty problem. Miałem otwarte okno zapytania, które zostało ustawione na bazę danych pojedynczego użytkownika w eksploratorze obiektów. Procedura przechowywana sp_who2 nie wyświetlała połączenia. Kiedyś je zamknął, udało mi się ustawić go

7

Następujące pracował dla mnie:

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 
1

Właśnie doświadczyłem tego w SQL 2012. procesie replikacji wskoczył kiedy zabił oryginalną sesję ustaw dla pojedynczego użytkownika. Ale sp_who2 nie pokazał tego nowego procesu dołączonego do DB. 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 multi_user, który działał.

nie mogę wypracować logikę tego, ale to wydaje się być błąd w SSMS i nadal objawia się w SQL 2012.

7

miałem ten sam problem, a session_id było zabić znaleziono przy użyciu tego zapytania:

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

To było idealne. Znalazłem brzydkie SPID i przywróciłem DB do trybu online. Wielkie dzięki! –

19

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

Następnie uruchom następujący T-SQL, aby ustawić bazę danych w trybie 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 
6

Naciśnij CTRL + 1

znaleźć proces, który blokuje bazę danych. Szukaj w kolumnie dbname dla swojego db i zanotuj spid. Teraz trzeba wykonać to stwierdzenie:

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

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

2

Inną opcją jest:

  • wziąć bazy danych w trybie offline; w SMSS, kliknij prawym przyciskiem myszy bazę danych i wyboru trybu offline, zaznacz „Rzuć Wszystkie połączenia”
  • prowadzony ALTER DATABASE [Your_Db] SET MULTI_USER
+0

Mój nie pozwolił mi przejść do trybu offline, po prostu powtarzał, że był w trybie pojedynczego użytkownika i że użytkownik był podłączony! (tak, zaznaczyłem "upuść wszystkie połączenia"). Zamiast tego wyłączyłem bazę danych! – TabbyCool

6
  1. prawym przyciskiem myszy bazę danych, w sekcji baz
  2. „Właściwości”
  3. Wybierz
  4. wybierz „Opcje "Strona
  5. przewijania w dół«Inne opcje»i zmienić«Ograniczanie dostępu»pole

screenshot of options page of sql server

1

Dodawanie do Jespers answer, aby być jeszcze bardziej skuteczne:

SET DEADLOCK_PRIORITY 10;-- Be the top dog. 

SET DEADLOCK_PRIORITY HIGH wykorzystuje DEADLOCK_PRIORITY od 5.

Co się dzieje jest to, że inne procesy dostać pęknięcia w bazie danych, a jeżeli twój proces ma niższą wartość DEADLOCK_PRIORITY, a następnie traci wyścig.

Pozwala to uniknąć znalezienia i zabicia drugiego spidera (może być konieczne kilkakrotne wykonanie).

Możliwe, że będziesz musiał uruchomić ALTER DATABASE więcej niż jeden raz (ale Jesper to robi). Kod modyfikowany:

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

użyć tego skryptu

exec sp_who 

Znajdź dbname i SPID kolumny

teraz wykonać

kill spid 
go 
ALTER DATABASE [DBName] 
SET MULTI_USER; 
Powiązane problemy