단일 사용자 모드에서 다중 사용자로 데이터베이스 설정


189

SINGLE_USER모드에서 복원 된 데이터베이스를로 설정하는 데 도움이 필요 합니다 MULTI_USER. 내가 달릴 때마다

ALTER DATABASE BARDABARD
SET MULTI_USER;
GO

이 오류가 발생합니다.

현재 데이터베이스 'BARDABARD'의 상태 또는 옵션을 변경할 수 없습니다.

데이터베이스가 단일 사용자 모드이고 사용자가 현재 연결되어 있습니다.

SINGLE_USER다른 모드로 설정하려면 비 모드에 있어야하지만 데이터베이스가 다른 모드에서는 데이터베이스를 설정할 수 없습니다 SINGLE_USER.

답변:


114

“사용자가 현재 연결되어 있습니다”는 SQL Server Management Studio 창 자체 일 수 있습니다. 마스터 데이터베이스를 선택하고 ALTER쿼리를 다시 실행 하십시오.


1
여기에 추가 : 쿼리 창이 활성화되면 사용 가능한 데이터베이스 도구 모음 드롭 다운 에서 다른 데이터베이스 (예 :) master가 선택되어 있어도 쿼리 창이 데이터베이스에 연결될 수 있습니다 . 문제가 계속되면 다른 모든 쿼리 창을 닫고 왼쪽 창 하나 와 같은 드롭 다운에서 또는 무고한 시스템 데이터베이스를 선택하십시오 . mastertempdb
CVn

Microsoft SQL Server Management Studio에서 DB 연결을 끊고 다시 연결하십시오. 그런 다음 명령을 다시 실행하십시오.
Isuru Madusanka

첫 번째 의견은 매우 유용하며 실제로 답변에 추가 될 수 있습니다. 다른 모든 쿼리를 닫기 전에 쿼리를 실행할 수 없습니다.
user2216

88

이 오류 메시지는 일반적으로 DB에 연결된 다른 프로세스가 있음을 의미합니다. 연결된 것을 확인하려면 이것을 실행하십시오 :

exec sp_who

그러면 프로세스가 반환되고 다음을 실행할 수 있습니다.

kill [XXX]

여기서 [xxx]는 spid죽이려고하는 프로세스입니다.

그런 다음 위의 진술을 실행할 수 있습니다.

행운을 빕니다.


kill [xxx]는 프로세스를 제거하지만 명령을 실행하려고하면 다시 돌아옵니다!
colmde

74

변경 사항을 즉시 롤백하는 옵션을 추가 할 수 있습니다.

ALTER DATABASE BARDABARD
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

1
ROLLBACK IMMEDIATE정확히 무엇을 합니까?
dakab

3
@dakab 트랜잭션이 롤백 되도록 강제하기 전에 대기하거나 트랜잭션이 보류되지 않을 때까지 무기한 대기 ALTER DATABASE하는 것과는 대조적으로, 명령문 트랜잭션 이 시작될 때 즉시 보류중인 모든 트랜잭션이 롤백되도록합니다 . WITH ROLLBACK X SECONDS현재 문서에서 찾을 수없는 것 같습니다). "지금하고있는 모든 일을 멈추고 그렇게하는 것"과 같습니다.
베이컨 비트

39

SQL Server 2012 :

를 마우스 오른쪽 버튼으로 클릭 DB > Properties > Options > [Scroll down] State > RestrictAccess > select Multi_user하고 확인을 클릭하십시오.

짜잔!


5
실제로, 이것은 귀하의 솔루션을 시도했을 때받은 것입니다 : / " 'XXX'데이터베이스는 이미 열려 있으며 한 번에 한 명의 사용자 만 가질 수 있습니다. (Microsoft SQL Server, 오류 : 924)"
Krzysztof Wolny

1
SQL 2008R2에서 추가로 확인되었습니다.
codo-sapien

KILL 구문 사용을 허가하지 않은 경우에도 최선의 대답
Marco Marsala


13

이것은 나를 위해 잘 작동했습니다.

단계 1. 데이터베이스 엔진을 마우스 오른쪽 단추로 클릭하고 활동 모니터를 클릭 한 후 연결중인 프로세스를 확인하십시오. 특정 사용자를 종료하고 쿼리를 즉시 실행하십시오.

2 단계.

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

데이터베이스를 새로 고칩니다.


9

