aws rds의 mysql을 기본설정으로 셋팅 후 서비스를 개방하면
위와 같은 오류를 쉽게 만날 수 있다.
물론 유저가 별로 들어오지 않으면 문제는 생기지 않겠지만(ㅠ.ㅠ 서비스가 망했어요)
유저가 어느정도 몰리면 바로 저 메세지를 볼 수 있다.
그 이유는... mysql의 wait_timeout 기본 설정값 때문이다.
아마 기본값이 8시간인것으로 기억한다.
사용되지 않는 커넥션들이 반환되어 다시 사용될 준비가 되어야하는데
저 기본값 때문에 커넥션이 최대 커넥션 수치까지
차오르게되서 문제가 생긴다.
그럼 workbench로 접속해서 바로 설정값을 확인해보자.
SHOW VARIABLES LIKE '%wait_timeout%';
이 값이 크다면 조정해 줘야 하는데 awd rds에서는 그냥 명령어로 날리면 적용이 안된다.
rds콘솔 파라메터 그룹에서 해당 값을 찾아 적용시켜주자.
수정한다고 바로 적용되는건 아니다. 적용 후 대략 10분 이상 기다려야 적용된다.
정답은 없다. 서비스 상황에 맞춰 적용해줘야하는데.. 이건
위 링크에서 확인하자.
봐도 잘 모르겠다.. 쿨럭.
일단 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변수에 적용이 되있으면 신경 안써도된다.