mysql 오래 걸리는 query 죽이기 및 sleep 프로세스 죽이기

STEVELOPER·2022년 10월 7일
0

MySQL

목록 보기
2/3

mysql 을 사용하다가 too many connections 로 더 이상 database 로 부터 query 를 못하는 에러가 발생했다.
mysql 터미널에 접속해서 show processlist; 커맨드로 프로세스들의 상태를 보니
몇천초 동안 끝나지 않은 쿼리들이 여럿 발견되었다. 이 쿼리들이 해소되지 않고 계속해서 쌓여서 발생한 에러였다.
해당 쿼리를 직접 실행해보니 오랫동안 돌 뿐 결과가 나오지 않았다.
대상 table 의 수가 워낙 많고 쿼리가 indexing 문제인지 한참 걸렸기 때문인것으로 보인다.
원래는 해당 쿼리를 수정해서 쿼리가 빨리 되도록 하는것이 정론이지만 고치기 전까지 서버가 일을 못하는 것이 더 큰 문제였기에 해당 쿼리를 특정 시간까지 완료되지 않는다면 죽이는 조치를 했다.

본론

터미널에서 mysql 로 접속한다.

mysql -u root -p

접속한 뒤 두가지 설정을 한다.
목적은 두가지로,

  1. 오래 걸리는 쿼리를 강제종료
  2. sleep 상태인 프로세스를 강제종료

1.오래 걸리는 쿼리를 강제 종료 하려면 mysql 의 설정중 MAX_EXECUTION_TIME 을 설정하면 된다.

mysql> set global MAX_EXECUTION_TIME=120000;

MAX_EXECUTION_TIME 의 설정값은 밀리초 단위다. 120초 뒤에 종료하도록 설정했다.

2.sleep 상태인 프로세스를 강제종료 하려면 mysql 의 설정중 interactive_timeout 을 설정하면 된다.

mysql> set global interactive_timeout=120;

interactive_timeout 은 초 단위다. 120초 뒤에 종료하도록 설정했다.

global 로 설정했으므로 확인시에도 global 로 확인해야한다.

mysql> show global variables like '%max_execution_time%';
+--------------------+--------+
| Variable_name      | Value  |
+--------------------+--------+
| max_execution_time | 120000 |
+--------------------+--------+
mysql> show global variables like '%interactive_timeout%';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 120   |
+---------------------+-------+

재시작 할 경우 설정한 값이 초기화 된다.

my.cnf 나 mysqld.cnf 와 같이 [mysqld] 설정이 있는 파일에서 재시작시에도 설정이 되도록 할 수 있다.

//my.cnf or mysqld.cnf
[mysqld]
.
.
.
max_execution_time = 120000
interactive_timeout = 120
.
.
.

이렇게 설정 시 service mysql restart 와 같이 재시작을 해도 해당 설정이 함께 설정된다.

profile
JavaScript, Node.js, Express, React, React Native, GraphQL, Apollo, Prisma, MySQL

0개의 댓글