Ustaw bazę danych z trybu SINGLE USER na MULTI USER


189

Potrzebuję pomocy w ustawieniu bazy danych, która została przywrócona SINGLE_USER trybie na MULTI_USER. Za każdym razem, gdy biegam

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

Otrzymuję ten błąd:

Obecnie nie można wprowadzać zmian w stanie lub opcjach bazy danych „BARDABARD”.

Baza danych znajduje się w trybie pojedynczego użytkownika, a użytkownik jest obecnie z nią połączony.

Musi być w SINGLE_USERtrybie innym niż tryb, aby ustawić go w innym trybie, ale nie mogę ustawić bazy danych w innym trybie, gdy jest w SINGLE_USERtrybie.

Odpowiedzi:


114

„Użytkownik jest obecnie z nim połączony” może być samym oknem SQL Server Management Studio. Spróbuj wybrać główną bazę danych i ALTERponownie uruchomić zapytanie.


1
Dodając do tego: Wygląda na to, że okno zapytania może zostać dołączone do bazy danych, nawet jeśli w rozwijanym pasku narzędzi Dostępne bazy danych wybrana jest inna baza danych (np. master) , Gdy okno zapytania jest aktywne. Jeśli nadal sprawia ci to ból głowy, zamknij wszystkie inne okna zapytań i wybierz bazę danych niewinnego systemu, taką jak lub z menu rozwijanego w jednym oknie, które opuściłeś. mastertempdb
CVn

Spróbuj odłączyć DB i połączyć się ponownie w Microsoft SQL Server Studio Management Server. Następnie uruchom polecenie ponownie.
Isuru Madusanka

Pierwszy komentarz jest bardzo pomocny i może być dodany do odpowiedzi. Nie mogłem uruchomić zapytania przed zamknięciem wszystkich innych zapytań.
user2216

88

Ten komunikat o błędzie ogólnie oznacza, że ​​do DB są podłączone inne procesy. Spróbuj uruchomić to, aby zobaczyć, które są połączone:

exec sp_who

To zwróci ci proces, a następnie powinieneś być w stanie uruchomić:

kill [XXX]

Gdzie [xxx] to spidproces, który próbujesz zabić.

Następnie możesz uruchomić powyższą instrukcję.

Powodzenia.


kill [xxx] pozbywa się procesu, ale gdy próbuję uruchomić polecenie, wraca!
colmde

74

Możesz dodać opcję natychmiastowego wycofania zmiany.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
Co ROLLBACK IMMEDIATEdokładnie robi?
dakab

3
@dakab Zmusza wszystkie oczekujące transakcje do wycofania natychmiast po rozpoczęciu ALTER DATABASEtransakcji wyciągu, w przeciwieństwie do tego, WITH ROLLBACK X SECONDSktóre czeka na zakończenie transakcji przed wymuszeniem ich wycofania lub czekania w nieskończoność, aż nie będzie żadnych oczekujących transakcji (uważam, że jest to domyślne, ale w tej chwili nie można znaleźć w dokumencie). Jest to odpowiednik „zatrzymaj wszystko, co teraz robisz i zrób to”.
Bacon Bits

39

SQL Server 2012:

kliknij prawym przyciskiem myszy DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_useri kliknij OK.

Voila!


5
Nie bardzo, to właśnie otrzymałem, gdy wypróbowałem twoje rozwiązanie: / „Baza danych 'XXX' jest już otwarta i może mieć tylko jednego użytkownika na raz. (Microsoft SQL Server, Błąd: 924)”
Krzysztof Wolny

1
Dodatkowo potwierdzone w SQL 2008R2.
codo-sapien

Najlepsza odpowiedź, działająca nawet w przypadkach, gdy nie masz pozwolenia na użycie instrukcji KILL
Marco Marsala,


13

To działało dobrze dla mnie.

Krok 1. Kliknij silnik bazy danych prawym przyciskiem myszy, kliknij monitor aktywności i sprawdź, który proces ma połączenie. Zabij tego konkretnego użytkownika i natychmiast wykonaj zapytanie.

Krok 2.

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

i odśwież bazę danych.


9

