달력

10

« 2024/10 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2009. 4. 15. 10:57

KILL UOW Who&What2009. 4. 15. 10:57

KILL을 처음 접했을 때 '죽인다는 표현을 꼭 썼어야 했을까?'라는 의구심을 갖었었다. 지금은 'KILL이 없으면 서비스를 재시작해야 하나?' 라는 반문 때문에 감사하며 쓰고 있다. 하지만, KILL로도 죽지 않는 생명력 강한 트랜잭션 있으니, 분리된(orphaned) 분산 트랜잭션이 바로 여기에 속한다. 관리자의 입장에서 보면 이러한 분산트랜잭션은 아주 골치가 아닐 수 없다. 그렇다면 해결책은 무엇인가? 그렇다. 재시작하면 깔끔히 사라진다. :-), 재시작없이 해당 세션을 종료할 수 있는 방법을 소개하려는 것이 이 글의 목적이다.

[문제]
사용되지 않는 분리된 분산트랜잭션용 세션(SPID=-2)이 sysprocesses에서 확인되었다. 서비스 재시작없이 이 세션을 종료시키고자 한다.

[해결]
다음 절차에 따라 분리된 분산트랜잭션을 KILL 시킬 수 있다.

1) 분리된 분산트랜잭션 확인
분리된 분산트랜잭션은 실제 세션ID에 연결되어 있지 않고 인위적으로 -2라는 값을 갖는다.
select * from sys.dm_exec_sessions WHERE Session_ID = '-2';

or

MS DTC 트랜잭션이 분리된 여부를 확인하려면 다음 문을 실행할:
SELECT DISTINCT(req_transactionUOW) FROM sys.syslockinfo WHERE req_spid = -2
MS DTC 트랜잭션이 분리된 경우 이 문은 MS DTC 트랜잭션 (UOW) 작업 단위를 반환합니다

2) 분리된 분산트랜잭션의 작업단위(UOW:Unit Of Worker) 확인
UOWsys.dm_tran_locks 동적 관리 뷰의 request_owner_guid 열에서 가져올 수 있는 GUID이다.
select request_owner_guid, * from sys.dm_tran_locks where request_session_id = '-2';

3) KILL UOW
분산트랜잭션이 아닌 경우 UOW값은 00000000-0000-0000-0000-000000000000 으로 나타난다.
다음은 UOW값을 'D5499C66-E398-45CA-BF7E-DC9C194B48CF'라고 가정하고 KILL하는 예이다.
KILL 'D5499C66-E398-45CA-BF7E-DC9C194B48CF'

또는 구성 요소 서비스(dcomcnfg)에서도 미결 분산트랜잭션을 종료할 수 있다.
"관리도구 - 구성 요소 서비스 - 내 컴퓨터 - 분산 트랜잭션 코디네이터 - 트랜잭션 목록"까지 선택 후,
오른쪽 화면의 목록 중 "작업 ID 단위"값이 위에서 확인한 UOW 값과 같은 분산 트랜잭션을 확인한다.
해당 분산 트랜잭션에서 오른 클릭 후 "해결"메뉴에서 "커밋:중단:무시" 중 "중단" 선택

[참조]
1. KILL (SQL Server 2005 BOL)
http://support.microsoft.com/kb/954669
[유사Fix]
FIX: An ongoing MS DTC transaction is orphaned in SQL Server 2005
http://support.microsoft.com/?id=949075

2. 특정 세션ID 롤백되고 있는 경우에 진행율 확인하기
세션ID 54를 KILL하여 롤백중인 상태라면 다음과 같이 확인 가능하다
KILL 54 WITH STATUSONLY;

3. 특정 SPID에 대해 롤백이 진행 중인 경우 특정 SPID에 대한 sp_who 결과 집합의 cmd 열에 KILLED/ROLLBACK이 표시된다.

4. SQL Server 2000에서는 다음과 같이 syslockinfo의 req_transactionUOW컬럼각으로 UOW를 확인한다.
select req_transactionUOW, * from master..syslockinfo where req_spid='-2'

:
Posted by 에너지발전소