DB 계층을 보려고 할 때 "잠금 요청 시간 초과 기간이 초과되었습니다"오류


17

데이터베이스에 문제가 있습니다.

  1. 평소보다 훨씬 느리지 만 기본 쿼리를 실행할 수 있습니다.

  2. SSMS Object Explorer에서 테이블, 뷰 또는 프로 시저의 계층 구조 트리를 보려고하면을 얻습니다 lock request time out period exceeded.

  3. 이 데이터베이스의 개체에서 실행되는 SSRS 보고서가 더 이상 완료되지 않습니다.

  4. 이 데이터베이스에 저장된 프로 시저와 연관된 작업도 실행되지 않습니다.

sp_who2데이터베이스에서 모든 연결을 찾아서 종료 하려고했지만 문제가 해결되지 않았습니다.

무슨 일이야? 이 문제를 어떻게 해결할 수 있습니까?


또한보십시오 : stackoverflow.com/questions/12167570/… ; 중복으로 간주되는지 확실하지 않습니다.
LittleBobbyTables-Au Revoir

아래 답변에 대한 귀하의 의견을 바탕으로 더 많은 정보를 제공해야한다고 생각합니다. 서버의 크기는 어떻습니까? 성능 카운터를 보았습니까? 디스크로 스왑하거나 다른 방식으로 리소스가 부족한 것입니다. 아무 것도 가정하지 말고 실제로 위의 내용을 확인하십시오. 또한 데스크톱에 원격으로 연결되어있을 때 이런 일이 발생합니까? 단일 위치에서 액세스 할 때만 문제가 발생합니까? 해당 서버의 네트워크 날씨는 어떻습니까?
NotMe

3
테이블에 대한 읽기 액세스를 차단하는 열린 트랜잭션이있는 것 같습니다.
a_horse_with_no_name

답변:


11

트랜잭션의 영구 롤백으로 인해 발생했습니다. 결국 서버 클러스터를 다시 시작해야했습니다


2
서비스를 다시 시작하면 해결되었습니다.
HerrimanCoder

이러한 상황에서 다시 시작하면 데이터베이스 복구로 이어질 수 있습니다
MaazKhan47

공개 거래가 있는지 dbcc opentran이 알려줍니다
Nate Anderson

트랜잭션이 실행되는 동안 테이블 섹션을 확장 할 수 없다는 것이 이상합니다. 데이터 읽기, DDL, 테이블 목록 만 없음
gerleim 2016 년

5

Harware 고려 사항을 제외하고 SQL 세션을 보류하는 활동이 무엇인지 확인하기 위해 스크립트를 실행해야 할 수도 있습니다. 일반적인 시나리오 중 하나는 Implicit transactions OptionSQL Server Management Studio에서 를 사용하지 않는 것 입니다.


안녕 터보, 당신은 당신이 제안하는 것에 대해 더 자세히 갈 수 있습니까?

이것은 완전히 설명되지는 않았지만 더 나은 대답, 롤백하지 않는 트랜잭션의 롤백, 암시 적 트랜잭션으로 인해 활성화 된 트랜잭션의 영구 롤백 일 수 있습니다.
ConstantineK

나는 그것이 트랜잭션의 영원한 롤백이어야한다고 말할 수없는 질문을 되돌아 보았다. locking request time out period exceed내가 달리고 있다고 판단하면 implicit transaction option원인에 대한 더 나은 단서가 될 것입니다.
Turbot

도구 / 옵션 / 쿼리 실행 / SQL Server / ANSI / SET
묵시적 트랜잭션

3

tempdb가 아닌 다른 데이터베이스에서 실행되는 스크립트에서 tempdb에 테이블을 생성하는 명시 적 트랜잭션을 시작할 때이 문제가 발생했습니다. 트랜잭션을 커밋 할 때 커밋은 tempdb에서 만든 테이블의 잠금을 해제하지 않는 것 같습니다.

이 페이지 덕분에 나는 USEtempdb를 만들고 실행 DBCC OPENTRAN하여 잠금을 발생시키는 tempdb에 대한 연결의 SPID를 얻었습니다. 그럼 난 KILL <SPID number>죽일 거야

매우 우아하지는 않았고 tempdb에서 만든 테이블의 모든 정보를 잃어 버렸지 만 제 경우에는 괜찮습니다.


이 경우, COMMIT TRANSACTION 없이 SET IMPLICIT TRANSACTIONS ON 을 사용하여 DML 명령 (뷰 재정의)이 데이터베이스에 다시 발행 되어 실수로 오래 지속되는 트랜잭션이 발생했습니다. DBCC OPENTRAN을 사용하면이 문제를 신속하게 추적 할 수있었습니다.
Julio Nobre

