본문으로 바로가기

MySql connect timed out 먹통문제

category 나의 주니어 개발 일기/DB 2022. 6. 8. 13:19
728x90
반응형
SMALL
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

 

찾은 발생 가능한 문제점

1.Mysql 의 경우 기본적으로 8시간 안에 request가 오지 않으면 강제적으로 Connection을 닫아버리기 때문에

오래 request를 안하다가 request를 하면 먹통이 되는 문제점도 있다.

db 연결시 url에 validationQuery 를 붙여줘야한다. 아래 사이트에 자세하게 설명하고 있다 참고하자.

https://engineering-skcc.github.io/cloud/tomcat/apache/performancetest/MySqlDBWaitTimeOut/

https://blog-han.tistory.com/40

 

2.db의 접속 권한문제는 아니였다.

만일 권한 문제일 경우 권한 설정을 해주자

# *.*:모든 db접근, %:모든 ip 허용
grant all privileges on *.* to 'root'@'%' identified by '1234';
# 반영
flush privileges;
#권한 확인
select host, user from user;

 

3.db max Connection을 초과한것도 아니였으며 sleep된 connection도 없었다.

 max Connection을 초과한경우, db 커넥션을 많이 시도하는 경우에서 발생

# 현재 자신의 커넥션 확인
show status where variable_name = 'Threads_connected';
# 현재 설정된 max_connetions 확인하기
show variables like 'max_connections';
# max_connetions 늘리기
set global max_connetions=1000;

sleep의 경우, db 를 사용하는 어플리케이션에서 mysql 접속을 한 뒤에 접속세션을 종료하지 않고 그냥 놔두면 발생

interactive_timeout 과 wait_timeout 의 주기를 짧게 설정해주자.

1) global 설정

mysql> set global interactive_timeout=10;

mysql> set global wait_timeout=10;
 

2) Session 설정

mysql> set interactive_timeout=10;

mysql> set wait_timeout=10;

단, 위와 같은 방법은 mysql 데몬 재시작 시 초기 값으로 돌아갑니다.

mysql 시작 시 고정된 값으로 설정하기 위해서는 아래와 같이 my.cnf 파일을 통해 설정합니다.

# vi /etc/my.cnf

[mysqld]

interactive_timeout=10

wait_timeout=10

 

나의 경우

리눅스 서버가 다운되면서 기존에 설정된 방화벽 정책도 초기화 되면서 

DB 포트의 인/아웃 바운드 정책도 같이 초기화 되어

외부에서 접속이 안되는 문제였다,

다시 정책을 설정해주고 리눅스 방화벽을 재시작 해줫더니 외부에서 접속이 가능해졌다.

#mysql 포트를 먼저 열어준다.
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
#3306에 대한 인바운드 설정
iptables -I INPUT 1 -p tcp --dport 3306 -j ACCEPT
#3306에 대한 아웃바운드 설정
iptables -I OUTPUT 1 -p tcp --dport 3306 -j ACCEPT
#방화벽 재실행
firewall-cmd --reload

 

728x90
반응형
LIST