MySQL - Got timeout reading communication packets
- 문제 : 주기적으로 MySQL과의 접속이 끊어지는 현상
- 내용 확인 : MySQL error log를 확인해 보면 아래 문구가 기록되어 있음.
XXXX [Note] Aborted connection XXXXX to db: 'XXXXX' XXXXX: 'XXXXX' host: '10.10.10.10' (Got timeout reading communication packets)
- 원인 : MySQL에 접속한 이후 timeout 설정값 보다 오랫동안 요청이 없어서 강제로 접속이 끊어짐.
mysql> show global variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 28800 |
+-----------------------------+----------+
13 rows in set (0.01 sec)
- connect_timeout : MySQL 서버 접속에 접속실패를 메시지를 보내기까지 대기하는 시간
- delayed_insert_timeout : insert시 delay될 경우 대기하는 시간
- have_statement_timeout :
- innodb_flush_log_at_timeout :
- innodb_lock_wait_timeout : innodb에 transaction 처리중 lock이 걸렸을 시 롤백 될때까지 대기하는 시간
- innodb_rollback_on_timeout : innodb의 마지막 구문을 롤백시킬지 결정하는 파라미터 (timeout은 진행중인 transaction을 중단하고 전체 transaction을 롤백하는 과정에서 발생)
- interactive_timeout : 활동중인 커넥션이 닫히기 전까지 서버가 대기하는 시간
- lock_wait_timeout :
- net_read_timeout : 서버가 클라이언트로부터 데이터를 읽어들이는 것을 중단하기까지 대기하는 시간
- net_write_timeout :
- rpl_stop_slave_timeout
- slave_net_timeout : 마스터/슬레이브로 서버가 클라이언트로부터 데이터를 일겅들이는 것을 중단하기까지 대기하는 시간
- wait_timeout : 활동하지 않는 커넥션을 끊을때까지 서버가 대기하는 시간
[해결 방안]
- [어플 로직 수정] MySQL에 접속하는 세션(서버)에 reconnect 로직을 추가
- [DB 설정 수정] wait_timeout, interactive_timeout 수치를 증가
- wait_timeout, interactive_timeout 설정 정보
Property Value Command-Line Format --interactive-timeout=#
System Variable interactive_timeout
Scope Global, Session Dynamic Yes Type Integer Default Value 28800
Minimum Value 1
Property Value Command-Line Format --wait-timeout=#
System Variable wait_timeout
Scope Global, Session Dynamic Yes Type Integer Default Value 28800
Minimum Value 1
Maximum Value (Other) 31536000
Maximum Value (Windows) 2147483
- DB 설정 수정 방법 :
- [DB 재시작 필요] 아래 설정 값 추가 이후 MySQL 재시작
my.cnf 파일에 wait_timeout = [설정값]
interactive_timeout = [설정값] - [DB 재시작 필요 없음] DB 접속 후 아래 명령어 실행
my.cnf 파일에 수정 내용을 추가하지 않으면 DB 재시작 시 초기화됨. - set global session wait_timeout = [설정값]
- set global session interactive_timeout = [설정값]
댓글
댓글 쓰기