본문 바로가기
DataBase

Mysql "Too many connections" / DB 접속 너무 느릴 때 임시 방편, Mysql variables 개념

by mingutistory 2022. 8. 4.
728x90

참고
https://lion-king.tistory.com/entry/MySQL-MariaDB-max-connections-Too-many-connections-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0
https://iamfreeman.tistory.com/entry/MySQL-%EC%8B%A4%ED%96%89%EC%A4%91%EC%9D%B8-%EC%BF%BC%EB%A6%AC-%ED%99%95%EC%9D%B8show-processlist-%EB%B0%8F-%EA%B0%95%EC%A0%9C%EC%A2%85%EB%A3%8Ckill-stop-%EB%B0%A9%EB%B2%95

 

MySQL 실행중인 쿼리 확인(show processlist) 및 강제종료(kill, stop) 방법

MySQL 실행중인 쿼리 확인(show processlist) 및 강제종료(kill, stop) 방법 MySQL에서 아래와 같은 Lock wait timeout exceeded. 오류가 발생하는 경우가 있죠. 그전까지는 아무런 문제가 없이 잘 수행..

iamfreeman.tistory.com

 

테스트 환경을 다시 올렸는데 이번에는 DB 접속 과정에서 `too many connections`가 떴다. 일단 다른 팀원들이 DB를 다들 써야 되니까 docker restart를 했는데도 불구하고 다시 발생했다.

 

1. 임시방편

SHOW VARIABLES LIKE "%max_connections%";
max connection이 몇 개인지 확인 할 수 있다.
기본 값은 131이다.

 

SHOW VARIABLES LIKE "%timeout%";
SHOW VARIABLES LIKE "%thread%";
SHOW STATUS LIKE "%connect%";

SHOW PROCESSLIST
해당 mysql에서 실행되고 있는 쿼리들을 확인 할 수 있다.

SET GLOBAL MAX_CONNECTIONS = 300
일단 테스트 환경이여서 max connections를 131에서 300으로 올리고 나니까 정상동작하긴 했는데 원래 정석대로라면 max connections만 올리는게 아니라 추가적인 작업들을 해줘야한다. 이 처리는 임시 방편이다.

SELECT CONCAT('KILL ',id,';') FROM information\_schema.processlist WHERE USER='root' AND TIME > 200 INTO OUTFILE '/tmp/a.txt';

source /tmp/a.txt;  

3분 정도 더 걸리고 있는 process들을 한번에 지우는 방법이다. 해당 select 문 실행 뒤 파일이 생성되면 해당 mysql이 올라가있는 서버에서 source 명령어를 통해 실행시켰다. 

 

source : 외부 파일에서 SQL문을 실행시키는 명령어

 

2. 커넥션 개수 설정

DB에서 커넥션 개수를 설정 할 수 있게 하는 방법이다.

하단 블로그 링크를 따라가서 진행했다. 설명을 자세하게 엄청 잘 해주셔서 잘 따라 할 수 있었다.

https://lion-king.tistory.com/entry/MySQL-MariaDB-max-connections-Too-many-connections-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0

 

(MySQL / MariaDB) Too many connections 해결 (max connections 오류)

Too many connections 해결 얼마전 테스트 환경(beta)에서 사용하는 DB에 연결이 계속 실패되는 현상이 발생하였습니다. "Too many connections" com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnection..

lion-king.tistory.com

show variables like XXX 

해당 블로그를 따라하고 이렇게 하면 되겠다, 해서 적용 후에 명령어를 실행해봤는데 잘 적용되지 않았다. 

 

SET GLOBAL wait_timeout = 10800;
SET GLOBAL interactive_timeout = 10800;

아무리 명령어를 때려도 show variables로 확인해봤을 때는 동일했다.
해당 부분에 대해서 검색 하다 보니 

SELECT @@global.wait_timeout, @@session.wait_timeout;

해당 쿼리를 날려보라고 하는 걸 봤고 wait_timeout 설정 값이 서로 다른 걸 확인해서 MySQL에 global, session 변수를 따로 설정 할 수 있다는 것을 알게 되었다.

global의 경우에는 전체 session 연결한 해당 세션에 대한 설정이다.


https://dev.mysql.com/doc/refman/8.0/en/show-variables.html

 

해당 문서를 참고 하면 내가 입력해 본 show variables time_out의 경우에는 session 변수 임으로 global 변수를 셋팅한 경우에 다른 값을 확인 하게 되는 것이었다.

그래서 show global time_out 을 실행하면 잘 반영 된 걸 확인 할 수 있었고 session 변수에 대해서도 값을 변경해 주었다.

300x250

댓글