MSSQL 실행 중인 쿼리 확인 및 종료 방법

SQL Server은 쿼리를 실행하면 이를 위한 세션이 생성되고 해당 세션은 고유의 SPID를 갖고 동작합니다. 윈도우에서 프로세스별로 PID를 갖는 것과 비슷합니다. 때문에 어떤 쿼리가 어떤 SPID에서 동작하고 있는지 확인하면 kill 명령어로 해당 쿼리를 죽일 수 있습니다.

 

이 과정은 sp_who2 → dbcc inputbuffer( spid ) → kill [spid] 명령 순으로 진행합니다. 하나씩 보겠습니다.

SQL Server 실행 쿼리 확인 및 중지

sp_who2

SQL Server에서 sp_who2 명령어를 사용하면 활성화된 세션 정보를 볼 수 있습니다. 이 정보를 기반으로 어떤 작업이 진행 중인지, 블로킹이 발생하고 있는 세션이 있는지 등을 파악할 수 있습니다. DB 서버에 부하가 발생하고 있다면 이 명령어로 체크해 보면 좋습니다.

 

[사용 구문]

sp_who2

 

컬럼명 설명
SPID Server Process ID. 각 세션 또는 연결의 고유 번호.
Status 세션의 상태 (예: RUNNING, SLEEPING, SUSPENDED 등).
Login 연결된 사용자의 로그인 이름.
HostName 연결된 클라이언트의 호스트 이름.
BlkBy 현재 세션을 블로킹하는 다른 세션의 SPID. "BlkBy"는 "Blocked By"의 줄임말.
DBName 현재 사용 중인 데이터베이스 이름.
Command 현재 세션에서 실행 중인 SQL 명령의 유형 (예: SELECT, UPDATE).
CPUTime 현재 쿼리가 사용한 CPU 시간 (밀리초).
DiskIO 현재 쿼리가 발생시킨 디스크 I/O의 양.
LastBatch 마지막 쿼리 또는 명령이 시작된 시간.
ProgramName 연결을 초기화한 클라이언트 응용 프로그램의 이름.
REQUESTID 병렬 쿼리의 각 요청에 대한 ID.

 

dbcc inputbuffer( spid )

DBCC INPUTBUFFER는 SQL Server에서 특정 세션에서 마지막으로 실행된 쿼리가 무엇인지 알려줍니다. sp_who2로 문제가 있는 세션을 확인하고 그 세션의 쿼리 정보를 자세히 보기 위해 dbcc inputbuffer( spid )를 사용합니다.

 

[사용 구문]

dbcc inputbuffer( spid )

 

kill [spid]

kill은 특정 spid를 가진 세션을 강제로 종료하는 기능입니다. 문제가 있는 세션이 발견되면 kill로 강제 종료할 수 있습니다.

 

[사용 구문]

kill [spid]

 

예시)

테이블에 임의로 락을 걸고 쿼리를 확인 및 종료하는 예제를 해보겠습니다.

 

1. 락 발생 쿼리 실행

트랜잭션을 시작하면 종료 전까지는 테이블에 락이 걸리는 점을 이용하겠습니다.

BEGIN TRANSACTION; -- 트랜잭션 시작

UPDATE sample_table
SET name = 'Updated_Item1'
WHERE id = 1;

 

트랜잭션 시작 쿼리

 

 

2. 새로운 쿼리 창 열고 쿼리 실행

다른 세션을 써야하기 때문에 새로운 쿼리 창을 열고 쿼리를 수행합니다. 테이블 락이 걸려있기 때문에 실행하지 못하는 걸 확인할 수 있습니다.

UPDATE sample_table
SET name = 'Blocked_Item1'
WHERE id = 1;

 

3. 블로킹 확인 및 종료

다시 새 쿼리 창을 열고 세션을 확인합니다. BlkBy 컬럼에 값이 있으면 블로킹이 발생했다는 의미입니다.

EXEC sp_who2

 

sp_who2 결과값

 

해당 세션의 spid를 확인합니다.

DBCC INPUTBUFFER(149)

 

inputbuffer

 

블로킹이 발생한 세션을 종료합니다.

kill 149

 

kill 149

반응형

댓글

Designed by JB FACTORY