Computer Engineering/DB(DataBase)

MySQL kill 명령어 (프로세스 kill하기)

jordan.bae 2022. 11. 22. 23:30

MySQL kill 명령어

KILL [CONNECTION | QUERY] processlist_id

MySQL kill command는 실행 중인 쿼리 or 커넥션을 종료시기키 위해 사용되는 명령어입니다.

주로 문제를 발생시킬 수 있는 long query를 show full processlist 명령어로 찾은 후 종료시킬 때 사용됩니다.

주로 모니터링 및 장애시 사용되는 커맨드입니다.

 

MySQL kill 명령어 옵션 및 권한

KILL명령어의 옵션에는 CONNECTION 또는 QUERY가 있다.

  • KILL CONNECTION은 수식어가 없는 KILL과 같다. 이것은 connection에서 실행중인 statement를 종료시킨 후에 proocess_id에 해당하는 connection를 종료시킨다.
  • KILL QUERY statement는 connection에서 실행중인 statement를 종료시킨다. 그러나 connection자체는 그대로 유지한다.

 

Process 권한에 따라서 볼 수 있는 thread의 범위가 결정된다.

  • without PROCESS → 자신의 thread들만 볼 수 있다.
  • with PROCESS → 모든 thread들을 볼 수 있다.

SUPER 권한에 따라서 kill 할 수 있는 thread의 범위가 결정된다.

  • Without SUPER, 자신의 thread와 statement만 죽일 수 있다.
  • With SUPER, 모든 thread들과 statements를 죽일 수 있다.
Note

MySQL에 내장된 library는 host의 응용 프로그램의 스레드에서만 실행되므로 kill할 수 없다. 그것들은 자체 연결 스레드를 생성하지 않는다.

 

MySQL kill 커맨드 동작

KILL 명령어를 사용할 때, 스레드 별로 kill flag가 설정된다. 대부분의 경우 kill flag는 특정 간격으로만 확인되기 때문에 스레드가 죽는 데 시간이 걸릴 수 있다.

  • SELECT 작업 중에 ORDER BY 및 GROUP BY 루프의 경우 row block을 읽은 후 플래그가 check되어진다. 만약 kill flag가 set되어 있으면, statement는 중단된다(aborted).
  • 테이블 복사를 만드는 ALTER TABLE 작업은 원래 테이블에서 일정 row들을 복사하는 동안 주기적으로 체크되어진다. kill flag가 설정된 경우 문장이 중단되고 임시 테이블이 삭제된다.

KILL statement는 확인을 기다리지 않고 반환되지만, kill flag check는 적은 시간 내에 동작을 종료 시킨다. 필요한 정리를 수행하기 위해 작업을 중단하는 것도 시간이 걸립니다.

  • update, delete 동작 중에는 kill flag는 각 block을 읽은 후에 업데이트 혹은 삭제 후에 체크가 진행진다. 만약 kill flag가 set되어 있으면, 해당 statement는 종료된다. 만약 transaction을 사용하지 않는 경우 변경 내용이 roll back되지 않는다.
  • GET_LOCK()의 경우 중단되고 NULL을 반환한다.
  • INSERT DELAYED thread는 메모리에 있는 모든 rows를 빠르게 insert하고 종료한다.
  • 만약 thread가 table lock handler에 있다면(state=Locked), 테이블 잠금이 빠르게 중단된다.
  • 스레드가 쓰기 호출에서 사용 가능한 디스크 공간을 기다리는 경우 "disk full" 오류 메시지와 함께 쓰기가 중단된다.

 

Reference

https://dev.mysql.com/doc/refman/5.6/en/kill.html

반응형