Naprawdę miałem problem polegający na tym, że moja db była właściwie zablokowana przez procesy i warunki wyścigu, zanim doszło do odświeżenia jednego polecenia, a oni ponownie go zablokowali ... Musiałem uruchomić następujące polecenia od tyłu do tyłu w SSMS i przełączyłem mnie w tryb offline, a następnie przywróciłem i wróciłem do trybu online. Dwa zapytania, w których:

Pierwszy raz:

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);

Następnie natychmiast po (w drugim oknie zapytania):

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

Zrobiłem to, czego potrzebowałem, a następnie wróciłem do trybu online. Dziękuję wszystkim, którzy napisali te utwory, abym połączył i rozwiązał mój problem.


7

Najlepszym rozwiązaniem może być zalogowanie się bezpośrednio na serwerze zamiast korzystania z SQL Management Studio

Upewnij się, że konto, na które logujesz się jako dbowner dla bazy danych, którą chcesz ustawić na MULTI_USER. Zaloguj się jako sa (przy użyciu uwierzytelniania serwera SQL), jeśli możesz

Jeśli twoja baza danych jest używana przez IIS, zatrzymaj stronę internetową i pulę aplikacji, która z niej korzysta - może to być proces, który jest podłączony i blokuje ci przejście do 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

Sprawdź tutaj, jeśli nadal masz problemy:

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

JAKO OSTATNIA ALTERNATYWA - Jeśli wypróbowałeś wszystko powyżej i robisz się zdesperowany, możesz spróbować zatrzymać instancję serwera SQL i uruchomić ją ponownie


5

Właśnie naprawiłem, wykonując następujące kroki, to może ci pomóc.

Krok 1

kliknij prawym przyciskiem myszy bazę danych jednego użytkownika


Krok 2

przejść do trybu offline


Krok 3

Porzuć połączenie i przejdź do trybu offline


Krok 4

Weź online


Krok: 5

Następnie uruchom następujące zapytanie.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

Cieszyć się...!


2

Poniższy kod działał dla mnie, gdy nie znałem konkretnego identyfikatora SPID, który został użyty do przejścia w singleusertryb.

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

1
  1. Próbowałem, wszystko nie działało
  2. Zaloguj się do tego serwera zdalnie, ponieważ będziemy zabijać wszystkie połączenia
  3. uruchom poniższy kod więcej niż jeden raz, aż zwróci ukończenie i nie będzie już testowania „procesu zabijania”
  4. aktywuj go ponownie za pomocą kodu poniżej poniższego kodu

użyj master GO deklaruj @sql jako varchar (20), @spid jako int

wybierz @spid = min (spid) z master..sysprocesses gdzie dbid = db_id ('DB_NAME') i spid! = @@ spid

podczas gdy (@spid nie jest zerowy) zacznij drukować „Proces zabijania” + obsada (@spid jako varchar) + „...” ustaw @sql = „kill” + cast (@spid jako varchar) exec (@sql)

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

a następnie przywrócić go do życia

ALTER DATABASE DB_NAME SET MULTI_USER; UDAĆ SIĘ


1

To działało dobrze dla mnie

  1. Zrób kopię zapasową
  2. Utwórz nową bazę danych i przywróć do niej kopię zapasową
  3. Następnie Właściwości> Opcje> [Przewiń w dół] Stan> Ogranicz dostęp> wybierz Multi_user i kliknij OK
  4. Usuń starą bazę danych

Mam nadzieję, że ta praca dla wszystkich Dziękuję Ramesh Kumar


1

Jeśli powyższe nie działa, znajdź nazwę użytkownika pid i wyłącz ją w Security - Logins


1

Nie można tego zrobić, ponieważ baza danych jest w trybie pojedynczym. Przede wszystkim w porządku, ale powinieneś wiedzieć, że: kiedy otworzysz studio zarządzania SQL, nie zna on żadnego użytkownika w bazie danych, ale po kliknięciu bazy danych uznajesz, że jest to pojedynczy użytkownik i twoje polecenie nie działa. Po prostu zrób to: Zamknij studio zarządzania i otwórz je ponownie. nowe okno zapytania bez wybierania bazy danych napisz skrypt poleceń.

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

zrób f5 wolla wszystko ok!


0

Z łatwością rozwiązałem problem

  1. Kliknij nazwę bazy danych prawym przyciskiem myszy i zmień nazwę

  2. Po zmianie kliknij prawym przyciskiem myszy nazwę bazy danych -> właściwości -> opcje -> przejdź do dolnej części przewijania RestrictAccess (SINGLE_USER na MULTI_USER)

  3. Teraz ponownie możesz zmienić nazwę bazy danych na swoją starą nazwę.


