데이터베이스에 잠금을 설정할 수 없으므로 ALTER DATABASE가 실패했습니다.


124

일부 프로세스가 작동하지 않기 때문에 데이터베이스를 다시 시작해야합니다. 내 계획은 오프라인으로 전환했다가 다시 온라인으로 전환하는 것입니다.

Sql Server Management Studio 2008에서이 작업을 수행하려고합니다.

use master;
go
alter database qcvalues
set single_user
with rollback immediate;
alter database qcvalues
set multi_user;
go

다음과 같은 오류가 발생합니다.

Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Msg 5061, Level 16, State 1, Line 4
ALTER DATABASE failed because a lock could not be placed on database 'qcvalues'. Try again later.
Msg 5069, Level 16, State 1, Line 4
ALTER DATABASE statement failed.

내가 뭘 잘못하고 있죠?


처음에 이러한 요구를 유발 한 문제는 무엇입니까? 현재 롤백 트랜잭션이 있습니까? 또한 아직 열려있을 수있는 다른 SSMS 창에서이 명령을 이미 실행 했습니까? 나는 그것이 다른 시도를 차단하는 잠금을 취할 수 있는지 궁금하지만 (순수한 추측) 데이터베이스가 실제로 single_user 모드로 들어갈 수 있기 전에 여전히 기다리고 있습니다.
Martin Smith

1
@Martin-충분히 공평합니다. 나는 다른 것을 생각하거나 정신을 잃어야합니다. 어느 쪽이든 가능합니다
codingbadger 2011 년

@thank 당신은 매우 많은 사람, 내가 SSMS를 다시 시작하고 모두 죽일 수 있었다
JOE 스키트

지능적 일 수 있습니다. 데이터베이스에 액세스하려는 구불 구불 한 선이있는 불완전한 쿼리를 삭제 한 후 작동했습니다.
Faahmed 2014 년

답변:


293

오류가 발생하면 다음을 실행하십시오.

EXEC sp_who2

목록에서 데이터베이스를 찾으십시오. 연결이 종료되지 않았을 수 있습니다. 데이터베이스에 대한 연결을 찾으면 다음을 실행하십시오.

KILL <SPID>

여기서는 <SPID>데이터베이스에 연결된 세션의 SPID입니다.

데이터베이스에 대한 모든 연결이 제거 된 후 스크립트를 시도하십시오.

안타깝게도 문제가 발생한 이유는 모르겠지만 다른 곳에서 문제가 발생했음을 보여주는 링크가 있습니다.

http://www.geakeit.co.uk/2010/12/11/sql-take-offline-fails-alter-database-failed-because-a-lock-could-not-error-5061/


명령에 의해 연결이 종료되지 않는 이유에 대한 설명을 제공 할 수 있습니까? 제가 생각할 수있는 유일한 이유는 아직 롤백 중이거나 set single_user아직 보류중인 시도 때문일 것입니다 .
Martin Smith

@Martin, 나는 이것에 대한 이유가 없습니다. 그러나 다른 사람들이 문제를 보았 음을 나타내는 링크를 추가하겠습니다. 트랜잭션 롤백이 문제가 될 수 있다는 데 동의하지만 문제도 KILL해결되지 않습니다.
bobs

왜 이런 일이 발생하는지 이해하는 것이 좋지만 귀하의 링크에 대한 의견은 그것이 효과가 있음을 나타내는 것 같습니다! (+1)
Martin Smith