실제로 하나의 명령이 새로 고쳐지고 다시 잠길 때까지 프로세스와 경쟁 조건에 의해 DB가 거의 잠겨있는 문제가 발생했습니다. 다음 명령을 다시 실행해야했습니다. SSMS에서 저를 오프라인 상태로 만들었습니다. 거기서부터 복원 작업을 수행하고 온라인으로 돌아 왔습니다.

처음 달렸다 :

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

그런 다음 (두 번째 쿼리 창에서) 직후 :

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

내가 필요한 것을 한 다음 다시 온라인으로 가져 왔습니다. 내 문제를 결합하고 해결하기 위해이 조각을 쓴 모든 사람들에게 감사드립니다.


7

SQL Management Studio를 사용하는 대신 서버에 직접 로그온하는 것이 가장 좋습니다.

로그인 한 계정이 MULTI_USER로 설정하려는 데이터베이스의 dbowner인지 확인하십시오. 가능한 경우 sa로 로그인 (SQL 서버 인증 사용)

IIS에서 데이터베이스를 사용하는 경우 웹 사이트와이를 사용하는 앱 풀을 중지하십시오. 연결되어 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

여전히 문제가있는 경우 여기를 참조하십시오.

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

마지막 대안으로 -위의 모든 것을 시도했지만 필사적 인 경우 SQL Server 인스턴스를 중지하고 다시 시작할 수 있습니다.


5

다음 단계를 사용하여 방금 수정했습니다. 도움이 될 수 있습니다.

1 단계

단일 사용자 데이터베이스를 마우스 오른쪽 버튼으로 클릭


2 단계

오프라인으로


3 단계

연결 끊기 및 오프라인


단계 : 4

온라인으로


단계 : 5

그런 다음 다음 쿼리를 실행하십시오.

ALTER DATABASE YourDBName
SET MULTI_USER
WITH ROLLBACK IMMEDIATE
GO

즐겨...!


2

아래 코드는 singleuser모드 로 변경하는 데 사용 된 특정 SPID를 몰랐을 때 효과적이었습니다 .

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. 모든 것이 효과가 없었습니다.
  2. 모든 연결을 끊을 때 해당 서버에 원격으로 로그인
  3. 더 이상 "킬링 프로세스"테스트가 완료되지 않을 때까지 아래 코드를 두 번 이상 실행하십시오.
  4. 아래 코드 아래 코드를 사용하여 다시 활성화하십시오.

master GO를 사용하여 @sql을 varchar (20)로, @spid를 int로 선언하십시오.

dbid = db_id ( 'DB_NAME') 및 spid! = @@ spid 인 master..sysprocesses에서 @spid = min (spid)를 선택하십시오.

(@spid가 null이 아닌) 인쇄 시작 '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

그런 다음 다시 살아

ALTER DATABASE DB_NAME SET MULTI_USER; 가다


1

이것은 나를 위해 잘 작동했습니다

  1. 백업을
  2. 새 데이터베이스를 작성하고 백업을 복원하십시오
  3. 그런 다음 속성> 옵션> [아래로 스크롤] 상태> RestrictAccess> 다중 사용자를 선택하고 확인을 클릭하십시오.
  4. 기존 데이터베이스 삭제

모두 에게이 작품을 기원합니다 감사합니다 Ramesh Kumar


1

위의 방법으로 문제가 해결되지 않으면 spid의 로그인 이름을 찾아 보안-로그인에서 비활성화하십시오.


1

단일 모드에서 데이터베이스를 수행 할 수 없습니다. 무엇보다도 SQL 관리 스튜디오를 열면 데이터베이스의 사용자를 알지 못하지만 데이터베이스를 클릭하면 단일 사용자와 명령이 작동하지 않는 것으로 간주됩니다. 관리 스튜디오를 닫고 다시여십시오. 데이터베이스를 선택하지 않고 새 쿼리 창을 사용하여 명령 스크립트를 작성하십시오.

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

f5 wolla 모든 것을 확인하십시오!


0

나는 문제를 쉽게 해결했다

  1. 데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하십시오.

  2. 변경 후 데이터베이스 이름-> 속성-> 옵션-> 스크롤 오른쪽 하단으로 이동하십시오 (SINGLE_USER에서 MULTI_USER로 스크롤).

  3. 이제 다시 데이터베이스 이름을 이전 이름으로 바꿀 수 있습니다.


