“데이터베이스가 전환 중입니다”오류


12

오늘은 기존 데이터베이스를 통해 데이터베이스를 복원하려고했습니다 .SSMS에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭 한 다음 작업-> 오프라인 상태로 전환하면 데이터베이스를 복원 할 수 있습니다.

작은 팝업 창이 나타나서 Query Executing.....언젠가 보여준 다음 오류가 발생했습니다 Database is in use cannot take it offline. 내가 수집 한 데이터베이스에 대한 활성 연결이 있으므로 다음 쿼리를 실행하려고했습니다.

USE master
GO
ALTER DATABASE My_DatabaseName
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO

이 시점에서 SSMS는 Query Executing.....언젠가 보여준 후 다음과 같은 오류가 발생했습니다.

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

이 후 SSMS를 통해 데이터베이스에 연결할 수 없습니다. 그리고 SSMS를 사용하여 오프라인으로 만들려고 할 때 오류가 발생했습니다.

Database is in Transition. Try later .....

이 시점에서 나는 동일한 오류 메시지를 반환하려고 시도한 데이터베이스를 만질 수 없었습니다 Database is in Transition.

Google에서 사람들이 비슷한 문제에 직면했을 때 몇 가지 질문을 읽었으며 SSMS를 닫고 다시 열 것을 권장했습니다. 그렇습니다. 개발 서버이기 때문에 SSMS를 사용하여 데이터베이스를 삭제하고 새 데이터베이스로 복원했습니다.

내 질문은 무엇이 이것을 일으킬 수 있었을까요? 미래에 이런 일이 발생하지 않도록하는 방법과 미래에 같은 상황에 처하게되면 다른 방법으로 수정하고 전체 데이터베이스를 삭제하는 다른 방법이 있습니까 ???

감사합니다

답변:


24

재현

  1. SSMS를여십시오
  2. 새 쿼리 창에 다음을 입력하십시오

    use <YourDatabase>;
    go
  3. 객체 탐색기 (SSMS)로 이동하여 마우스 오른쪽 버튼으로 클릭 <YourDatabase>-> Tasks->Take Offline
  4. 두 번째 새 쿼리 창을 열고 다음을 입력하십시오.

    use <YourDatabase>;
    go

다음과 같은 메시지가 나타납니다.

메시지 952, 수준 16, 상태 1, 줄 1
데이터베이스 'TestDb1'이 전환 중입니다. 나중에 진술을 시도하십시오.

이런 일이 발생하는 이유는 아래의 것과 유사한 진단 쿼리에서 찾을 수 있습니다.

select
    l.resource_type,
    l.request_mode,
    l.request_status,
    l.request_session_id,
    r.command,
    r.status,
    r.blocking_session_id,
    r.wait_type,
    r.wait_time,
    r.wait_resource,
    request_sql_text = st.text,
    s.program_name,
    most_recent_sql_text = stc.text
from sys.dm_tran_locks l
left join sys.dm_exec_requests r
on l.request_session_id = r.session_id
left join sys.dm_exec_sessions s
on l.request_session_id = s.session_id
left join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) st
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) stc
where l.resource_database_id = db_id('<YourDatabase>')
order by request_session_id;

가치있는 것을 위해이 오류를 재현하기 위해 객체 탐색기가 필요하지 않습니다. 동일한 작업을 시도하는 차단 된 요청이 필요합니다 (이 경우 데이터베이스를 오프라인으로 전환). T-SQL의 세 단계에 대해서는 아래 스크린 샷을 참조하십시오.

여기에 이미지 설명을 입력하십시오

가장 가능성이 높은 것은 Object Explorer 세션이 다른 세션 (으로 표시됨)에 의해 차단 된 것 blocking_session_id입니다. 해당 오브젝트 탐색기 세션이 X데이터베이스에서 독점 잠금 ( ) 을 얻으려고 합니다. 위의 재현의 경우, Object Explorer 세션에 업데이트 잠금 ( U) 이 부여 되고 독점 잠금 ( X) 으로 변환하려고 시도했습니다 . LCK_M_X첫 번째 쿼리 창 ( 데이터베이스에서 use <YourDatabase>공유 잠금 ( S)을 가져옴) 으로 표시된 세션에 의해 차단 된 wait_type이입니다 .

그런 다음이 오류는 다른 세션에서 잠금을 시도하여 발생 했으며이 오류 메시지로 인해 세션이 거부되어 다른 상태 (이 경우 온라인 상태)로 전환하려는 데이터베이스에 액세스 할 수 없습니다 오프라인 전환으로).

다음에 무엇을해야합니까?

첫째로, 당황하지 않는데이터베이스를 놓기 시작되지 않습니다 . 현재 보고있는 이유를 확인 하려면 문제 해결 방법 (위와 유사한 진단 쿼리 사용)을 수행 해야합니다. 이와 같은 메시지가 나타나거나 무언가가 "멈춤"으로 나타나면 동시성 부족을 자동으로 가정하고 블로킹을 시작하십시오 ( sys.dm_tran_locks좋은 시작입니다).

부수적으로, 나는 당신이 임의의 행동을 취하기 전에 문제의 근원을 알아내는 것이 최선이라고 믿는다. 이 작업뿐만 아니라 예상치 못한 모든 동작에 적용됩니다. 실제로 문제의 원인을 알면 실제로 큰 문제가 아니 었습니다. 기본적으로 블로킹 체인이 있었고 부모 블로커는 방금 발행했을 가능성이 높 KILL거나 세션 요청이 원하지 않는 KILL경우 완료 될 때까지 기다릴 수 있습니다. 어느 쪽이든, 특정 시나리오 (롤백 또는 커밋 대기)가 주어지면 옳고 신중한 결정을 내릴 수있는 지식이 있어야합니다.

주목할만한 또 다른 점은 이것이 GUI 대신 항상 T-SQL 대안을 선택하는 이유 중 하나입니다. T-SQL로 실행중인 작업과 SQL Server가 수행중인 작업을 정확히 알고 있습니다. 결국, 명시 적 명령을 발행했습니다. GUI를 사용하면 실제 T-SQL은 추상화가됩니다. 이 경우 차단 된 개체 탐색기가 데이터베이스를 오프라인 상태로 만들려는 시도를 살펴 보았습니다 ALTER DATABASE <YourDatabase> SET OFFLINE. 롤백 시도가 없었기 때문에 무기한 대기 중이었습니다. 귀하의 경우, 해당 데이터베이스에서 잠금이있는 세션을 롤백하려면 롤백 ALTER DATABASE ... SET OFFLINE WITH ROLLBACK IMMEDIATE이 양호하다는 초기 결정을 내린 경우에 충분했을 것입니다.



0

아무것도 할 필요가 없습니다. SqLWB.exe작업 관리자 에서 프로세스를 종료 하고 SQL Server를 열고 데이터베이스를 마우스 오른쪽 버튼으로 클릭하여 오프라인으로 만드십시오. 작동하지 않으면 세션이 종료 된 후 명령을 입력하십시오.

ALTER DATABASE [Test4] SET OFFLINE WITH ROLLBACK IMMEDIATE

그런 다음 오프라인 상태입니다. 그것은 나를 위해 일 한대로 작동합니다.

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