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

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

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.

내가 뭘 잘못하고 있죠?



답변

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

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/


답변

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

연결 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;


답변

“전환 중”인 경우 이것을 시도하십시오 …

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


답변

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

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

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

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

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


답변

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

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

HTH!


답변

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


답변

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

ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE

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

ALTER ANY DATABASE

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