단일 사용자 모드 종료


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.