본문 바로가기
Develop

Python3 (SQL Alchemy) - MySQL server has gone away 에러 해결

by Dork94 2020. 3. 11.

Database 서버를 교체하고 기존 코드를 돌려보니, 크롤링을 하던 도중 ERROR 2006 (HY000): MySQL server has gone away 에러가 심심찮게 발생했다.

 

그래서 해결법을 찾아보았고 잘 되는것 같아 공유한다.

 

원인으로는 DB 서버측, 클라이언트 측이 있을 수 있다.

 

  # 서버 설정

 

보통 클라이언트에서 네트워킹이 장시간 없으면 서버 측에서 설정한 설정 값에 따라 연결을 끊거나, 서버에서 지정한 버퍼 (데이터 양)을 초과하면 서버에서 RST 패킷을 보내 연결을 끊는 것 같다. 

 

대표적으로  관련된 설정 값은 아래와 같다.

connect_timeout 

max_allowed_packet 

net_buffer_length 

max_allowed_packet

wait_timeout

 

 

mysql에서 설정을 바꾸기 위해서는 db에 접속하여 아래와 같이 명령어를 입력해주면 된다 (영구적으로 바꾸기 위해서는 ini 파일을 수정하여야 함).

mysql> SET GLOBAL max_allowed_packet=64*1024*1024;

 

 

 

  # 클라이언트 설정

 

클라이언트로는 현재 파이썬의 SQL Alchemy를 이용하고 있으며, pymysql 모듈을 이용하여 접속하고 있다.

 

클라이언트에서 engine을 create할때 pool_pre_ping 옵션을 True로 추가해주면 된다.

 

아마도, 일정시간 연결이 없어도 ping (e.g., SELECT 1)을 보내서 연결을 유지하도록 하는 것 같다.

 

engine = db.create_engine('mysql+pymysql://{0}:{1}@{2}/{3}'.format(id,password,host,db_name),  pool_pre_ping=True)

 

 

댓글0