source

단일 사용자 모드 종료

itover 2023. 4. 7. 21:11
반응형

단일 사용자 모드 종료

현재 데이터베이스는 싱글 사용자 모드입니다.데이터베이스를 확장하려고 하면 다음 오류가 나타납니다.

데이터베이스 'my_db'에 액세스할 수 없습니다.(오브젝트 탐색기)

또, 데이터베이스를 삭제하려고 하면, 다음의 에러가 표시됩니다.

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

싱글 사용자 모드를 종료하려면 어떻게 해야 하나요?이 데이터베이스를 사용하는 사용자가 없습니다.

IIS를 사용하여 사이트를 참조하려고 하면 다음과 같은 오류가 발생합니다.

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

싱글 유저 모드가 원인인 것 같습니다.

일반적으로 SSMS는 백그라운드에서 데이터베이스에 대한 여러 연결을 사용합니다.액세스 모드를 변경하기 전에, 다음의 접속을 절단할 필요가 있습니다.

  1. 먼저 오브젝트 탐색기가 마스터와 같은 시스템 데이터베이스를 가리키는지 확인합니다.
  2. 「」를 합니다.sp_who2'my_db'는 'my_db'로 하겠습니다. KILL { session id }는 "session id" 입니다.SPID 표시sp_who2.
  3. 셋째, 새 쿼리 창을 엽니다.

이 3단계 후에 다음 코드를 실행합니다.

-- Start in master
USE MASTER;

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

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

.KILL현재 실행 중인 모든 프로세스

다음 '보다 낫다'를 해 보세요.T-SQLMULTI_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
  1. 데이터베이스 섹션에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭합니다.
  2. [속성"
  3. "옵션" 페이지를 선택합니다.
  4. "기타 옵션" 아래로 스크롤하여 "액세스 제한" 필드를 변경합니다.

SQL 서버의 옵션 페이지 스크린샷

싱글 유저 모드를 종료하려면 , 다음의 순서에 따릅니다.

ALTER DATABASE [my_db] SET MULTI_USER

싱글 유저 모드로 되돌리려면 , 다음의 조작을 실시합니다.

ALTER DATABASE [my_db] SET SINGLE_USER

이거 작동하려고 했는데

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE

같은 문제가 발생했는데 다음 쿼리를 사용하여 session_id to kill을 찾았습니다.

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

만약 누군가가 이 스레드에 걸려든다면 싱글 유저 모드로 되어 있는SQL Server에 대한 방탄 솔루션을 다음에 나타냅니다.

-- 가 있는 ID합니다.ID(스파이드)를 취득합니다
'인 'DBName'으로.

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" 명령을 사용하여 열린 연결의 "spid"를 가져올 수도 있습니다.

-- 또는 이 SP를 대신 사용합니다.

exec sp_who

-- 그런 다음 다음을 실행하여 [spid]와 [DBName]를 올바른 값으로 바꿉니다.

KILL SpidToKillGoesHere
GO

SET DEADLOCK_PRIORITY HIGH
GO

ALTER DATABASE [DBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

CTRL + 1을 누릅니다.

데이터베이스를 잠그는 프로세스를 찾습니다.dbname 열에서 db를 찾고 spid를 확인합니다.이제 이 문장을 실행해야 합니다.

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

다음과 같은 것이 도움이 되었습니다.

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

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

  • 데이터베이스를 오프라인으로 전환합니다.SMSS에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 Take Offline을 선택한 후 'Drop all connections'를 선택합니다.
  • 달려.ALTER DATABASE [Your_Db] SET MULTI_USER

이것이 도움이 될지는 모르겠지만, 같은 문제가 있어서 저를 지연시키고 있는 프로세스를 찾을 수 없었습니다.SSMS를 닫고 로컬인스턴스에 영향을 주는 모든 서비스를 정지했습니다.그 후 다시 들어가서 exec sp_who2를 실행하자 범인이 나타났습니다.프로세스를 종료하고 Multi_User를 작동시킨 후 서비스를 재시작할 수 있었습니다.IIS가 몇 분/초마다 특정 패키지를 검색했습니다.

Jespers의 답변에 더하여 더욱 효과적입니다.

SET DEADLOCK_PRIORITY 10;-- Be the top dog.

SET DEADLOCK_PRIORITY HIGH사용하다DEADLOCK_PRIORITY5개 중 하나.

다른 프로세스가 데이터베이스에 균열이 생겨 프로세스가 더 낮은 경우DEADLOCK_PRIORITY그럼 경주에서 지게 되죠

이렇게 하면 (여러 번 수행해야 할 수도 있음) 다른 스파이드를 찾아서 죽일 필요가 없어집니다.

어쩌면 당신은 도망쳐야 할 수도 있다.ALTER DATABASE(하지만 제스퍼는 그렇게 한다.)수정된 코드:

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

이 스크립트 사용

exec sp_who

dbname 및 spid 열을 찾습니다.

지금 실행하다

kill spid 
go
ALTER DATABASE [DBName]
SET MULTI_USER;

나는 오늘 아침에 같은 문제를 우연히 만났다.그것은 간단한 문제로 판명되었다.개체 탐색기에서 단일 사용자 데이터베이스로 설정된 쿼리 창을 열었습니다.sp_who2 스토어드 프로시저에 접속이 표시되지 않았습니다.일단 닫으면, 나는 그것을 로 설정할 수 있었습니다.

오늘 같은 문제에 직면했습니다.데이터베이스가 Multi User 모드에서 Single User 모드로 변경되어 데이터베이스를 공개하지 못하게 되었습니다.

이 문제를 해결하기 위해 모든 Visual Studio 인스턴스를 닫고 SQL Server 쿼리 창에서 다음 명령을 실행해야 했습니다.

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

이 명령에 의해 DB가 Single User에서 Multi User로 변경되어 게시할 수 있게 되었습니다.

같은 문제가 발생해도 my_db에 대한 활성 연결을 찾을 수 없지만 동일한 오류가 나타납니다.서버상의 모든 데이터베이스에 대해 가능한 모든 SSMS 연결을 끊고 SSMS에서 새로운 연결을 만든 후 Multi user로 변경합니다.

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

주의: 이것은 SQL Server 2005에서 발생할 수 있는 버그인 것 같습니다.

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

이 배경의 논리는 알 수 없지만 SSMS의 버그로 보여 SQL 2012에서도 나타나고 있습니다.

사용 마스터

가세요

p.dbid = d.dbid = d.dbid에서 syspprocesses p inner join sysdatabases d에서 d.name, d.dbid, spid, loginame을 선택합니다. 여기서 d.name = '명칭'

kill 568 -- kill spid (스파이드를 죽인다)

데이터베이스 이름 변경'

MULTI_USER go 설정

언급URL : https://stackoverflow.com/questions/18965980/exit-single-user-mode

반응형