KILL (87) 결과 Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('..... 음
팀 아벨

2
@MartinSmith 나는 그 이유를 알고 있다고 생각합니다. 나는 방금 같은 문제가 있었고 sp_who2 아래에 느린 연결이 나타나 오프라인 상태가 중단되었습니다. 그것은 ssms에서 열린 편집 행 창으로 밝혀졌습니다. 여기서 일어나는 일은 편집 행 창이 편집 가능한 결과 세트로 열린 쿼리라는 것입니다. SQL Server에는 문을 업데이트하는 대신 이러한 기능이 있습니다. 이 특정 ssms 창을 닫으면 중단이 즉시 완료됩니다.
John

5

다음을 수행하여이 오류를 재현했습니다.

연결 1 (몇 분 동안 계속 실행)

CREATE DATABASE TESTING123
GO

USE TESTING123;

SELECT NEWID() AS X INTO FOO
FROM sys.objects s1,sys.objects s2,sys.objects s3,sys.objects s4 ,sys.objects s5 ,sys.objects s6

연결 2 및 3

set lock_timeout 5;

ALTER DATABASE TESTING123 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

2

"전환 중"인 경우 이것을 시도하십시오 ...

http://learnmysql.blogspot.com/2012/05/database-is-in-transition-try-statement.html

USE master
GO

ALTER DATABASE <db_name>

SET OFFLINE WITH ROLLBACK IMMEDIATE
...
...
ALTER DATABASE <db_name> SET ONLINE

데이터베이스가 전환 중일 때 작동하지 않습니다 SET OFFLINE. OP에서 언급 한 것과 동일한 오류가 발생 합니다 (아마도 작동하는 시나리오가있을 수 있지만 저에게는 그렇지 않았습니다)
Abel

1

누군가 나만큼 운이 좋을 경우를 대비하여 여기에 추가하겠습니다.

sp_who2 프로세스 목록을 검토 할 때 영향을받는 데이터베이스뿐만 아니라 master에 대해서도 실행되는 프로세스를 확인합니다 . 제 경우에는 데이터베이스를 차단하는 문제가 xp_cmdshell을 시작한 저장 프로 시저와 관련이있었습니다.

마스터 데이터베이스에 대한 KILL / RollBack 상태의 프로세스가 있는지 확인하십시오.

SELECT *
FROM sys.sysprocesses
WHERE cmd = 'KILLED/ROLLBACK'

동일한 문제가있는 경우 KILL 명령만으로는 도움이되지 않을 것입니다. SQL 서버를 다시 시작하거나 더 나은 방법은 SQL 서버 OS의 Windows 프로세스에서 cmd.exe를 찾아서 종료하는 것입니다.


0

SQL Management Studio에서 보안-> 로그인으로 이동하고 로그인을 두 번 클릭합니다. 왼쪽 열에서 서버 역할을 선택하고 sysadmin이 선택되었는지 확인합니다.

제 경우에는 해당 권한이없는 계정으로 로그인했습니다.

HTH!


1
원래 질문의 오류는 귀하가 SA 일 때도 발생하며 귀하의 권리와 관련이 없습니다. 권한이 충분하지 않으면 오프라인 명령을 실행할 수 없습니다.
Abel

0

프로세스 ID를 죽이는 것은 나를 위해 잘 작동했습니다. 새 쿼리 창에서 "EXEC sp_who2"명령을 실행하고 "사용 중"데이터베이스에 대한 결과를 필터링 할 때 "KILL"명령으로 프로세스를 죽이는 것이 트릭을 수행했습니다. 그 후 모든 것이 다시 작동했습니다.


0

2 센트 만 더하면됩니다. 문을 성공적으로 실행하기 위해 db 로그인에 필요한 최소 권한을 검색하는 동안 동일한 상황에 처했습니다.

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

sysadmin 로그인으로 실행 하면 ALTER 문이 성공적으로 완료되는 것처럼 보이지만 다음과 같이 제한된 권한이있는 로그인으로 실행될 때 연결 정리 부분이 필요합니다.

ALTER ANY DATABASE

추신 : dbcreator 역할 + ALTER ANY DATABASE 권한 이있는 로그인에서 실행할 때 "ALTER DATABASE .."가 작동하지 않는 이유를 알아 내려고 몇 시간을 보냈습니다 . 여기 내 MSDN 스레드가 있습니다 !


0

나는 이것이 오래된 게시물이라는 것을 알고 있지만 최근에 매우 유사한 문제에 직면했습니다. 불행히도 독점 잠금을 설정할 수 없기 때문에 alter database 명령을 사용할 수 없었습니다. 하지만 db에 대한 열린 연결을 찾을 수 없었습니다. 결국 데이터베이스의 상태를 강제로 삭제하여 복구가 아닌 복원 상태로 전환해야했습니다.


0

드문 경우 (예 : 무거운 트랜잭션이 커밋 된 후) 데이터베이스 파일에 대한 FILE 잠금을 유지하는 실행중인 CHECKPOINT 시스템 프로세스가 MULTI_USER 모드로의 전환을 방지합니다.


0

내 시나리오에서는 sp_who2에서 데이터베이스를 차단하는 프로세스가 없습니다. 그러나 보류중인 프로세스가 여전히 실행중인 다른 데이터베이스보다 데이터베이스가 훨씬 크기 때문에 일시 중지 된 데이터베이스를 마우스 오른쪽 단추로 클릭하여 '데이터 재개'를 시도한 후에도 가용성 그룹 아래의 데이터베이스가 여전히 빨간색 / 오프라인으로 표시된다는 사실을 발견했습니다.

아직 실행중인 프로세스가 있는지 확인하려면 다음 명령을 실행하십시오. sys.dm_exec_requests에서 완료율을 선택하십시오. 여기서 percent_complete> 0

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