단일 사용자 모드 종료


208

현재 내 데이터베이스는 단일 사용자 모드입니다. 데이터베이스를 확장하려고하면 오류가 발생합니다.

데이터베이스 'my_db'에 액세스 할 수 없습니다. (ObjectExplorer)

또한 데이터베이스를 삭제하려고하면 오류가 발생합니다.

현재 데이터베이스 'my_db'의 상태 또는 옵션을 변경할 수 없습니다. 데이터베이스가 단일 사용자 모드에 있으며 사용자가 현재 연결되어 있습니다.

단일 사용자 모드를 종료하려면 어떻게합니까? 이 데이터베이스를 사용하는 사용자가 없습니다.

IIS를 사용하여 사이트를 탐색 할 때 발생하는 오류는 다음과 같습니다.

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 예외의 출처와 위치에 관한 정보는 아래 예외 스택 추적을 사용하여 식별 할 수 있습니다.

단일 사용자 모드 가이 문제를 일으키는 것처럼 느껴집니다.

답변:


381

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

액세스 모드를 변경하기 전에 이러한 연결을 종료해야합니다.

먼저, 오브젝트 탐색기가 master와 같은 시스템 데이터베이스를 가리키는 지 확인하십시오.

둘째, sp_who2를 실행하고 데이터베이스 'my_db'에 대한 모든 연결을 찾으십시오. KILL { session id }세션 ID가 (으)로 SPID나열되는 곳 을 수행하여 모든 연결 을 종료하십시오 sp_who2.

셋째, 새 쿼리 창을 엽니 다.

다음 코드를 실행하십시오.

-- Start in master
USE MASTER;

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

데이터베이스 파일 관리에 대한 내 블로그 기사 를 참조하십시오 . 이것은 파일 이동을 위해 작성되었지만 사용자 관리는 동일합니다.


