MySQL 실행 중인 쿼리 중지하기
MySQL에서 오래 실행되거나 멈춰 버린 쿼리를 중지해야 할 때가 있습니다. 이럴 때는 KILL 명령어에 프로세스 ID를 지정하여 해당 쿼리를 강제로 종료할 수 있습니다.
1. 기본 문법
프로세스 ID를 사용해 쿼리를 종료하는 기본 문법은 다음과 같습니다.
kill processId;
또는 RDS 환경 등에서 아래와 같은 저장 프로시저를 호출하여 실행 중인 쿼리를 중지할 수도 있습니다.
call mysql.rds_kill(queryId);
2. 프로세스 ID 확인하기
쿼리를 종료하려면 먼저 대상 프로세스의 ID를 알아야 합니다. SHOW PROCESSLIST 명령으로 현재 실행 중인 모든 프로세스 목록을 확인할 수 있습니다.
mysql> show processlist;
위 명령을 실행하면 다음과 같이 현재 MySQL에서 동작 중인 프로세스 목록이 출력됩니다.
+----+-----------------+-----------------+----------+---------+--------+------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-----------------+-----------------+----------+---------+--------+------------------------+------------------+ | 4 | event_scheduler | localhost | NULL | Daemon | 221718 | Waiting on empty queue | NULL | | 47 | root | localhost:60722 | business | Query | 0 | starting | show processlist | +----+-----------------+-----------------+----------+---------+--------+------------------------+------------------+ 2 rows in set (0.03 sec)
위 결과를 보면 현재 두 개의 프로세스가 실행 중입니다. 이 중 특정 프로세스를 중지하고 싶다면, 해당 프로세스의 Id 값을 확인한 뒤 KILL 명령어에 지정하면 됩니다.
3. KILL 명령어로 쿼리 종료하기
ID가 47인 프로세스를 종료하는 예시는 다음과 같습니다.
mysql> kill 47; ERROR 1317 (70100): Query execution was interrupted
명령이 성공적으로 실행되면 해당 연결의 쿼리 실행이 중단되며, 클라이언트 쪽에는 위와 같이 "쿼리 실행이 중단되었습니다"라는 에러 메시지가 표시됩니다.
4. mysql.rds_kill() 사용하기
대안으로 mysql.rds_kill() 프로시저를 호출하여 동일한 작업을 수행할 수 있습니다.
mysql> CALL mysql.rds_kill(47); ERROR 2013 (HY000): Lost connection to MySQL server during query
이 경우 대상 세션의 연결 자체가 종료되므로, 클라이언트에는 "쿼리 실행 중 서버와의 연결이 끊어졌습니다"라는 메시지가 나타납니다.
정리
MySQL에서 실행 중인 쿼리를 중지하는 절차는 다음과 같습니다.
① SHOW PROCESSLIST로 프로세스 ID를 확인한다.
② KILL 프로세스ID; 또는 CALL mysql.rds_kill(프로세스ID);를 실행한다.
이 방법을 활용하면 비정상적으로 길게 실행되는 쿼리나 데드락 상태의 세션을 신속하게 정리하여 데이터베이스 성능을 유지할 수 있습니다.