mysql wait_timeout

army262·2021년 9월 16일
0

to many connections...

aws rds의 mysql을 기본설정으로 셋팅 후 서비스를 개방하면

위와 같은 오류를 쉽게 만날 수 있다.

물론 유저가 별로 들어오지 않으면 문제는 생기지 않겠지만(ㅠ.ㅠ 서비스가 망했어요)

유저가 어느정도 몰리면 바로 저 메세지를 볼 수 있다.

그 이유는... mysql의 wait_timeout 기본 설정값 때문이다.

아마 기본값이 8시간인것으로 기억한다.

사용되지 않는 커넥션들이 반환되어 다시 사용될 준비가 되어야하는데

저 기본값 때문에 커넥션이 최대 커넥션 수치까지

차오르게되서 문제가 생긴다.

그럼 workbench로 접속해서 바로 설정값을 확인해보자.

SHOW VARIABLES LIKE '%wait_timeout%';

이 값이 크다면 조정해 줘야 하는데 awd rds에서는 그냥 명령어로 날리면 적용이 안된다.

rds콘솔 파라메터 그룹에서 해당 값을 찾아 적용시켜주자.

수정한다고 바로 적용되는건 아니다. 적용 후 대략 10분 이상 기다려야 적용된다.

그렇다면 wait_timeout을 얼마로 수정 해야하나?

정답은 없다. 서비스 상황에 맞춰 적용해줘야하는데.. 이건

https://knight76.tistory.com/entry/30031445050

위 링크에서 확인하자.

봐도 잘 모르겠다.. 쿨럭.

일단 60~600초 사이로 조정해서 사용하고 있다.

추가 중요

저렇게 적용을해도 workbench에서 확인하니 기본값에서 변경이 안되는 경우가 있다.
구글링을 해보니 global 변수 영역을 확인해보라는 코멘트가 있었다.

SHOW GLOBAL VARIABLES LIKE '%wait_timeout%';

이 이유는

On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()). See also interactive_timeout.

https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_wait_timeout

workbench같은 클라이언트 툴에서는 interactive_timeout값 때문에 wait_timeout값이 덮어 씌어지는 것이다.

실제로 web서버에서 query를 작성해서 요청해보니 wait_timeout이 변경된 값으로 적용되어 있었다.

결론: GLOBAL변수에 적용이 되있으면 신경 안써도된다.

profile
재밌는 개발

0개의 댓글