1

제가 제공 할 수있는 모든 것은 답변을 향한 안내를위한 몇 가지 질문입니다.

  1. 서버의 DB가 SQL Server를 실행하기위한 전용입니까? 그렇지 않은 경우 다른 프로세서가 소중한 프로세서 시간을 훔쳐 간섭 할 수 있습니다.

  2. DB 서버에 본질적으로 메모리가 부족합니까? SQL Server는 가능한 모든 단일 바이트를 할당하려고 시도하지만 용량이 충분하고 쿼리에 더 많은 데이터를로드해야하는 경우 가상 메모리를 사용하여 대체해야하므로 간단한 쿼리에 걸리는 시간도 크게 늘어납니다.

  3. 적시에 데이터 전송을 처리하기 위해 DB 서버의 네트워크 대역폭이 작습니까?


하루가 끝나면 SQL Server를 호스팅하는 컴퓨터가 수행하려는 작업의 크기가 부족한 것처럼 들립니다. 성능이 급격히 떨어지는 하드웨어 한계에 도달했을 가능성이 있습니다. 이 경우 (위의 질문이이를 판단하는 데 도움이 될 것입니다.) 처리하려는 데이터 (및 쿼리)의 크기에 따라 적절한 크기의 서버로 DB를 이동해야합니다.

이는 더 빠른 프로세서, 더 빠른 드라이브 사용 또는 더 많은 RAM 설치를 의미 할 수 있습니다.


하드웨어 문제가 아닙니다. 서버 클러스터는 여러 데이터베이스를 호스팅합니다. 이 데이터베이스는 문제가있는 유일한 데이터베이스입니다

@LloydBanks : 이것이 하드웨어 문제가 아님을 의미하지는 않습니다. 트랜잭션 속도가 20GB이고 트랜잭션 속도가 1GB 인 데이터베이스가 2 개인 경우 1GB 데이터베이스가 가상 메모리로 교체 될 것으로 예상됩니다. 쿼리 시간이 늘어납니다. 20GB db가 충분히 강해지면 작은 크기의 연결 문제가 발생할 수 있습니다.
NotMe

1

"SSMS 개체 탐색기에서 테이블, 뷰 또는 프로 시저의 계층 구조 트리를 보려고하면 잠금 요청 시간 초과 기간이 초과되었습니다."

나는 정확히 같은 문제가 있었다. 쿼리 실행 창으로갔습니다. 입력하고 실행 한 ROLLBACK명령문.

그 전에 내가 실행 한 일련의 진술 중 일부가 열린 거래를 유지 한 것처럼 보입니다. 특히 DDL 문이있는 곳도 있기 때문입니다. 롤백을 실행하면 객체 계층이 작동하기 시작했습니다.


0

많은 사람들이 이미 지적했듯이, 일반적으로 오래 지속되는 트랜잭션이 있는데, 대부분 내가 놓친 SET IMPLICIT TRANSACTIONS ON을 사용했기 때문에 전혀 사용해서는 안됩니다. Brent Ozar의 통찰력 기사 를 확인하는 이유를 보려면

어쨌든 다음 쿼리를 사용하여 오래 지속되는 보류 트랜잭션 목록을 얻을 수 있습니다.

SELECT
    [s_tst].[session_id],
    [s_es].[login_name] AS [Login Name],
    DB_NAME (s_tdt.database_id) AS [Database],
    [s_tdt].[database_transaction_begin_time] AS [Begin Time],
    [s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
    [s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
    [s_est].text AS [Last T-SQL Text],
    [s_eqp].[query_plan] AS [Last Plan]
FROM
    sys.dm_tran_database_transactions [s_tdt]
JOIN
    sys.dm_tran_session_transactions [s_tst]
ON
    [s_tst].[transaction_id] = [s_tdt].[transaction_id]
JOIN
    sys.[dm_exec_sessions] [s_es]
ON
    [s_es].[session_id] = [s_tst].[session_id]
JOIN
    sys.dm_exec_connections [s_ec]
ON
    [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN
    sys.dm_exec_requests [s_er]
ON
    [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY
    sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY
    sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
where [s_tdt].[database_transaction_begin_time] is not null
ORDER BY
    [Begin Time] ASC;

https://www.brentozar.com/archive/2018/02/set-implicit_transactions-one-hell-bad-idea/

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