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 설정값 보다 오랫동안 요청이 없어서 강제로 접속이 끊어짐.

   [timeout 관련 정보 - MySQL 5.7기준]
   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 설정 정보
  • PropertyValue
    Command-Line Format--interactive-timeout=#
    System Variableinteractive_timeout
    ScopeGlobal, Session
    DynamicYes
    TypeInteger
    Default Value28800
    Minimum Value1
  • PropertyValue
    Command-Line Format--wait-timeout=#
    System Variablewait_timeout
    ScopeGlobal, Session
    DynamicYes
    TypeInteger
    Default Value28800
    Minimum Value1
    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 = [설정값]

댓글

가장 많이 본 글