MYSQL 실행 중인 쿼리 중지 방법

용량이 큰 테이블을 쿼리하는 건 종종 위험합니다. 쿼리 성능이 받쳐주지 않는 환경에서 오랜 기간 쿼리가 끝나지 않고 이어지다 보면 리소스를 많이 잡아먹고, 최악의 경우 시스템이 다운될 가능성도 충분하기 때문입니다. 이를 방지하기 위해 쿼리가 너무 오래 지속된다 싶으면 즉각 중단시킬 필요가 있습니다.

실행 중인 쿼리 강제 중지

두 가지 명령을 사용합니다. 먼저 현재 실행 중인 쿼리를 찾는 명령입니다.

SHOW PROCESSLIST;
-- 또는 SHOW FULL PROCESSLIST;
-- SHOW FULL PROCESSLIST는 더 자세한 정보를 보여줍니다.

 

여기서 확인되는 실행 쿼리와 해당 프로세스의 ID를 확인해서 KILL 시킵니다.

KILL [쿼리 ID];

 

예를 들어, 프로세스 ID가 3이면 다음과 같이 명령합니다. KILL을 할 때는 잘못된 프로세스를 중지시키지 않도록 주의하세요.

KILL 3;

 

※ 쿼리 중지 대비 시 주의사항

문제가 되는 쿼리를 중단시키려고 대비할 때는 꼭 새로운 세션을 미리 열어두는 걸 추천합니다. DB는 세션 단위로 실행되기 때문에 쿼리를 시작한 세션에서는 중간에 다른 쿼리를 할 수 없습니다. 그래서 다른 세션을 열어서 작업을 해야 합니다. 쿼리에 문제가 있다고 판단될 때 다른 세션을 열어서 쿼리 중지 작업을 시작할 수도 있겠지만, 그때 DB 연결 툴 자체가 버벅거릴 가능성이 있습니다.

 

예시)

1. 테이블에 락이 걸리는 상황을 만들고 락이 걸린 쿼리를 중지해보겠습니다. 트랜잭션을 시작하고 commit 하지 않은 채로 다른 세션에서 쿼리를 날리는 방법을 쓰면 됩니다.

START TRANSACTION;
UPDATE test_lock SET value = 'Updated' WHERE id = 1;

 

트랜잭션 시작

 

2. 두 번째 세션에서 동일한 테이블에 update 쿼리를 실행합니다. 첫 번째 트랜잭션이 아직 끝나지 않았기 때문에 이 쿼리는 락에 걸리면서 쿼리 수행 시간이 계속 길어집니다.

UPDATE test_lock SET value = 'Updated again' WHERE id = 1;

 

락 쿼리

 

3. 세 번째 세션으로 가서 수행 중인 쿼리를 확인합니다. 그리고 문제가 되는 쿼리를 kill 합니다.

SHOW FULL PROCESSLIST;

 

show full processlist

 

KILL 6

 

kill

반응형

댓글

Designed by JB FACTORY