0

SQL Server 2014 작업을 3 번 이상 수행 한 결과, 데이터베이스를 변경하지 않고 단일 사용자 모드로 변환했습니다. 데이터베이스 작성 중에 발생 했어야합니다. 데이터베이스가 단일 사용자 모드에 있고 연결할 수 없다는 오류를 항상 수신했기 때문에 위의 모든 방법이 작동하지 않았습니다.

내가 일해야 할 유일한 것은 SQL Server Windows 서비스를 다시 시작하는 것입니다. 이를 통해 데이터베이스에 연결하고 필요한 변경을 수행하거나 데이터베이스를 삭제하고 다시 시작할 수있었습니다.


0

데이터베이스 속성으로 이동하여 SINGLE USER 모드를 MULTI USER로 변경하십시오.

여기에 이미지 설명을 입력하십시오

참고 : 작동하지 않으면 Db 백업을 수행하고 다시 복원하고 위의 방법을 다시 수행하십시오.

* 단일 = SINGLE_USER

배수 = MULTI_USER

제한됨 = RESTRICTED_USER


OP가 사용하는 쿼리와 다른 점은 무엇입니까?
Squazz

네 둘 다 동일하게 작동합니다. CREATE 테이블 쿼리를 사용하는 대신 동일합니다 .SQL 서버 GUI 테이블 디자이너를 사용하여 테이블을 만들었습니다 .BTS 모두 동일하게 작동합니다. 하나는 쿼리 방법이고 다른 하나는 GUI 방법입니다. 당신이 좋아하는 것을 사용하십시오.
Hassan Saeed

OP는 쿼리 결과에 오류가 있음을 분명히 나타냅니다. 당신이 대답을 전혀 제공하지 않는 쿼리를 사용하는 것과 똑같은 말을하는 것처럼, 당신은 혼란
스럽고

0

단일 사용자 모드로 전환 한 후 클라이언트는 SQL Server와 하나의 연결 만 설정할 수 있습니다. "개체 탐색기"는 (별도의) 연결을 취하므로 쿼리에서 다중 사용자 문을 실행하려는 경우 창에서 단일 사용자 모드에서 다른 연결을 설정할 수 없다는 오류가 발생합니다.

저에게는 이것이 문제가 아니었지만 제 경우에는 지속적으로 (몇 초마다) 연결을 설정하는 자동화 된 프로세스가 거의 없었으므로 DB를 단일 사용자 모드로 가져 와서 연결을 끊 자마자 프로세스가 연결을 설정 / 사용했습니다 (복원 작업을 시작하기 전에). 해당 연결을 종료하자마자 연결이 다시 연결되고 복원 명령을 실행하면 연결이 이미 사용 중이라는 오류가 발생합니다.

이 문제를 해결하기 위해 하나의 쿼리 창에서 명령문, 명령문 및 작업 kill변경을 User-Mode작성하고 Restore한 번에 모두 실행했을 때 voila !!! 효과가있었습니다.

이것이 다른 사람들을 돕기를 바랍니다.


0

로컬 DB에 문제가있었습니다.

SQL Server를 중지 한 다음 SQL Server를 시작한 다음 SSMS UI를 사용하여 DB 속성을 Multi_User로 변경하여이 문제를 해결할 수있었습니다.

백업을 복원하려고 할 때 DB가 "단일 사용자"모드로 전환되었습니다. 복원을 시도하기 전에 대상 데이터베이스의 백업을 만들지 않았습니다 (SQL 2017). 이것은 매번 당신을 얻을 것입니다.

SQL Server를 중지하고 SQL Server를 시작한 다음 위의 스크립트를 실행하거나 UI를 사용하십시오.


0

나는 잠시 동안 해결책을 찾았고 마침내 아래 해결책을 찾았습니다.

일반적으로 SSMS는 백그라운드에서 데이터베이스에 여러 연결을 사용합니다.

액세스 모드를 변경하기 전에 이러한 연결을 종료해야합니다. (나는 EXEC (@kill); 아래 코드 템플릿에서 으로 .)

그때,

다음 SQL을 실행하여 데이터베이스를 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

단일 사용자 모드로 다시 전환하려면 다음을 사용하십시오.

ALTER DATABASE [<Your_DB_Name>] SET SINGLE_USER

이 작동합니다. 행복한 코딩 !!

감사!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.