2
'sp_who2'명령을 사용할 때 'my_db'에 연결된 DBName을 보지 못했지만 해당 연결을 종료하지 않았습니다. 명령을 실행 한 후에는 같은 오류가 발생합니다. = [: '현재 데이터베이스'my_db '의 상태 또는 옵션을 변경할 수 없습니다. 데이터베이스가 단일 사용자 모드에 있으며 사용자가 현재 연결되어 있습니다. 메시지 5069, 수준 16, 상태 1, 줄 1 ALTER DATABASE 문 실패 '
Liondancer

2
sp_who2가 master에 있는지 확인 했습니까? sp_who2는 database = my_db 인 행을 표시하지 않으며 객체 탐색기가 my_db에 없습니다.
CRAFTY DBA

1
SSMS 연결을 끊고 연결해보십시오. 해당 데이터베이스에 무언가가 연결되어 있어야합니다. 다른 옵션은 전용 관리 콘솔 (DAC)에 연결하는 것입니다. 이것은 귀하가 sysadmin이라고 가정합니다. 그런 다음 문제가되는 spid를 죽입니다.
CRAFTY DBA

1
또한 usp_who2 스크립트 ( craftydba.com/wp-content/uploads/2011/09/usp-who2.txt )를 다운로드하십시오. 그것을 실행하십시오. msdb.dbo.usp_who2에 유틸리티를 배치합니다. sp_who2의 결과를 사용자 ID 아래 tempdb의 테이블에 저장하고 데이터베이스 이름으로 필터링합니다. 더 많은 정보를 제공하기 위해 오류 이미지를 게시하십시오. 행운을 빕니다.
CRAFTY DBA

3
SPID를 찾고 다음을 사용하십시오. Kill 100. 100은 세션 수 (SPID)입니다.
CRAFTY DBA

45

먼저 KILL현재 실행중인 모든 프로세스를 찾아보십시오 .

그런 다음, 다음 T-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

이 솔루션은 SQL Server 2016에서 작동하지 않습니다. master..sysprocesses를 쿼리하면 몇 개의 행이 표시되지만 해당 데이터베이스는 단일 사용자 모드 등의 오류 메시지로 대체됩니다.
youcantryreachingme

@ youcantryreachingme, SQL Server 2016에서 받고있는 오류 메시지를 여기에 알려주십시오. 그래서 다른 사람이 문제를 해결하도록 도울 수 있습니다.
Sathish

OP에서와 동일 : 현재 데이터베이스 'my_db'의 상태 또는 옵션을 변경할 수 없습니다. 데이터베이스가 단일 사용자 모드에 있으며 사용자가 현재 연결되어 있습니다.
youcantryreachingme

25

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

ALTER DATABASE [my_db] SET MULTI_USER

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

ALTER DATABASE [my_db] SET SINGLE_USER


1
'현재 데이터베이스'my_db '의 상태 또는 옵션을 변경할 수 없습니다. 오류가 발생합니다. 데이터베이스가 단일 사용자 모드에 있으며 사용자가 현재 연결되어 있습니다. 메시지 5069, 수준 16, 상태 1, 줄 1 ALTER DATABASE 문이 실패했습니다. '
Liondancer

1
다른 사용자에게 영향을 줄 프로덕션 시스템이 아닌 경우 데이터베이스를 중지했다가 다시 시작한 다음 명령을 다시 시도 할 수 있습니까? @CRAFTYDBA에서 언급했듯이 명령은 master 데이터베이스에서 실행해야합니다.
rsbarro

1
나는 '시스템 데이터베이스'를 확장하고 '마스터'를 마우스 오른쪽 버튼으로 클릭하고 '새 쿼리'를 선택하고 귀하와 @CRAFTYDBA의 commamds에서 모두 시도했습니다. 같은 오류 = [
Liondancer

1
기존 연결을 종료하기 위해 데이터베이스를 중지했다가 다시 시작하려고 했습니까? 또한 데이터베이스에 대한 연결을
끊는

2
왼쪽 창에서 서버를 마우스 오른쪽 버튼으로 클릭하고 '연결 끊기'를 클릭하십시오. 데이터베이스에서 SSMS 탭이 하나만 열려 있는지 확인한 다음 (오른쪽 클릭하고 '다른 연결 끊기'를 선택하십시오) 명령문을 실행하십시오. 각 탭과 객체 탐색기는 연결입니다. 데이터베이스에 하나의 연결 만 열 수 있습니다 (따라서 '단일 사용자 모드'). 단일 사용자는 '단일 연결'이어야합니다. :) 행운을 빌어 요
tommy_o

20
  1. 데이터베이스 섹션에서 데이터베이스를 마우스 오른쪽 단추로 클릭하십시오.
  2. "속성"을 선택하십시오
  3. "옵션"페이지를 선택하십시오
  4. "기타 옵션"을 아래로 스크롤하고 "액세스 제한"필드를 변경하십시오.

SQL Server의 옵션 페이지 스크린 샷


1
이 솔루션은 SQL Server 2016에서 작동하지 않습니다. 속성에 액세스하려고하면 데이터베이스가 단일 사용자 모드에 있고 이미 사용자가 연결되어 있다는 오류가 표시됩니다.
youcantryreachingme


8

나는 같은 문제가 있었고이 쿼리를 사용하여 kill_session_id를 찾았습니다.

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

이것은 완벽했다. 성가신 SPID를 발견하고 DB를 온라인으로 되돌 렸습니다. 많은 감사합니다!
Russell Speight

8

CTRL + 1을 누릅니다.

데이터베이스를 잠그는 프로세스를 찾으십시오. dbname 열에서 db를 찾고 spid를 기록하십시오. 이제 그 문장을 실행해야합니다 :

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

CTRL + 1은 내가 알지 못하는 매우 편리한 단축키입니다!
Tyler Forsythe

7

다음은 나를 위해 일했습니다.

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

다른 옵션은 다음과 같습니다.

  • 데이터베이스를 오프라인으로 전환하십시오. SMSS에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 오프라인으로 만들기를 선택하고 '모든 연결 끊기'를 선택하십시오.
  • 운영 ALTER DATABASE [Your_Db] SET MULTI_USER

내 오프라인으로 가져 가지 못하게하고 단일 사용자 모드에 있으며 사용자가 연결되었다고 계속 말했습니다! (예, "모든 연결 끊기"를 선택했습니다). 대신 데이터베이스를 분리했습니다!
TabbyCool

사용자가 연결되어 있지 않아서이 옵션을 사용해야했으며, KILL 명령이 sa 연결에서 작동하지 않습니다.
Derek K

6

누군가 가이 스레드를 우연히 발견 한 경우 단일 사용자 모드에서 SQL Server에 대한 방탄 솔루션이 있습니다.

-종료해야하는 연결의 프로세스 ID (스파이더) 가져
오기- 'DBName'을 실제 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'

대안으로“sp_who”명령을 사용하여 열린 연결의“스파이더”를 얻을 수도 있습니다.

-또는이 SP를 대신 사용하십시오.

exec sp_who

-다음을 실행하고 [spid] 및 [DBName]을 올바른 값으로 바꿉니다.

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

추가 정보를 보내 주셔서 감사합니다.
Daniel

5

이것이 누군가에게 도움이되는지 확실하지 않지만 같은 문제가 발생하여 나를 방해하는 과정을 찾을 수 없었습니다. SSMS를 닫고 로컬 인스턴스에 충돌하는 모든 서비스를 중지했습니다. 그런 다음 돌아가서 exec sp_who2를 실행하면 범인을 보여주었습니다. 프로세스를 종료하고 Multi_User를 작동시킨 다음 서비스를 다시 시작할 수있었습니다. 우리는 IIS가 특정 패키지를 찾기 위해 몇 분 / 초마다 충돌했습니다.


3

오늘 아침에도 같은 문제가 발생했습니다. 간단한 문제로 판명되었습니다. 개체 탐색기에서 단일 사용자 데이터베이스로 설정된 쿼리 창이 열려 있습니다. sp_who2 저장 프로 시저에 연결이 표시되지 않았습니다. 그것을 닫으면, 나는 그것을 설정할 수 있었다


3

Jespers answer에 추가하면 훨씬 더 효과적입니다.

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGHDEADLOCK_PRIORITY5의 용도

일어나고있는 일은 다른 프로세스가 데이터베이스에서 크랙을 일으키고 프로세스가 더 낮 으면 DEADLOCK_PRIORITY경쟁 에서 벗어날 수 있다는 것 입니다.

이것은 다른 spid를 찾아서 죽이는 것을 방지합니다 (여러 번 수행해야 할 수도 있음).

ALTER DATABASE두 번 이상 실행해야 할 수도 있지만 Jesper는 그렇게합니다. 수정 된 코드 :

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

이 스크립트를 사용

exec sp_who

dbname 및 spid 열 찾기

이제 실행

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

2

오늘 나는 데이터베이스가 다중 사용자에서 단일 사용자 모드로 변경된 동일한 문제에 직면했으며 결국 데이터베이스 게시가 중단되었습니다.

이 문제를 해결하려면 모든 Visual Studio 인스턴스를 닫고 Sql Server 쿼리 창에서 아래 명령을 실행해야했습니다.

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

이 명령은 DB를 단일 사용자에서 다중 사용자로 변경 한 후 성공적으로 게시 할 수있었습니다.


1

심지어 동일한 문제가 발생하여 my_db에 대한 활성 연결을 찾지 못해도 죽일 수는 있지만 여전히 동일한 오류가 표시됩니다. 서버의 모든 데이터베이스에 대해 가능한 모든 SSMS 연결을 끊고 SSMS에서 새 연결을 만들고 다중 사용자로 변경합니다.

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

참고 : 이것은 SQL Server 2005에서 가능한 버그 인 것 같습니다!


1

방금 SQL 2012에서이 문제가 발생했습니다. 단일 사용자로 설정 한 원래 세션을 종료했을 때 복제 프로세스가 시작되었습니다. 그러나 sp_who2는 새로운 프로세스가 DB에 연결되었음을 보여주지 않았습니다. SSMS를 닫았다가 다시 열면 데이터베이스에서이 프로세스를 볼 수 있었고이를 종료하고 즉시 multi_user 모드로 전환 할 수있었습니다.

이 논리를 해결할 수는 없지만 SSMS의 버그 인 것처럼 보이며 SQL 2012에서 여전히 나타납니다.


0

마스터 사용

가다

d.name, d.dbid, spid, login_time, nt_domain, nt_username, sysprocesses에서 loginame을 선택하십시오. p 내부 조인 sysdatabases d에서 p.dbid = d.dbid.

568 처치-spid 처치

ALTER DATABASE 데이터베이스 이름

MULTI_USER 설정

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