0

Przy więcej niż 3 okazjach do pracy z SQL Server 2014 miałem bazę danych przekonwertowaną do trybu pojedynczego użytkownika bez mojej zmiany. Musiało to mieć miejsce podczas tworzenia bazy danych. Wszystkie powyższe metody nigdy nie działały, ponieważ zawsze pojawiał się błąd, że baza danych była w trybie pojedynczego użytkownika i nie można się z nią połączyć.

Jedyną rzeczą, którą mogłem pracować, było ponowne uruchomienie usługi Windows Server SQL. To pozwoliło mi połączyć się z bazą danych i wprowadzić niezbędne zmiany lub usunąć bazę danych i zacząć od nowa.


0

wystarczy przejść do właściwości bazy danych i zmienić tryb SINGLE USER na MULTI USER

wprowadź opis zdjęcia tutaj

UWAGA: jeśli to nie działa, wykonaj kopię zapasową Db i przywróć ponownie, a następnie ponownie wykonaj powyższą metodę

* Single = SINGLE_USER

Wiele = MULTI_USER

Ograniczone = RESTRICTED_USER


Czym różni się to od zapytania używanego przez OP?
Squazz,

tak, oba będą działały tak samo, to jest tak samo, jak zamiast przy użyciu zapytania CREATE Table użyliśmy narzędzia SQL Server GUI Table Designer do utworzenia tabeli, BTS oba będą działać tak samo, jedno to metoda zapytania, a drugie to metoda GUI. używaj tego, co lubisz.
Hassan Saeed,

OP wyraźnie stwierdza, że ​​jego zapytanie powoduje błąd. Jak mówisz, to jest dokładnie to samo, co przy użyciu zapytania, na które wcale nie dajesz odpowiedzi, po prostu zaśmiecasz i dodajesz wiele błędnych odpowiedzi tutaj
Squazz

0

Po przejściu do trybu pojedynczego użytkownika klient może ustanowić tylko JEDNE połączenie z SQL Server, pamiętaj, że „Object Explorer” podejmuje (osobne) połączenie, więc jeśli próbujesz uruchomić instrukcję dla wielu użytkowników w zapytaniu w oknie pojawi się błąd, że w trybie pojedynczego użytkownika nie można nawiązać innego połączenia.

Dla mnie to nie był problem, w moim przypadku było kilka zautomatyzowanych procesów, które uporczywie (co kilka sekund) nawiązywały połączenia, więc gdy tylko przełączyłem DB w tryb jednego użytkownika i rozłączyłem się, jeden z procesy nawiązały / zajęły połączenie (zanim mogłem rozpocząć operację przywracania). Jak tylko zabiję te połączenia - ponownie się połączą, a kiedy uruchomię polecenie Przywróć, dostanę błąd, że połączenie jest już zajęte.

Aby rozwiązać ten problem, musiałem napisać killoświadczenia, zmienić User-Modeoświadczenia iRestore operacje w jednym oknie zapytania, a kiedy uruchomiłem je wszystkie za jednym razem, voila !!! zadziałało.

Mam nadzieję, że to pomaga innym.


0

Miałem problem z lokalną bazą danych.

Byłem w stanie rozwiązać ten problem, zatrzymując serwer SQL, a następnie uruchamiając serwer SQL, a następnie używając interfejsu SSMS do zmiany właściwości DB na Multi_User.

Baza danych przeszła w tryb „Pojedynczego użytkownika”, gdy próbowałem przywrócić kopię zapasową. Nie utworzyłem kopii zapasowej docelowej bazy danych przed próbą przywrócenia (SQL 2017). dostaniesz to za każdym razem.

Zatrzymaj SQL Server, uruchom SQL Server, a następnie uruchom powyższe skrypty lub użyj interfejsu użytkownika.


0

Przez jakiś czas szukałem rozwiązania i wreszcie wymyśliłem poniższe rozwiązanie,

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. (Zrobiłem to za pomocą EXEC (@kill); w szablonie kodu poniżej.)

Następnie,

Uruchom następujący kod 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

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

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

To powinno działać. Miłego kodowania !!

Dzięki!!

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.